下面列出了怎么用org.eclipse.jetty.http.HttpURI的API类实例代码及写法,或者点击链接到github查看源代码。
private Map<String, String> getRedirectParameters(final String redirectLocation)
{
final MultiMap<String> parameterMap = new MultiMap<>();
HttpURI httpURI = new HttpURI(redirectLocation);
httpURI.decodeQueryTo(parameterMap);
Map<String,String> parameters = new HashMap<>(parameterMap.size());
for (Map.Entry<String, List<String>> paramEntry : parameterMap.entrySet())
{
assertEquals(String.format("param '%s' specified more than once", paramEntry.getKey()),
(long) 1,
(long) paramEntry.getValue().size());
parameters.put(paramEntry.getKey(), paramEntry.getValue().get(0));
}
return parameters;
}
private static MetaData.Request toRequestMetadata(ServiceRequestContext ctx, AggregatedHttpRequest aReq) {
// Construct the HttpURI
final StringBuilder uriBuf = new StringBuilder();
final RequestHeaders aHeaders = aReq.headers();
uriBuf.append(ctx.sessionProtocol().isTls() ? "https" : "http");
uriBuf.append("://");
uriBuf.append(aHeaders.authority());
uriBuf.append(aHeaders.path());
final HttpURI uri = new HttpURI(uriBuf.toString());
uri.setPath(ctx.mappedPath());
// Convert HttpHeaders to HttpFields
final HttpFields jHeaders = new HttpFields(aHeaders.size());
aHeaders.forEach(e -> {
final AsciiString key = e.getKey();
if (!key.isEmpty() && key.byteAt(0) != ':') {
jHeaders.add(key.toString(), e.getValue());
}
});
return new MetaData.Request(aHeaders.get(HttpHeaderNames.METHOD), uri,
HttpVersion.HTTP_1_1, jHeaders, aReq.content().length());
}
/**
* Fire one request at the security handler (and by extension to the AuthServlet behind it).
*
* @param path The path to hit.
* @param request The request object to use.
* @param response The response object to use. Must be created by Mockito.mock()
* @return Any data written to response.getWriter()
* @throws IOException
* @throws ServletException
*/
private String runRequest(String path, Request request, Response response)
throws IOException, ServletException {
//request.setMethod(/*HttpMethod.GET,*/ "GET");
HttpURI uri =new HttpURI("http", SERVER_NAME,9999, path);
HttpFields httpf = new HttpFields();
MetaData.Request metadata = new MetaData.Request("GET", uri, HttpVersion.HTTP_2, httpf);
request.setMetaData(metadata);
// request.setServerName(SERVER_NAME);
// request.setAuthority(SERVER_NAME,9999);
//// request.setPathInfo(path);
//// request.setURIPathQuery(path);
request.setDispatcherType(DispatcherType.REQUEST);
doReturn(response).when(request).getResponse();
ByteArrayOutputStream output = new ByteArrayOutputStream();
try (PrintWriter writer = new PrintWriter(output)) {
when(response.getWriter()).thenReturn(writer);
securityHandler.handle(path, request, request, response);
}
return new String(output.toByteArray());
}
private String runRequest2(String path, Request request, Response response)
throws IOException, ServletException {
//request.setMethod(/*HttpMethod.GET,*/ "GET");
HttpURI uri =new HttpURI("http", SERVER_NAME,9999, path);
HttpFields httpf = new HttpFields();
MetaData.Request metadata = new MetaData.Request("GET", uri, HttpVersion.HTTP_2, httpf);
// request.setMetaData(metadata);
// request.setServerName(SERVER_NAME);
// request.setAuthority(SERVER_NAME,9999);
//// request.setPathInfo(path);
//// request.setURIPathQuery(path);
request.setDispatcherType(DispatcherType.REQUEST);
doReturn(response).when(request).getResponse();
ByteArrayOutputStream output = new ByteArrayOutputStream();
try (PrintWriter writer = new PrintWriter(output)) {
when(response.getWriter()).thenReturn(writer);
securityHandler.handle(path, request, request, response);
}
return new String(output.toByteArray());
}
public void testUserRequired_NoUser() throws Exception {
String path = "/user/blah";
Request request = spy(new Request(null, null));
//request.setServerPort(9999);
HttpURI uri =new HttpURI("http", SERVER_NAME,9999, path);
HttpFields httpf = new HttpFields();
MetaData.Request metadata = new MetaData.Request("GET", uri, HttpVersion.HTTP_2, httpf);
request.setMetaData(metadata);
// request.setAuthority(SERVER_NAME,9999);
Response response = mock(Response.class);
String output = runRequest(path, request, response);
// Verify that the servlet never was run (there is no output).
assertEquals("", output);
// Verify that the request was redirected to the login url.
String loginUrl = UserServiceFactory.getUserService()
.createLoginURL(String.format("http://%s%s", SERVER_NAME + ":9999", path));
verify(response).sendRedirect(loginUrl);
}
public void testUserRequired_PreserveQueryParams() throws Exception {
String path = "/user/blah";
Request request = new Request(null, null);
// request.setServerPort(9999);
HttpURI uri =new HttpURI("http", SERVER_NAME,9999, path,"foo=baqr","foo=bar","foo=barff");
HttpFields httpf = new HttpFields();
MetaData.Request metadata = new MetaData.Request("GET", uri, HttpVersion.HTTP_2, httpf);
request.setMetaData(metadata);
MultiMap<String> queryParameters = new MultiMap<> ();
queryParameters.add("ffo", "bar");
request.setQueryParameters(queryParameters);
request = spy(request);
/// request.setAuthority(SERVER_NAME,9999);
request.setQueryString("foo=bar");
Response response = mock(Response.class);
String output = runRequest2(path, request, response);
// Verify that the servlet never was run (there is no output).
assertEquals("", output);
// Verify that the request was redirected to the login url.
String loginUrl = UserServiceFactory.getUserService()
.createLoginURL(String.format("http://%s%s?foo=bar", SERVER_NAME + ":9999", path));
verify(response).sendRedirect(loginUrl);
}
public void testAdminRequired_NoUser() throws Exception {
String path = "/admin/blah";
Request request = spy(new Request(null, null));
//request.setServerPort(9999);
HttpURI uri =new HttpURI("http", SERVER_NAME,9999, path);
HttpFields httpf = new HttpFields();
MetaData.Request metadata = new MetaData.Request("GET", uri, HttpVersion.HTTP_2, httpf);
request.setMetaData(metadata);
// request.setAuthority(SERVER_NAME,9999);
Response response = mock(Response.class);
String output = runRequest(path, request, response);
// Verify that the servlet never was run (there is no output).
assertEquals("", output);
// Verify that the request was redirected to the login url.
String loginUrl = UserServiceFactory.getUserService()
.createLoginURL(String.format("http://%s%s", SERVER_NAME + ":9999", path));
verify(response).sendRedirect(loginUrl);
}
public Stream createStream(Session session, HttpURI uri, Stream.Listener listener) throws Exception {
HttpFields requestFields = new HttpFields();
requestFields.put(USER_AGENT, USER_AGENT_VERSION);
MetaData.Request request = new MetaData.Request("GET", uri, HttpVersion.HTTP_2, requestFields);
HeadersFrame headersFrame = new HeadersFrame(request, null, false);
FuturePromise<Stream> streamPromise = new FuturePromise<>();
session.newStream(headersFrame, streamPromise, listener);
return streamPromise.get();
}
public RemoteURLProxyServlet(URL url, boolean failEarlyOn404) {
try {
this.url = new HttpURI(url.toURI());
this.failEarlyOn404 = failEarlyOn404;
} catch (URISyntaxException e) {
//should be well formed
throw new RuntimeException(e);
}
}
private Filter createInitThreadBoundValuesFilter() {
return new Filter() {
@Override
public void init(FilterConfig filterConfig) {
//not implemented
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpURI httpURI;
String requestUrl;
if (servletRequest instanceof Request) {
httpURI = ((Request) servletRequest).getHttpURI();
requestUrl = ((Request) servletRequest).getRequestURL().toString();
} else {
HttpServletRequest httpservletRequest = (HttpServletRequest) servletRequest;
requestUrl = httpservletRequest.getRequestURL().toString();
Request request = Request.getBaseRequest(((HttpServletRequestWrapper) httpservletRequest).getRequest());
httpURI = request.getHttpURI();
}
URL requestURL = URI.create(requestUrl).toURL();
String currentResourceURI = httpURI.getPathQuery();
ThreadContext.put("currentResourceURI", currentResourceURI);
ThreadContext.put("currentURLProtocol", requestURL.getProtocol());
ThreadContext.put("currentURLHost", requestURL.getHost());
ThreadContext.put("currentURLPort", requestURL.getPort());
filterChain.doFilter(servletRequest, servletResponse);
ThreadContext.remove();
}
@Override
public void destroy() {
//not implemented
}
};
}
private static Map<String, List<String>> getUriQueryParameters(URI uri) {
MultiMap<String> queryParameters = new MultiMap<>();
new HttpURI(uri).decodeQueryTo(queryParameters);
// Do a deep copy so we do not leak Jetty classes outside
Map<String, List<String>> deepCopiedQueryParameters = new HashMap<>();
for (Map.Entry<String, List<String>> entry : queryParameters.entrySet()) {
deepCopiedQueryParameters.put(entry.getKey(), new ArrayList<>(entry.getValue()));
}
return deepCopiedQueryParameters;
}
private Request testRequest(String scheme, int responseCode, String httpMethod, String path) throws Exception {
HttpChannel channel = new HttpChannel(connector, new HttpConfiguration(), null, new DummyTransport());
MetaData.Request metaData = new MetaData.Request(httpMethod, new HttpURI(scheme + "://" + path), HttpVersion.HTTP_1_1, new HttpFields());
Request req = channel.getRequest();
req.setMetaData(metaData);
this.httpResponseCode = responseCode;
channel.handle();
return req;
}
private void handleRequest(ParameterList requestParameter, String target, HttpServletResponse response, Request baseRequest) throws IOException, OpenIdAttackerServerException, TransformerException {
// get the openIdProcessor.mode
final String method = baseRequest.getMethod();
final HttpURI uri = baseRequest.getUri();
final String protocol = baseRequest.getProtocol();
final String info = String.format("%s %s %s", method, uri, protocol);
final String mode = requestParameter.hasParameter("openid.mode")
? requestParameter.getParameterValue("openid.mode") : null;
if (uri.getCompletePath().equals("/favicon.ico")) {
handleFaviconRequest(info, response);
} else if (target.contains("xxe")) {
// Case: XXE
handleXxeRequest(info, response, requestParameter);
} /*else if (target.contains("dtd")) {
// Case: DTD
handleDtdRequest(info, response, requestParameter);
}*/ else if (mode == null) {
if (target.contains("xrds") || requestParameter.toString().contains("xrds")) {
// Case: Request XRDS Document
handleXrdsRequest(info, response);
} else {
// Case: Request HTML Document
handleHtmlDiscovery(info, response);
}
} else if ("associate".equals(mode)) {
// Case: Process Association
handleAssociationRequest(info, response, requestParameter);
} else if ("checkid_setup".equals(mode) || "checkid_immediate".equals(mode)) {
// Case: Generate Token
handleTokenRequest(info, response, requestParameter);
} else if ("check_authentication".equals(mode)) {
handleCheckAuthentication(info, response, requestParameter);
} else {
throw new IllegalStateException("Unknown Request");
}
baseRequest.setHandled(true);
}
@Before
public void setUp() throws Exception {
initMocks(this);
jetty9Request = new Jetty9Request(request);
when(request.getHttpURI()).thenReturn(new HttpURI("foo/bar/baz"));
when(request.getRootURL()).thenReturn(new StringBuilder("http://junk/"));
}
@Test
public void shouldSetRequestUri() {
HttpURI requestUri = new HttpURI("foo/bar/baz");
when(request.getHttpURI()).thenReturn(requestUri);
jetty9Request.setRequestURI("foo/junk?a=b&c=d");
assertThat(requestUri.getPath(), is("foo/junk?a=b&c=d"));
}
private void decodeToHttp(HpackDecoder decoder) throws Exception {
if ((super.flags & FLAG_EXTRA) > 0) {
return;
}
if (decoder == null) {
return;
}
ByteBuffer in = ByteBuffer.allocate(65535);
in.put(super.payload);
in.flip();
if ((super.flags & FLAG_PRIORITY) > 0) {
priority = true;
dependency = in.getInt() & 0x7fffffff;
weight = in.get();
}
MetaData meta = decoder.decode(in);
isGRPC2ndResponseHeader = false;
if (meta instanceof Request) {
//System.out.println("# meta.request: " + meta);
bRequest = true;
Request req = (Request)meta;
method = req.getMethod();
version = req.getHttpVersion();
uriString = req.getURIString();
HttpURI uri = req.getURI();
scheme = uri.getScheme();
authority = uri.getAuthority();
path = uri.getPath();
query = uri.getQuery();
} else if (meta instanceof Response) {
//System.out.println("# meta.response: " + meta);
bResponse = true;
Response res = (Response)meta;
status = res.getStatus();
} else {
//gRPC Trailer Frame
bTrailer = true;
}
fields = meta.getFields();
if(bTrailer){
for(HttpField i:fields){
if(i.getName().contains("grpc-status")){
isGRPC2ndResponseHeader = true;
break;
}
}
}
ByteArrayOutputStream buf = new ByteArrayOutputStream();
if (bRequest) {
String queryStr = (query != null && query.length() > 0) ? "?" + query : "";
//String fragmentStr = (fragment != null && fragment.length() > 0) ? "#"+fragment : "";
String statusLine = String.format("%s %s%s HTTP/2\r\n", method, path, queryStr);
buf.write(statusLine.getBytes());
} else {
buf.write(String.format("HTTP/2 %d %s\r\n", status, HttpStatus.getMessage(status)).getBytes());
}
for (HttpField field: fields) {
buf.write(String.format("%s: %s\r\n", field.getName(), field.getValue()).getBytes());
}
if(!isGRPC2ndResponseHeader) {
if (bRequest) {
buf.write(String.format("X-PacketProxy-HTTP2-Host: %s\r\n", authority).getBytes());
}
if (priority) {
buf.write(String.format("X-PacketProxy-HTTP2-Dependency: %d\r\n", dependency).getBytes());
buf.write(String.format("X-PacketProxy-HTTP2-Weight: %d\r\n", weight & 0xff).getBytes());
}
buf.write(String.format("X-PacketProxy-HTTP2-Stream-Id: %d\r\n", streamId).getBytes());
buf.write(String.format("X-PacketProxy-HTTP2-Flags: %d\r\n", flags).getBytes());
buf.write(String.format("X-PacketProxy-HTTP2-UUID: %s\r\n", StringUtils.randomUUID()).getBytes());
}
buf.write("\r\n".getBytes());
saveExtra(buf.toByteArray());
}
public EchoServiceClient(String host, int port, KeyStore keyStore, String keyStorePassword) {
super(host, port, keyStore, keyStorePassword);
this.objectMapper = new ObjectMapper();
this.echoServiceURI = new HttpURI("https://" + host + ":" + port + "/stream/echo");
}
public SystemInfoServiceClient(String host, int port, KeyStore keyStore, String keyStorePassword) {
super(host, port, keyStore, keyStorePassword);
this.getSystemInfoURI = new HttpURI("https://" + host + ":" + port + "/data/system/info");
}
@Override
protected HttpURI proxyHttpURI(final String scheme, final String serverName, int serverPort, final String uri) throws MalformedURLException {
return url;
}
public static void main(String[] args) throws Exception {
long startTime = System.nanoTime();
// Create and start HTTP2Client.
HTTP2Client client = new HTTP2Client();
SslContextFactory sslContextFactory = new SslContextFactory(true);
client.addBean(sslContextFactory);
client.start();
// Connect to host.
String host = "localhost";
int port = 8443;
FuturePromise<Session> sessionPromise = new FuturePromise<>();
client.connect(sslContextFactory, new InetSocketAddress(host, port), new ServerSessionListener.Adapter(), sessionPromise);
// Obtain the client Session object.
Session session = sessionPromise.get(5, TimeUnit.SECONDS);
// Prepare the HTTP request headers.
HttpFields requestFields = new HttpFields();
requestFields.put("User-Agent", client.getClass().getName() + "/" + Jetty.VERSION);
// Prepare the HTTP request object.
MetaData.Request request = new MetaData.Request("GET", new HttpURI("https://" + host + ":" + port + "/"), HttpVersion.HTTP_2, requestFields);
// Create the HTTP/2 HEADERS frame representing the HTTP request.
HeadersFrame headersFrame = new HeadersFrame(request, null, true);
// Prepare the listener to receive the HTTP response frames.
Stream.Listener responseListener = new Stream.Listener.Adapter()
{
@Override
public void onData(Stream stream, DataFrame frame, Callback callback)
{
byte[] bytes = new byte[frame.getData().remaining()];
frame.getData().get(bytes);
int duration = (int) TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - startTime);
System.out.println("After " + duration + " seconds: " + new String(bytes));
callback.succeeded();
}
};
session.newStream(headersFrame, new FuturePromise<>(), responseListener);
session.newStream(headersFrame, new FuturePromise<>(), responseListener);
session.newStream(headersFrame, new FuturePromise<>(), responseListener);
Thread.sleep(TimeUnit.SECONDS.toMillis(20));
client.stop();
}