How to get FullHttpResponse object instance

192 views
Skip to first unread message

Sandeep Modgil

unread,
Aug 31, 2016, 12:23:12 AM8/31/16
to LittleProxy
Hello 

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()) {
// String uriRemote = "http://127.0.0.1:9090" +
// ((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) {
if (url.contains("mob.com")) {
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 .

Thanks
Sandeep
Reply all
Reply to author
Forward
0 new messages