Skip to content

Instantly share code, notes, and snippets.

@vkosh
Last active September 13, 2015 17:47
Show Gist options
  • Save vkosh/f53d7dc821a86074a2cc to your computer and use it in GitHub Desktop.
Save vkosh/f53d7dc821a86074a2cc to your computer and use it in GitHub Desktop.
AsyncServer asyncServer = new AsyncServer();
AsyncHttpServer httpServer = new AsyncHttpServer();
AsyncHttpClient httpClient = new AsyncHttpClient(asyncServer);
httpServer.get(".*", new HttpServerRequestCallback() {
@Override
public void onRequest(final AsyncHttpServerRequest request, final AsyncHttpServerResponse response) {
final AsyncHttpGet proxyRequest = new AsyncHttpGet("http://remotehost/" + request.getPath());
String remoteHost = proxyRequest.getHeaders().get("Host");
proxyRequest.getHeaders().addAll(request.getHeaders());
proxyRequest.getHeaders().set("Host", remoteHost);
httpClient.executeByteBufferList(proxyRequest, new AsyncHttpClient.DownloadCallback() {
@Override
public void onCompleted(Exception e, final AsyncHttpResponse proxyResponse, ByteBufferList result) {
if (e != null) {
response.getHeaders().addAll(proxyResponse.headers());
response.code(proxyResponse.code());
response.end();
return;
}
// do some result transformations
final int contentLength = result.remaining();
final String contentType = proxyResponse.headers().get("Content-Type");
response.getHeaders().addAll(proxyResponse.headers());
response.getHeaders().set("Content-Length", Integer.toString(contentLength));
response.setContentType(contentType);
response.code(proxyResponse.code());
// XXX: this leads to 100% CPU consumption on large content (> 1 MB)
/*
response.write(result);
response.end();
*/
// XXX: this works OK
Util.writeAll(response, result, new CompletedCallback() {
@Override
public void onCompleted(Exception ex) {
response.end();
}
});
}
});
}
});
httpServer.listen(asyncServer, 0);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment