Jetty Servlet+ HttpClient 制作的 Java HttpProxy
闲来无事做的玩的,jetty 真是个好东西!
package net.chenpu.http;import java.io.IOException;import java.util.Enumeration;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.mortbay.io.Buffer;import org.mortbay.io.BufferUtil;import org.mortbay.jetty.Server;import org.mortbay.jetty.client.Address;import org.mortbay.jetty.client.ContentExchange;import org.mortbay.jetty.client.HttpClient;import org.mortbay.jetty.client.security.ProxyAuthorization;import org.mortbay.jetty.servlet.Context;import org.mortbay.jetty.servlet.ServletHolder;public class HttpProxy {public static void main(String[] args) throws Exception {Server server = new Server(8001);Context context = new Context(server, "/", Context.SESSIONS);context.addServlet(new ServletHolder(new LocalProxyServlet()), "/*");server.start();server.join();}@SuppressWarnings("serial")public static class LocalProxyServlet extends HttpServlet {private HttpClient client = new HttpClient();public LocalProxyServlet() {client.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL);// if you need,set proxy gate// client.setProxy(new Address("127.0.0.1",8080));// try {// client.setProxyAuthentication(new// ProxyAuthorization("user","password"));// } catch (IOException e1) {// // TODO Auto-generated catch block// e1.printStackTrace();// }try {client.start();} catch (Exception e) {throw new RuntimeException(e);}}@Overrideprotected void service(HttpServletRequest request,final HttpServletResponse response) throws ServletException,IOException {StringBuilder accessPath = new StringBuilder(request.getRequestURL().toString());System.out.println("access " + accessPath);ContentExchange exchange = new ContentExchange() {// improve performance... waiting@Overrideprotected void onResponseHeader(Buffer name, Buffer value)throws IOException {String nameStr = BufferUtil.to8859_1_String(name);String valueStr = BufferUtil.to8859_1_String(value);response.setHeader(nameStr, valueStr);}@Overrideprotected void onResponseContent(Buffer content)throws IOException {response.getOutputStream().write(content.asArray());}@Overrideprotected void onResponseStatus(Buffer version, int status,Buffer reason) throws IOException {response.setStatus(status);}@Overrideprotected void onConnectionFailed(Throwable ex) {// TODO Auto-generated method stubex.printStackTrace();response.setStatus(500);}@Overrideprotected void onException(Throwable ex) {// TODO Auto-generated method stubex.printStackTrace();response.setStatus(500);}};// set jetty http client request paramsexchange.setMethod(request.getMethod());if (request.getMethod().equalsIgnoreCase("GET")) {Enumeration<String> params = request.getParameterNames();if (params != null) {if (params.hasMoreElements()) {accessPath.append('?');}while (params.hasMoreElements()) {String name = params.nextElement();String value = request.getParameter(name);accessPath.append(name);if (value != null) {accessPath.append('=').append(value);}if (params.hasMoreElements()) {accessPath.append('&');}}}}// set request urlexchange.setURL(accessPath.toString());// set http headerEnumeration<String> headers = request.getHeaderNames();while (headers.hasMoreElements()) {String name = headers.nextElement();String value = request.getHeader(name);exchange.setRequestHeader(name, value);}if (request.getInputStream() != null)exchange.setRequestContentSource(request.getInputStream());// start the exchangeclient.send(exchange);try {exchange.waitForDone();} catch (InterruptedException e) {e.printStackTrace();}}}}