package org.owasp.proxy.tcp; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetSocketAddress; import java.net.Proxy; import java.net.Socket; import java.util.logging.Logger; import org.owasp.proxy.daemon.TargetedConnectionHandler; import org.owasp.proxy.http.MessageFormatException; import org.owasp.proxy.http.MessageHeader; import org.owasp.proxy.http.MessageUtils; import org.owasp.proxy.http.MutableRequestHeader; import org.owasp.proxy.http.MutableResponseHeader; import org.owasp.proxy.http.ResponseHeader; import org.owasp.proxy.util.Pump; public class ConnectConnectionHandler implements TargetedConnectionHandler { private InetSocketAddress proxy; private Logger logger = Logger.getLogger(getClass().toString()); public ConnectConnectionHandler(InetSocketAddress proxy) { this.proxy = proxy; } @Override public void handleConnection(Socket client, InetSocketAddress target) throws IOException { logger.info("Connecting to " + target); Socket server = new Socket(Proxy.NO_PROXY); server.connect(proxy); try { doConnect(server, target); } catch (MessageFormatException e) { server.close(); throw new IOException("CONNECT error", e); } catch (IOException e) { server.close(); throw e; } Pump.connect(client, server); } private void doConnect(Socket server, InetSocketAddress target) throws IOException, MessageFormatException { sendRequest(server.getOutputStream(), target); logger.info("Sent CONNECT to " + proxy + " for " + target); ResponseHeader resp = readResponse(server.getInputStream()); logger.info("Got " + resp.getStartLine()); String status = resp.getStatus(); if (!"200".equals(status)) throw new IOException("CONNECT refused: " + resp.getStatus() + " " + resp.getReason()); } private void sendRequest(OutputStream out, InetSocketAddress target) throws IOException, MessageFormatException { MutableRequestHeader req = new MutableRequestHeader.Impl(); String resource = target.getAddress().getHostAddress() + ":" + target.getPort(); req.setMethod("CONNECT"); req.setResource(resource); req.setVersion("HTTP/1.0"); out.write(req.getHeader()); out.flush(); } private ResponseHeader readResponse(InputStream in) throws IOException, MessageFormatException { MutableResponseHeader response = new MutableResponseHeader.Impl(); MessageHeader header = MessageUtils.readHeader(in); if (header == null) return null; response.setHeader(header.getHeader()); return response; } }