Frizz1977
Frizz1977

Reputation: 1167

How Create Your Proxy Server Using Google App Engine in Java?

I'm trying to hava a simple Proxy server written in java on Google engine app

the servlet is :

import java.io.*;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
import java.util.List;
import java.util.logging.*;

import javax.servlet.*;
import javax.servlet.http.*;

import java.net.URL;
import java.net.HttpURLConnection;

public class ProxyServlet extends HttpServlet {

    private ServletContext servletContext;
    private Logger log;

    public void init(ServletConfig servletConfig) throws ServletException {
        servletContext = servletConfig.getServletContext();
        log = Logger.getLogger(ProxyServlet.class.getName());
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response){
        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response){
        System.out.println( "doPost"  );


        BufferedInputStream webToProxyBuf = null;
        BufferedOutputStream proxyToClientBuf = null;
        HttpURLConnection con;

        try{
            int statusCode;
            int oneByte;
            String methodName;
            String headerText;

            String urlString = request.getRequestURL().toString();
            String queryString = request.getQueryString();

            urlString += queryString==null?"":"?"+queryString;
            URL url = new URL(urlString);

            log.info("Fetching >"+url.toString());

            con =(HttpURLConnection) url.openConnection();

            methodName = request.getMethod();
            con.setRequestMethod(methodName);
            con.setDoOutput(true);
            con.setDoInput(true);
//            HttpURLConnection.setFollowRedirects(false);
            con.setUseCaches(true);

            for( Enumeration e = request.getHeaderNames() ; e.hasMoreElements();){
                String headerName = e.nextElement().toString();
                con.setRequestProperty(headerName,    request.getHeader(headerName));
            }

            con.connect();

            if(methodName.equals("POST")){
                BufferedInputStream clientToProxyBuf = new BufferedInputStream(request.getInputStream());
                BufferedOutputStream proxyToWebBuf     = new BufferedOutputStream(con.getOutputStream());

                while ((oneByte = clientToProxyBuf.read()) != -1) 
                    proxyToWebBuf.write(oneByte);

                proxyToWebBuf.flush();
                proxyToWebBuf.close();
                clientToProxyBuf.close();
            }

            statusCode = con.getResponseCode();
            response.setStatus(statusCode);

            for( Iterator i = con.getHeaderFields().entrySet().iterator() ; i.hasNext() ;){
                Map.Entry mapEntry = (Map.Entry)i.next();
                if(mapEntry.getKey()!=null)
                    response.setHeader(mapEntry.getKey().toString(), ((List)mapEntry.getValue()).get(0).toString());
            }

            webToProxyBuf = new BufferedInputStream(con.getInputStream());
            proxyToClientBuf = new BufferedOutputStream(response.getOutputStream());

            StringBuffer sb = new StringBuffer(); 

            while ((oneByte = webToProxyBuf.read()) != -1) {
                proxyToClientBuf.write(oneByte);
                sb.append(oneByte);
            }

            System.out.println( sb );

            proxyToClientBuf.flush();
            proxyToClientBuf.close();

            webToProxyBuf.close();
            con.disconnect();

        }catch(Exception e){
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
        finally{
        }
    }
}

After deploy I set firefox proxy configs with proxy http = myproxyappname.appspot.com and port = 80 but Firefox can surf only on google pages

Upvotes: 3

Views: 4348

Answers (2)

mcbjam
mcbjam

Reputation: 7454

Here is a wprking code:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;



public class ProxyServlet extends HttpServlet {



    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse rsp)
            throws ServletException, IOException {
        try {

            String fwdurlstring=req.getParameter("fwdurl");
            if(fwdurlstring==null)
            {
                fwdurlstring="http://www.mcbjam.com";
            }


            URL fwdURL = new URL(fwdurlstring);
            HttpURLConnection fwdConnection = 
                (HttpURLConnection) fwdURL.openConnection();

            for (String key : fwdConnection.getHeaderFields().keySet()) {
                rsp.setHeader(key, fwdConnection.getHeaderField(key));
            }

            copy(fwdConnection.getInputStream(), rsp.getOutputStream());

        } catch (Exception e) {
            e.printStackTrace(rsp.getWriter());

        }
    }


    private void copy(InputStream in, OutputStream out) throws IOException {
        int len = 0;
        byte[] buf = new byte[1024];

        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }

        in.close();
    }

}

See it in action here : http://paint.mcbjam.com/proxy?fwdurl=https://stackoverflow.com/questions/13194501/how-create-your-proxy-server-using-google-app-engine-in-java/16658914#16658914

Upvotes: 4

HimalayanCoder
HimalayanCoder

Reputation: 9850

As far i can understand you are looking for a web proxy server hosted on Google App Engine.

this has been discussed in this thread. Proxy for Google App Engine

You just need to port the python project to achieve the same in java.

Try this demo proxy server hosted on GAE http://mirrorrr.appspot.com/

Upvotes: 1

Related Questions