Here is my code snippet, there is not so much change from ElementalHTTPServer. I have run this on port 8090 and try to proxy tomcat doc pages running on 8080 on Tomcat 5.5
package org.apache.http.examples; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.InterruptedIOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Reader; import java.net.ServerSocket; import java.net.Socket; import java.net.URLDecoder; import org.apache.http.ConnectionClosedException; import org.apache.http.ConnectionReuseStrategy; import org.apache.http.Header; import org.apache.http.HeaderElement; import org.apache.http.HttpEntity; import org.apache.http.HttpEntityEnclosingRequest; import org.apache.http.HttpException; import org.apache.http.HttpHost; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; import org.apache.http.HttpServerConnection; import org.apache.http.HttpStatus; import org.apache.http.HttpVersion; import org.apache.http.MethodNotSupportedException; import org.apache.http.entity.BasicHttpEntity; import org.apache.http.entity.ContentProducer; import org.apache.http.entity.EntityTemplate; import org.apache.http.entity.FileEntity; import org.apache.http.impl.DefaultConnectionReuseStrategy; import org.apache.http.impl.DefaultHttpClientConnection; import org.apache.http.impl.DefaultHttpParams; import org.apache.http.impl.DefaultHttpResponseFactory; import org.apache.http.impl.DefaultHttpServerConnection; import org.apache.http.message.HttpGet; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.apache.http.params.HttpProtocolParams; import org.apache.http.protocol.BasicHttpProcessor; import org.apache.http.protocol.HTTP; import org.apache.http.protocol.HttpContext; import org.apache.http.protocol.HttpExecutionContext; import org.apache.http.protocol.HttpRequestExecutor; import org.apache.http.protocol.HttpRequestHandler; import org.apache.http.protocol.HttpRequestHandlerRegistry; import org.apache.http.protocol.HttpService; import org.apache.http.protocol.RequestConnControl; import org.apache.http.protocol.RequestContent; import org.apache.http.protocol.RequestExpectContinue; import org.apache.http.protocol.RequestTargetHost; import org.apache.http.protocol.RequestUserAgent; import org.apache.http.protocol.ResponseConnControl; import org.apache.http.protocol.ResponseContent; import org.apache.http.protocol.ResponseDate; import org.apache.http.protocol.ResponseServer; import org.apache.http.util.CharArrayBuffer; import org.apache.http.util.EntityUtils; /** * Basic, yet fully functional and spec compliant, HTTP/1.1 file server. * * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a> * * @version $Revision: 474722 $ */ public class RedirectHttpServer { public static void main(String[] args) throws Exception { if (args.length < 1) { System.err.println("Please specify document root directory"); System.exit(1); } Thread t = new RequestListenerThread(8090, args[0]); t.setDaemon(false); t.start(); } static class RedirectContentProducer implements ContentProducer{ private HttpEntity entity; public RedirectContentProducer(HttpEntity entity) { this.entity=entity; } public void writeTo(final OutputStream outstream) throws IOException { System.out.print("CONTENT LENGTH: "+entity.getContentLength()+" ||"); InputStream in=entity.getContent(); byte[] buffer = new byte[1024]; int totalread=0; int readCount = 0; while ( (readCount = in.read(buffer)) != -1) { outstream.write(buffer, 0, readCount); totalread+=readCount; } System.out.println("CONTENT WRITE "+totalread); outstream.flush(); } } static class HttpRedirectHandler implements HttpRequestHandler { private final String docRoot; public HttpRedirectHandler(final String docRoot) { super(); this.docRoot = docRoot; } private void printHTTPRequest(HttpRequest request){ System.out.println("*********BEGIN**************"); Header[] headers=request.getAllHeaders(); for(Header header:headers){ System.out.println("HEADERS:"+header.toString()); } System.out.println("*********END**************"); } private void printHTTPResponse(HttpResponse response){ System.out.println("*********BEGIN**************"); Header[] headers=response.getAllHeaders(); for(Header header:headers){ System.out.println("HEADERS:"+header.toString()); } System.out.println("*********END**************"); } public HttpResponse redirect(String address,String target) throws Exception{ HttpParams params = new DefaultHttpParams(null); HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(params, "UTF-8"); HttpProtocolParams.setUserAgent(params, "Jakarta-HttpComponents/1.1"); HttpProtocolParams.setUseExpectContinue(params, true); BasicHttpProcessor httpproc = new BasicHttpProcessor(); // Required protocol interceptors httpproc.addInterceptor(new RequestContent()); httpproc.addInterceptor(new RequestTargetHost()); // Recommended protocol interceptors httpproc.addInterceptor(new RequestConnControl()); httpproc.addInterceptor(new RequestUserAgent()); httpproc.addInterceptor(new RequestExpectContinue()); HttpRequestExecutor httpexecutor = new HttpRequestExecutor(httpproc); httpexecutor.setParams(params); HttpContext context = new HttpExecutionContext(null); HttpHost host = new HttpHost(address, 8080); context.setAttribute(HttpExecutionContext.HTTP_TARGET_HOST, host); DefaultHttpClientConnection conn = new DefaultHttpClientConnection(); ConnectionReuseStrategy connStrategy = new DefaultConnectionReuseStrategy(); try { if (!conn.isOpen()) { Socket socket = new Socket(host.getHostName(), host.getPort()); conn.bind(socket, params); } HttpGet request = new HttpGet(target); System.out.println(">> Request URI: " + request.getRequestLine().getUri()); HttpResponse response = httpexecutor.execute(request, conn, context); System.out.println("<< Response: " + response.getStatusLine()); // System.out.println(EntityUtils.toString( response.getEntity())); if (!connStrategy.keepAlive(response, context)) { System.out.println("Colosing connection..."); conn.close(); } else { System.out.println("Connection kept alive..."); } return response; } finally { conn.close(); } } public void handle( final HttpRequest request, final HttpResponse response, final HttpContext context) throws HttpException, IOException { String method = request.getRequestLine ().getMethod().toUpperCase(); if (!method.equals("GET") && !method.equals("HEAD") && !method.equals("POST")) { throw new MethodNotSupportedException(method + " method not supported"); } System.out.println(((Header[])(request.getHeaders ("HOST")))[0].getValue()); String target = request.getRequestLine().getUri(); System.out.println("TARGET="+target); if (request instanceof HttpEntityEnclosingRequest) { HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity(); byte[] entityContent = EntityUtils.toByteArray(entity); System.out.println("Incoming entity content (bytes): " + entityContent.length); } try { HttpResponse responseRedirect=redirect("localhost", target); response.setStatusCode(HttpStatus.SC_OK); EntityTemplate body = new EntityTemplate(new RedirectContentProducer(responseRedirect.getEntity())); body.setContentType(responseRedirect.getEntity ().getContentType()); body.setContentEncoding(responseRedirect.getEntity ().getContentEncoding()); response.setEntity(body); // BasicHttpEntity body= new BasicHttpEntity(); // body.setContent(responseRedirect.getEntity ().getContent()); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } static class RequestListenerThread extends Thread { private final ServerSocket serversocket; private final HttpParams params; private final String docRoot; public RequestListenerThread(int port, final String docroot) throws IOException { this.serversocket = new ServerSocket(port); this.params = new DefaultHttpParams(null); this.params .setIntParameter(HttpConnectionParams.SO_TIMEOUT, 5000) .setIntParameter(HttpConnectionParams.SOCKET_BUFFER_SIZE, 8 * 1024) .setBooleanParameter( HttpConnectionParams.STALE_CONNECTION_CHECK, false) .setBooleanParameter(HttpConnectionParams.TCP_NODELAY, true) .setParameter(HttpProtocolParams.ORIGIN_SERVER, "Jakarta-HttpComponents/1.1"); this.docRoot = docroot; } public void run() { System.out.println("Listening on port " + this.serversocket.getLocalPort()); while (!Thread.interrupted()) { try { // Set up HTTP connection Socket socket = this.serversocket.accept(); DefaultHttpServerConnection conn = new DefaultHttpServerConnection(); System.out.println("Incoming connection from " + socket.getInetAddress()); conn.bind(socket, this.params); // Set up the HTTP protocol processor BasicHttpProcessor httpproc = new BasicHttpProcessor(); httpproc.addInterceptor(new ResponseDate()); httpproc.addInterceptor(new ResponseServer()); httpproc.addInterceptor(new ResponseContent()); httpproc.addInterceptor(new ResponseConnControl()); // Set up request handlers HttpRequestHandlerRegistry reqistry = new HttpRequestHandlerRegistry(); reqistry.register("*", new HttpRedirectHandler( this.docRoot)); // Set up the HTTP service HttpService httpService = new HttpService( httpproc, new DefaultConnectionReuseStrategy(), new DefaultHttpResponseFactory()); httpService.setParams(this.params); httpService.setHandlerResolver(reqistry); // Start worker thread Thread t = new WorkerThread(httpService, conn); t.setDaemon(true); t.start(); } catch (InterruptedIOException ex) { break; } catch (IOException e) { System.err.println("I/O error initialising connection thread: " + e.getMessage()); break; } } } } static class WorkerThread extends Thread { private final HttpService httpservice; private final HttpServerConnection conn; public WorkerThread( final HttpService httpservice, final HttpServerConnection conn) { super(); this.httpservice = httpservice; this.conn = conn; } public void run() { System.out.println("New connection thread"); HttpContext context = new HttpExecutionContext(null); try { while (!Thread.interrupted() && this.conn.isOpen()) { this.httpservice.handleRequest(this.conn, context); } } catch (ConnectionClosedException ex) { System.err.println("Client closed connection"); } catch (IOException ex) { System.err.println("I/O error: " + ex.getMessage()); } catch (HttpException ex) { System.err.println("Unrecoverable HTTP protocol violation: " + ex.getMessage()); } finally { try { this.conn.shutdown(); } catch (IOException ignore) {} } } } } And here is my output: Thanks a lot. Listening on port 8090 Incoming connection from /127.0.0.1 New connection thread localhost:8090 TARGET=/tomcat-docs/index.html
Request URI: /tomcat-docs/index.html
<< Response: HTTP/1.1 200 OK Connection kept alive... CONTENT LENGTH: 12926 ||CONTENT WRITE 7984 Incoming connection from /127.0.0.1 New connection thread Incoming connection from /127.0.0.1 New connection thread localhost:8090 TARGET=/tomcat-docs/images/tomcat.gif
Request URI: /tomcat-docs/images/tomcat.gif
localhost:8090 TARGET=/tomcat-docs/images/asf-logo.gif
Request URI: /tomcat-docs/images/asf-logo.gif
<< Response: HTTP/1.1 200 OK Connection kept alive... << Response: HTTP/1.1 200 OK Connection kept alive... CONTENT LENGTH: 1934 ||CONTENT LENGTH: 7279 ||CONTENT WRITE 1934 CONTENT WRITE 7279 Incoming connection from /127.0.0.1 New connection thread localhost:8090 TARGET=/tomcat-docs/images/printer.gif
Request URI: /tomcat-docs/images/printer.gif
<< Response: HTTP/1.1 200 OK Connection kept alive... CONTENT LENGTH: 438 ||CONTENT WRITE 438
