Hi Simone,
Please consider the following case.
1. Makes two bases, one represents the server, the other represents proxy.
The proxy is using the below ProxyServlet.
public class ProxyServlet extends AsyncProxyServlet {
private static final long serialVersionUID = 7496746677269293638L;
@Override
protected HttpClient createHttpClient() throws ServletException {
ServletConfig config = getServletConfig();
// Setup SSL context for this client.
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setTrustAll(true);
HttpClient client = new HttpClient(sslContextFactory);
// Redirects must be proxied as is, not followed.
client.setFollowRedirects(false);
// Must not store cookies, otherwise cookies of different clients
will
// mix.
client.setCookieStore(new HttpCookieStore.Empty());
Executor executor;
String value = config.getInitParameter("maxThreads");
if (value == null || "-".equals(value)) {
executor = (Executor) getServletContext()
.getAttribute("org.eclipse.jetty.server.Executor");
if (executor == null)
throw new IllegalStateException("No server executor for
proxy");
} else {
QueuedThreadPool qtp = new QueuedThreadPool(
Integer.parseInt(value));
String servletName = config.getServletName();
int dot = servletName.lastIndexOf('.');
if (dot >= 0)
servletName = servletName.substring(dot + 1);
qtp.setName(servletName);
executor = qtp;
}
client.setExecutor(executor);
value = config.getInitParameter("maxConnections");
if (value == null)
value = "256";
client.setMaxConnectionsPerDestination(Integer.parseInt(value));
value = config.getInitParameter("idleTimeout");
if (value == null)
value = "30000";
client.setIdleTimeout(Long.parseLong(value));
value = config.getInitParameter("timeout");
if (value == null)
value = "60000";
setTimeout(Long.parseLong(value));
value = config.getInitParameter("requestBufferSize");
if (value != null)
client.setRequestBufferSize(Integer.parseInt(value));
value = config.getInitParameter("responseBufferSize");
if (value != null)
client.setResponseBufferSize(Integer.parseInt(value));
try {
client.start();
// Content must not be decoded, otherwise the client gets
confused.
client.getContentDecoderFactories().clear();
// No protocol handlers, pass everything to the client.
client.getProtocolHandlers().clear();
return client;
} catch (Exception x) {
throw new ServletException(x);
}
}
@Override
protected String rewriteTarget(HttpServletRequest clientRequest) {
String uri = ...;
System.out.println("uri=" + uriParam);
return uri;
}
}
2. Started the server
java -jar /path/to/start.jar jetty.http.port=8000 jetty.ssl.port=8001
...
2016-04-25 11:21:59.801:INFO:oejs.ServerConnector:main: Started
ServerConnector@1f554b06{HTTP/1.1,[http/1.1]}{0.0.0.0:8000}
...
2016-04-25 11:22:00.012:INFO:oejs.ServerConnector:main: Started
ServerConnector@105fece7{SSL,[ssl, http/1.1]}{0.0.0.0:8001}
...
3. Started the proxy
java -jar /path/to/start.jar jetty.http.port=9000 jetty.ssl.port=9001
....
2016-04-25 11:22:08.985:INFO:oejs.ServerConnector:main: Started
ServerConnector@31d55d45{HTTP/1.1,[http/1.1]}{0.0.0.0:9000}
....
2016-04-25 11:22:09.005:INFO:oejs.ServerConnector:main: Started
ServerConnector@1a7662bd{SSL,[ssl, http/1.1]}{0.0.0.0:9001}
....
4. The following is the test class,
public class JettyProxyTest {
// Accesses HTTPS without Proxy
private static void test1() throws Exception, InterruptedException,
TimeoutException, ExecutionException {
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setSslContext(someSSLContext);
HttpClient client = new HttpClient(sslContextFactory);
client.start();
String url = "https://localhost:8001/proxy";
ContentResponse response = client.newRequest(url).send();
System.out.println(response.getStatus());
client.stop();
}
// Accesses HTTP with Proxy
private static void test2() throws Exception, InterruptedException,
TimeoutException, ExecutionException {
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setSslContext(someSSLContext);
HttpClient client = new HttpClient(sslContextFactory);
client.getProxyConfiguration().getProxies().add(
new HttpProxy(new Origin.Address("localhost", 9000),
false));
client.start();
String url = "http://localhost:8000/proxy";
ContentResponse response = client.newRequest(url).send();
System.out.println(response.getStatus());
client.stop();
}
// Accesses HTTPS with Proxy
private static void test3() throws Exception, InterruptedException,
TimeoutException, ExecutionException {
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setSslContext(someSSLContext);
HttpClient client = new HttpClient(sslContextFactory);
client.getProxyConfiguration().getProxies().add(
new HttpProxy(new Origin.Address("localhost", 9000),
false));
client.start();
String url = "https://localhost:8001/proxy";
ContentResponse response = client.newRequest(url).send();
System.out.println(response.getStatus());
client.stop();
}
public static void main(String[] args) throws Exception {
test1();
test2();
test3();
}
}
The test1 and test2 works well, and test2 throw the below exception:
2016-04-25 11:29:33.232:WARN:oejh.HttpParser:HttpClient@522764626-32:
Illegal character 0xA in state=RESPONSE_VERSION for buffer
DirectByteBuffer@3805e09d[p=180,l=502,c=16384,r=322]={HTTP/1.1 404 Not
...314)\r\n\r\n<html>\n<<<<head>\n<meta
http.../body>\n</html>\n>>>\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00...\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00}
2016-04-25 11:29:33.234:WARN:oejh.HttpParser:HttpClient@522764626-32: bad
HTTP parsed: 400 Illegal character 0xA for
HttpReceiverOverHTTP@7d0769f9(rsp=IDLE,failure=null)[HttpParser{s=RESPONSE_VERSION,0
of -1}]
2016-04-25 11:29:33.235:WARN:oejh.HttpParser:HttpClient@522764626-35:
Illegal character 0xA in state=RESPONSE_VERSION for buffer
DirectByteBuffer@2c56785c[p=180,l=502,c=16384,r=322]={HTTP/1.1 404 Not
...314)\r\n\r\n<html>\n<<<<head>\n<meta
http.../body>\n</html>\n>>>\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00...\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00}
Exception in thread "main" 2016-04-25
11:29:33.236:WARN:oejh.HttpParser:HttpClient@522764626-35: bad HTTP parsed:
400 Illegal character 0xA for
HttpReceiverOverHTTP@6954e3b2(rsp=IDLE,failure=null)[HttpParser{s=RESPONSE_VERSION,0
of -1}]
java.util.concurrent.ExecutionException:
org.eclipse.jetty.client.HttpResponseException: Received
HttpResponse[HTTP/1.1 404 Not Found]@26ae132c for HttpRequest[CONNECT
localhost:8001 HTTP/1.1]@2869e989
at
org.eclipse.jetty.client.util.FutureResponseListener.getResult(FutureResponseListener.java:118)
at
org.eclipse.jetty.client.util.FutureResponseListener.get(FutureResponseListener.java:101)
at org.eclipse.jetty.client.HttpRequest.send(HttpRequest.java:653)
at JettyProxyTest.test3(JettyProxyTest.java:60)
at JettyProxyTest.main(JettyProxyTest.java:69)
Caused by: org.eclipse.jetty.client.HttpResponseException: Received
HttpResponse[HTTP/1.1 404 Not Found]@26ae132c for HttpRequest[CONNECT
localhost:8001 HTTP/1.1]@2869e989
at
org.eclipse.jetty.client.HttpProxy$HttpProxyClientConnectionFactory$ProxyPromise.lambda$tunnel$1(HttpProxy.java:171)
at
org.eclipse.jetty.client.ResponseNotifier.notifyComplete(ResponseNotifier.java:193)
at
org.eclipse.jetty.client.ResponseNotifier.notifyComplete(ResponseNotifier.java:185)
at
org.eclipse.jetty.client.HttpReceiver.terminateResponse(HttpReceiver.java:456)
at
org.eclipse.jetty.client.HttpReceiver.responseSuccess(HttpReceiver.java:403)
at
org.eclipse.jetty.client.http.HttpReceiverOverHTTP.messageComplete(HttpReceiverOverHTTP.java:268)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:1277)
at
org.eclipse.jetty.client.http.HttpReceiverOverHTTP.parse(HttpReceiverOverHTTP.java:158)
at
org.eclipse.jetty.client.http.HttpReceiverOverHTTP.process(HttpReceiverOverHTTP.java:119)
at
org.eclipse.jetty.client.http.HttpReceiverOverHTTP.receive(HttpReceiverOverHTTP.java:69)
at
org.eclipse.jetty.client.http.HttpChannelOverHTTP.receive(HttpChannelOverHTTP.java:90)
at
org.eclipse.jetty.client.http.HttpConnectionOverHTTP.onFillable(HttpConnectionOverHTTP.java:114)
at
org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:273)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
at
org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93)
at
org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:246)
at
org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:156)
at
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)
at
org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)
at java.lang.Thread.run(Thread.java:745)
Thanks!
On Fri, Apr 22, 2016 at 9:53 PM, Simone Bordet <[email protected]> wrote:
> Hi,
>
> On Fri, Apr 22, 2016 at 3:48 PM, Mark Wang <[email protected]> wrote:
> > Sorry for the confusion.
> > Really, I'm using the server's host and port.
>
> Well, then you are getting a 404, which means that you are not
> translating your URLs right.
>
> --
> Simone Bordet
> ----
> http://cometd.org
> http://webtide.com
> Developer advice, training, services and support
> from the Jetty & CometD experts.
> _______________________________________________
> jetty-users mailing list
> [email protected]
> To change your delivery options, retrieve your password, or unsubscribe
> from this list, visit
> https://dev.eclipse.org/mailman/listinfo/jetty-users
>
_______________________________________________
jetty-users mailing list
[email protected]
To change your delivery options, retrieve your password, or unsubscribe from
this list, visit
https://dev.eclipse.org/mailman/listinfo/jetty-users