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

Reply via email to