I am using littleproxy-mitm to proxy requests in java to remote servers, yet I am getting an empty response from curl when trying to make a request through the proxy, regardless if it is http or https:
curl: (52) Empty reply from server
curl: (56) Proxy CONNECT aborted
My code:
HttpProxyServer server =
DefaultHttpProxyServer.bootstrap()
.withPort(PORT)
.withManInTheMiddle(new CertificateSniffingMitmManager())
.withFiltersSource(new HttpFiltersSourceAdapter() {
public HttpFilters filterRequest(HttpRequest originalRequest, ChannelHandlerContext context) {
System.out.println("-----------------------------------------------------");
HttpMethod method = originalRequest.getMethod();
String originalUri = originalRequest.getUri();
System.out.println("CLIENT " + method + " -> " + originalUri);
originalRequest.headers().forEach(entry -> {
System.out.println("-- " + entry.getKey() + ":" + entry.getValue());
});
if (HttpMethod.CONNECT.equals(method) && Objects.nonNull(context) && originalUri.endsWith(":443")) {
String url = "https://" + originalUri.replaceFirst(":443$", "");
context.channel().attr(CONNECTED_URL).set(url);
System.out.println("URL: " + context.channel().attr(CONNECTED_URL).get());
System.out.println("(Manipulating connection request for successful HTTPS: " + originalUri + " -> " + url + ")");
return new HttpFiltersAdapter(originalRequest, context);
}
return new HttpFiltersAdapter(originalRequest) {
@Override
public HttpResponse clientToProxyRequest(HttpObject httpObject) {
if (httpObject instanceof LastHttpContent) {
LastHttpContent copy = ((LastHttpContent) httpObject).copy();
String body = copy.content().toString(StandardCharsets.UTF_8);
System.out.println("-- Content:" + body);
}
return null;
}
@Override
public HttpObject serverToProxyResponse(HttpObject httpObject) {
System.out.println("Server Response");
if (httpObject instanceof HttpResponse) {
HttpResponse response = (HttpResponse) httpObject;
System.out.println("SERVER RESPONSE");
response.headers().forEach(entry -> {
System.out.println("-- " + entry.getKey() + ":" + entry.getValue());
});
}
return httpObject;
}
};
}
})
.start();