mercredi 23 octobre 2013

Java Http Forwarder

Java Http forwarder

This java code snippet is the an implementation of an http forwarder.
This implementation is binded to the local  Ipv6 address and forward all the incoming http request to the "forward URL".


import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;

/**
 * Description
 * This classic is a basic http server which is listening on an IPV6 address. It is designed to forward request to any URL.
 *
 *
 */
public class HttpForwarder implements Runnable {

    private String listeningAddress;
    private int listeningPort;
    private String ForwardUrl;

    private boolean useHttps;

    public HttpForwarder(String listeningAddress, String listeningPort, String forwardUrl) throws Exception {

        super();
        this.listeningAddress = listeningAddress;
        if (listeningPort.startsWith("s")) {
            this.listeningPort = Integer.parseInt(listeningPort.substring(1));
            this.useHttps = true;
        } else {
            this.listeningPort = Integer.parseInt(listeningPort);
            this.useHttps = false;
        }
        this.ForwardUrl = forwardUrl;

    }

    public void run() {

        System.setProperty("java.net.preferIPv4Stack", "false");
        System.setProperty("java.net.preferIPv6Stack", "true");
        System.setProperty("java.net.preferIPv6Addresses", "true");
        try {
            InetAddress address = InetAddress.getByName(listeningAddress);
            ServerSocket serverSocket = new ServerSocket(listeningPort, 100, address);

            System.out.println("run " + listeningAddress + ":" + listeningPort + " " + ForwardUrl);
            while (true) {
                System.out.println("waiting");
                Socket clientSocket = serverSocket.accept();
                System.out.println("received");
                InputStream request = clientSocket.getInputStream();
                OutputStream response = clientSocket.getOutputStream();
                copyStream(forwardHttpRequest(request), response);
                request.close();
                response.flush();
                response.close();
            }
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {

        String forwraderIP = "fe80::9cb3:10af:447d:8aba";
        String listOfPort = "8080,s8081,8089,s13333";
        String VAServerUrl = "10.130.57.164";

        if (args.length != 3 && args.length != 0) {
            System.err
                    .println("usage HttpForwarder fe80::2c52:a37a:3be1:868a 8080,s8081,28081 http://vatest.lab.dubl.axway.int");
            System.err.println("or without parameter for the default built in values");
            System.exit(-1);
        } else if (args.length == 3) {
            forwraderIP = args[0];
            listOfPort = args[1];
            VAServerUrl = args[2];
        }
        String[] arrayOfPort = listOfPort.split(",");
        for (String port : arrayOfPort) {
            new Thread(new HttpForwarder(forwraderIP, port, VAServerUrl)).start();
        }

    }

    public InputStream forwardHttpRequest(InputStream requestToForward) throws Exception {

        Socket forwardSocket = createForwardSocket();
        copyStream(requestToForward, forwardSocket.getOutputStream());

        // get response
        InputStream responseToForward = forwardSocket.getInputStream();
        System.out.println(forwardSocket);
        return responseToForward;

    }

    public Socket createForwardSocket() throws Exception {

        Socket forwardSocket = null;
        if (useHttps) {
            SSLSocket sslSocket = null;
            XTrustProvider.install();
            SSLSocketFactory mySSLSocketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
            sslSocket = (SSLSocket) mySSLSocketFactory.createSocket(ForwardUrl, this.listeningPort);
            sslSocket.startHandshake();
            forwardSocket = sslSocket;

        } else {
            forwardSocket = new Socket(ForwardUrl, this.listeningPort);
        }
        forwardSocket.setKeepAlive(true);
        return forwardSocket;
    }

    public static void copyStream(InputStream input, OutputStream output) throws Exception {

        // wait to get the full request
        Thread.sleep(1 * 1000);

        int bytesRead;
        byte[] buffer = new byte[1024 * 10];// the buffer size may need to be changed
        System.out.println("input.available() " + input.available());
        bytesRead = input.read(buffer, 0, input.available());
        output.write(buffer, 0, bytesRead);
    }
}



Aucun commentaire:

Enregistrer un commentaire