I am trying the following code and i need to get fullhttpresponse so that i can see the content of the web page i am hitting using proxy.
package hello;
import static io.netty.buffer.Unpooled.buffer;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.DefaultFullHttpResponse;
import io.netty.handler.codec.http.DefaultHttpContent;
import io.netty.handler.codec.http.DefaultHttpResponse;
import io.netty.handler.codec.http.FullHttpResponse;
import io.netty.handler.codec.http.HttpContent;
import io.netty.handler.codec.http.HttpHeaders;
import io.netty.handler.codec.http.HttpMessage;
import io.netty.handler.codec.http.HttpObject;
import io.netty.handler.codec.http.HttpRequest;
import io.netty.handler.codec.http.HttpResponse;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.handler.codec.http.HttpVersion;
import io.netty.handler.codec.http.LastHttpContent;
import io.netty.util.CharsetUtil;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.junit.After;
import org.junit.Before;
import org.littleshoot.proxy.HttpFilters;
import org.littleshoot.proxy.HttpFiltersAdapter;
import org.littleshoot.proxy.HttpFiltersSourceAdapter;
import org.littleshoot.proxy.HttpProxyServer;
import org.littleshoot.proxy.extras.SelfSignedMitmManager;
import org.littleshoot.proxy.impl.DefaultHttpProxyServer;
/**
* Simple proxy example -- changes MOB to MOD in responses
*
* @author Bruno Candido Volpato da Cunha
*
*/
public class SimpleProxy {
public static void main(String[] args) {
HttpProxyServer server = DefaultHttpProxyServer.bootstrap().withPort(9090).withAllowLocalOnly(false)
.withManInTheMiddle(new SelfSignedMitmManager()).withFiltersSource(new HttpFiltersSourceAdapter() {
@Override
public HttpFilters filterRequest(HttpRequest originalRequest) {
System.out.println("Filter " + originalRequest.getUri());
HttpFilters filter = new HttpFiltersAdapter(originalRequest) {
public HttpResponse requestPre(HttpObject httpObject) {
if (!doFilter(originalRequest.getUri())) {
return null;
}
if (httpObject instanceof HttpRequest) {
HttpRequest httpRequest = (HttpRequest) httpObject;
if (httpRequest.headers().contains("Accept-Encoding")) {
httpRequest.headers().remove("Accept-Encoding");
}
}
return null;
}
@Override
public HttpResponse clientToProxyRequest(HttpObject httpObject) {
HttpResponse response = null;
if (httpObject instanceof HttpRequest) {
HttpRequest httpRequest = (HttpRequest) httpObject;
// if
// (REQUEST_TARGET_ORIGIN_FORM_PREFIX.matcher(((io.netty.handler.codec.http.HttpRequest)
// httpRequest).getUri()).lookingAt()) {
// ((io.netty.handler.codec.http.HttpRequest)
// httpRequest).getUri();
String uriRemote = httpRequest.getUri();
// ((FullHttpRequest)
// httpRequest).setUri(uriRemote);
httpRequest.setUri(uriRemote);
System.out.println(httpRequest.toString());
System.out.println(httpRequest.getDecoderResult().toString());
System.out.println(httpRequest.headers());
ByteBuf buffer = null;
HttpMessage message = (HttpMessage) httpObject;
try {
buffer = Unpooled.wrappedBuffer(httpRequest.toString().getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(buffer.copy());
System.out.println(buffer.array().clone());
/*
* for(int index
* =0;index<buffer.array().length;index++){
* //System.out.println(buffer.getChar(index));
* System.out.println(buffer.nioBuffer().compact().
* get(index)); }
*/
response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, buffer);
HttpHeaders.setContentLength(response, buffer.readableBytes());
HttpHeaders.setTransferEncodingChunked(message);
HttpHeaders.setHeader(response, HttpHeaders.Names.CONTENT_TYPE, "text/html");
System.out.println(response.toString());
System.out.println("************************XXXXXXXXXXXXXX**********************");
// }
}
if (httpObject instanceof HttpContent) {
System.out
.println((((HttpContent) httpObject).content().toString(Charset.forName("UTF-8"))));
}
if (httpObject instanceof DefaultFullHttpResponse) {
if (httpObject instanceof DefaultFullHttpResponse) {
DefaultFullHttpResponse resp = (DefaultFullHttpResponse) httpObject;
System.out.println("hhtp reesp1");
//modifying the responsxe: adding a script to the response for collecting javacsript errors
String response1 = resp.content().toString(CharsetUtil.UTF_8);
String errorScript = "\n<script>" + "window.webdriver_javascript_errors = [];\n" +
"window.onerror = function(errorMsg, url, lineNumber) {\n" +
" window.webdriver_javascript_errors.push(\n" +
" errorMsg +' (found at ' + url + ', line ' + lineNumber + ')');\n" +
"};" + "</script>\n";
Pattern pattern = Pattern.compile("<head>");
Matcher matcher = pattern.matcher(response1);
int index = -1;
if (matcher.find()) {
index = matcher.start() + "<head>".length();
}
StringBuilder sb = new StringBuilder(response1);
sb.insert(index,errorScript);
ByteBuf contentNew = buffer(1024);
contentNew.writeBytes(sb.toString().getBytes(CharsetUtil.UTF_8));
DefaultFullHttpResponse resp2 = new DefaultFullHttpResponse(resp.getProtocolVersion(),resp.getStatus(),contentNew);
return resp2;
}
}
return null;
}
@Override
public HttpResponse proxyToServerRequest(HttpObject httpObject) {
return null;
}
@Override
public void proxyToServerRequestSending() {
}
@Override
public void proxyToServerRequestSent() {
}
@Override
public HttpObject serverToProxyResponse(HttpObject httpObject) {
return httpObject;
}
private HttpContent proxiedContent(HttpContent response) {
String text = response.content().toString(Charset.defaultCharset());
ProxiedValueVO proxyVO = doProxyValue(originalRequest.getUri(), text);
System.out.println("Returning content... Changed? " + proxyVO.isChanged());
if (proxyVO.isChanged()) {
ByteBuf contentNew = buffer(1024);
contentNew.writeBytes(proxyVO.getText().getBytes());
System.out.println("[changed] " + proxyVO.getText());
HttpContent newResponse = response.copy();
if (newResponse instanceof DefaultFullHttpResponse) {
DefaultFullHttpResponse fullResponse = (DefaultFullHttpResponse) newResponse;
fullResponse.headers().set("Content-Length", proxyVO.getText().length());
}
newResponse.content().clear().writeBytes(contentNew);
return newResponse;
}
return response;
}
};
return filter;
}
@Override
public int getMaximumRequestBufferSizeInBytes() {
return Integer.MAX_VALUE;
};
@Override
public int getMaximumResponseBufferSizeInBytes() {
return Integer.MAX_VALUE;
};
public HttpObject responsePre(HttpObject httpObject) {
if (httpObject instanceof HttpResponse) {
if (httpObject instanceof DefaultFullHttpResponse) {
DefaultFullHttpResponse resp = (DefaultFullHttpResponse) httpObject;
System.out.println("hhtp reesp1");
//modifying the responsxe: adding a script to the response for collecting javacsript errors
String response = resp.content().toString(CharsetUtil.UTF_8);
String errorScript = "\n<script>" + "window.webdriver_javascript_errors = [];\n" +
"window.onerror = function(errorMsg, url, lineNumber) {\n" +
" window.webdriver_javascript_errors.push(\n" +
" errorMsg +' (found at ' + url + ', line ' + lineNumber + ')');\n" +
"};" + "</script>\n";
Pattern pattern = Pattern.compile("<head>");
Matcher matcher = pattern.matcher(response);
int index = -1;
if (matcher.find()) {
index = matcher.start() + "<head>".length();
}
StringBuilder sb = new StringBuilder(response);
sb.insert(index,errorScript);
ByteBuf contentNew = buffer(1024);
contentNew.writeBytes(sb.toString().getBytes(CharsetUtil.UTF_8));
DefaultFullHttpResponse resp2 = new DefaultFullHttpResponse(resp.getProtocolVersion(),resp.getStatus(),contentNew);
return resp2;
}
return null;
}
if (httpObject instanceof HttpResponse) {
if (httpObject instanceof DefaultHttpContent) {
DefaultHttpContent resp3 = (DefaultHttpContent) httpObject;
System.out.println("response default content ---------");
System.out.println(resp3.content().toString(CharsetUtil.UTF_8));
}
if (httpObject instanceof LastHttpContent) {
LastHttpContent resp3 = (LastHttpContent) httpObject;
System.out.println("response last content---------");
System.out.println(resp3.content().toString(CharsetUtil.UTF_8));
}
if (httpObject instanceof DefaultHttpResponse) {
DefaultHttpResponse resp3 = (DefaultHttpResponse) httpObject;
System.out.println("default response---------");
System.out.println(resp3);
}
if (httpObject instanceof HttpContent) {
HttpContent resp3 = (HttpContent) httpObject;
System.out.println("default content---------");
System.out.println(resp3.content().toString(CharsetUtil.UTF_8));
}
}
return httpObject;
};
}).start();
}
private static ProxiedValueVO doProxyValue(String url, String text) {
String oldText = text.intern();
ProxiedValueVO vo = new ProxiedValueVO();
text = fromTo(text, "MOB", "MOD");
vo.setChanged(!text.equals(oldText));
vo.setText(text);
return vo;
}
private static String fromTo(String text, String from, String to) {
if (text.contains(from)) {
text = text.replace(from, to);
}
return text;
}
private static boolean doFilter(String url) {
System.out.println("Filter --> " + url);
return true;
}
return false;
}
}
class ProxiedValueVO {
private String text;
private boolean changed;
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public boolean isChanged() {
return changed;
}
public void setChanged(boolean changed) {
this.changed = changed;
}
}
Can someone suggest me what i am missing here .