package aQute.http.testservers;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import fi.iki.elonen.NanoHTTPD;
import fi.iki.elonen.NanoHTTPD.Response.IStatus;
public class DebugProxy extends NanoHTTPD {
private URL forward;
public DebugProxy(int port, URL uri) {
super(port);
this.forward = uri;
}
@Override
public synchronized Response serve(IHTTPSession session) {
try {
System.out.println(session);
URL uri = new URL(forward + session.getUri());
final HttpURLConnection c = (HttpURLConnection) uri.openConnection();
c.setRequestMethod(session.getMethod().toString());
System.out.println("-> " + session.getMethod() + " " + session.getUri());
for (Entry<String,String> e : session.getHeaders().entrySet()) {
if (e.getKey().equalsIgnoreCase("host")) {
String host = forward.getHost();
if (forward.getPort() != forward.getDefaultPort())
host += ":" + forward.getPort();
c.setRequestProperty("host", host);
} else if (!e.getKey().equals("accept-encoding"))
c.setRequestProperty(e.getKey(), e.getValue());
System.out.println("-> " + e.getKey() + "=" + e.getValue());
}
byte[] data = null;
Map<String,String> headers = session.getHeaders();
if (headers.containsKey("content-length")) {
int length = Integer.parseInt(headers.get("content-length"));
data = new byte[length];
DataInputStream din = new DataInputStream(session.getInputStream());
din.readFully(data);
c.setDoOutput(true);
c.getOutputStream().write(data);
c.getOutputStream().flush();
}
c.connect();
IStatus status = new IStatus() {
@Override
public String getDescription() {
try {
return c.getResponseMessage();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Override
public int getRequestStatus() {
try {
return c.getResponseCode();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
}
}
};
System.out.println("== " + c.getResponseCode() + " : " + c.getResponseMessage());
InputStream in = null;
if (c.getContentLength() > 0) {
data = new byte[c.getContentLength()];
DataInputStream din = new DataInputStream(c.getInputStream());
din.readFully(data);
String s = new String(data);
// System.out.println("--------------------\n");
// System.out.println(s);
// System.out.println("--------------------\n");
in = new ByteArrayInputStream(data);
}
Response r = new Response(status, c.getContentType(), in, c.getContentLengthLong()) {
{
for (Map.Entry<String,List<String>> l : c.getHeaderFields().entrySet()) {
for (String value : l.getValue()) {
if (l.getKey() != null)
addHeader(l.getKey(), value);
System.out.println("<- " + l.getKey() + "=" + value);
}
}
}
};
return r;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
}
}
public static void main(String args[]) throws Exception {
DebugProxy dp = new DebugProxy(9999, new URL("http://localhost:8081"));
dp.start();
Thread.sleep(1000000);
}
}