Top Commentators

  • Two guys and a Beer - Episode 85
  • Jam Session 2
  • Two guys and a Beer - Episode 84

Java HTTP proxy servlet (with Spring)

I always wanted to build my own proxy. I’m kidding. I do have better things to do with my time. Nevertheless, a problem presented itself and here’s my solution for it: An HTTP proxy Spring controller.

Currently:

  • Handles GET and POST methods;
  • Guaranties the type of the response to be the one the target server sends;
  • Supports sending POST (form) parameters;
  • The parameter for the target url is called, interestingly enough, ‘url’;
  • Has a dependency on Spring, and Apache’s HttpClient.

Here’s the code, have fun:

package org.voidness.httpproxy;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.URLDecoder;
import java.util.Enumeration;

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

import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.lang.NotImplementedException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * @author Pedro Assuncao (assuncas@gmail.com)
 * @May 26, 2009
 *
 */
@Controller
public class AjaxProxyController {

    @SuppressWarnings("unchecked")
    @RequestMapping(value = "/")
    public final void proxyAjaxCall(
            @RequestParam(required = true, value = "url") String url,
            HttpServletRequest request, HttpServletResponse response)
            throws IOException {

        // URL needs to be url decoded
        url = URLDecoder.decode(url, "utf-8");

        OutputStreamWriter writer =
                new OutputStreamWriter(response.getOutputStream());
        HttpClient client = new HttpClient();
        try {

            HttpMethod method = null;

            // Split this according to the type of request
            if (request.getMethod().equals("GET")) {

                method = new GetMethod(url);

            } else if (request.getMethod().equals("POST")) {

                method = new PostMethod(url);

                // Set any eventual parameters that came with our original
                // request (POST params, for instance)
                Enumeration paramNames = request.getParameterNames();
                while (paramNames.hasMoreElements()) {

                    String paramName = paramNames.nextElement();
                    ((PostMethod) method).setParameter(paramName, request
                            .getParameter(paramName));
                }

            } else {

                throw new NotImplementedException(
                        "This proxy only supports GET and POST methods.");
            }

            // Execute the method
            client.executeMethod(method);

            // Set the content type, as it comes from the server
            Header[] headers = method.getResponseHeaders();
            for (Header header : headers) {

                if ("Content-Type".equalsIgnoreCase(header.getName())) {

                    response.setContentType(header.getValue());
                }
            }

            // Write the body, flush and close
            writer.write(method.getResponseBodyAsString());
            writer.flush();
            writer.close();

        } catch (HttpException e) {

            //log.error("Oops, something went wrong in the HTTP proxy", null, e);
            writer.write(e.toString());
            throw e;

        } catch (IOException e) {

            e.printStackTrace();
            writer.write(e.toString());
            throw e;
        }
    }
}
Share:
  • Digg
  • del.icio.us
  • Facebook
  • Posterous
  • Reddit
  • Twitter
  • HackerNews
  • FriendFeed
  • Hyves
  • RSS

Related:

  1. Java HTTP proxy servlet (with Spring) | Sugus
  2. Django: Reverse HTTP redirect with parameters

6 comments to Java HTTP proxy servlet (with Spring)

Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>