Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: src/org/adblockplus/brazil/SSLConnectionHandler.java

Issue 5697499218051072: Usage of new API, cleanups (reduced) (Closed)
Patch Set: Fixed leftover first-batch review issues. Created April 16, 2014, 5:51 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * This file is part of Adblock Plus <http://adblockplus.org/>, 2 * This file is part of Adblock Plus <http://adblockplus.org/>,
3 * Copyright (C) 2006-2014 Eyeo GmbH 3 * Copyright (C) 2006-2014 Eyeo GmbH
4 * 4 *
5 * Adblock Plus is free software: you can redistribute it and/or modify 5 * Adblock Plus is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 3 as 6 * it under the terms of the GNU General Public License version 3 as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
8 * 8 *
9 * Adblock Plus is distributed in the hope that it will be useful, 9 * Adblock Plus is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
(...skipping 12 matching lines...) Expand all
23 import java.net.InetSocketAddress; 23 import java.net.InetSocketAddress;
24 import java.net.Socket; 24 import java.net.Socket;
25 25
26 import sunlabs.brazil.server.Request; 26 import sunlabs.brazil.server.Request;
27 import sunlabs.brazil.server.Server; 27 import sunlabs.brazil.server.Server;
28 import sunlabs.brazil.util.MatchString; 28 import sunlabs.brazil.util.MatchString;
29 29
30 /** 30 /**
31 * <code>RequestHandler</code> implements a SSL tunnel. 31 * <code>RequestHandler</code> implements a SSL tunnel.
32 * 32 *
33 * The following configuration parameters are used to initialize this 33 * The following configuration parameters are used to initialize this <code>Hand ler</code>:
34 * <code>Handler</code>:
35 * <dl class=props> 34 * <dl class=props>
36 * 35 *
37 * <dt>prefix, suffix, glob, match 36 * <dt>prefix, suffix, glob, match
38 * <dd>Specify the URL that triggers this handler. (See {@link MatchString}). 37 * <dd>Specify the URL that triggers this handler. (See {@link MatchString}).
39 * <dt>auth 38 * <dt>auth
40 * <dd>The value of the proxy-authenticate header (if any) sent to the upstream 39 * <dd>The value of the proxy-authenticate header (if any) sent to the upstream proxy
41 * proxy
42 * <dt>proxyHost 40 * <dt>proxyHost
43 * <dd>If specified, the name of the upstream proxy 41 * <dd>If specified, the name of the upstream proxy
44 * <dt>proxyPort 42 * <dt>proxyPort
45 * <dd>The upstream proxy port, if a proxyHost is specified (defaults to 80) 43 * <dd>The upstream proxy port, if a proxyHost is specified (defaults to 80)
46 * 44 *
47 * </dl> 45 * </dl>
48 * 46 *
49 * A sample set of configuration parameters illustrating how to use this 47 * A sample set of configuration parameters illustrating how to use this handler follows:
50 * handler follows:
51 * 48 *
52 * <pre> 49 * <pre>
53 * handler=https 50 * handler=https
54 * https.class=org.adblockplus.brazil.SSLConnectionHandler 51 * https.class=org.adblockplus.brazil.SSLConnectionHandler
55 * </pre> 52 * </pre>
56 * 53 *
57 * See the description under {@link sunlabs.brazil.server.Handler#respond 54 * See the description under {@link sunlabs.brazil.server.Handler#respond
58 * respond} for a more detailed explanation. 55 * respond} for a more detailed explanation.
59 * 56 *j
60 * Original source by Jochen Luell, PAW (http://paw-project.sourceforge.net/) 57 * Original source by Jochen Luell, PAW (http://paw-project.sourceforge.net/)
61 */ 58 */
62 59
63 public class SSLConnectionHandler extends BaseRequestHandler 60 public class SSLConnectionHandler extends BaseRequestHandler
64 { 61 {
65 @Override 62 @Override
66 public boolean respond(Request request) throws IOException 63 public boolean respond(final Request request) throws IOException
67 { 64 {
68 if (!request.method.equals("CONNECT")) 65 if (!request.method.equals("CONNECT"))
69 return false; 66 return false;
70 67
71 request.log(Server.LOG_LOG, prefix, "SSL connection to " + request.url); 68 request.log(Server.LOG_LOG, prefix, "SSL connection to " + request.url);
72 69
73 String host = null; 70 String host = null;
74 int port = 0; 71 int port = 0;
75 72
76 Socket serverSocket; 73 Socket serverSocket;
77 try 74 try
78 { 75 {
79 if (proxyHost != null) 76 if (proxyHost != null)
80 { 77 {
81 host = proxyHost; 78 host = proxyHost;
82 port = proxyPort; 79 port = proxyPort;
83 if (auth != null) 80 if (auth != null)
84 { 81 {
85 request.headers.add("Proxy-Authorization", auth); 82 request.headers.add("Proxy-Authorization", auth);
86 } 83 }
87 } 84 }
88 else 85 else
89 { 86 {
90 int c = request.url.indexOf(':'); 87 final int c = request.url.indexOf(':');
91 host = request.url.substring(0, c); 88 host = request.url.substring(0, c);
92 port = Integer.parseInt(request.url.substring(c + 1)); 89 port = Integer.parseInt(request.url.substring(c + 1));
93 } 90 }
94 91
95 // Connect to server or upstream proxy 92 // Connect to server or upstream proxy
96 serverSocket = new Socket(); 93 serverSocket = new Socket();
97 serverSocket.setKeepAlive(true); 94 serverSocket.setKeepAlive(true);
98 serverSocket.connect(new InetSocketAddress(host, port)); 95 serverSocket.connect(new InetSocketAddress(host, port));
99 } 96 }
100 catch (Exception e) 97 catch (final Exception e)
101 { 98 {
102 request.sendError(500, "SSL connection failure"); 99 request.sendError(500, "SSL connection failure");
103 return true; 100 return true;
104 } 101 }
105 102
106 try 103 try
107 { 104 {
108 if (proxyHost != null) 105 if (proxyHost != null)
109 { 106 {
110 // Forward request to upstream proxy 107 // Forward request to upstream proxy
111 OutputStream out = serverSocket.getOutputStream(); 108 final OutputStream out = serverSocket.getOutputStream();
112 out.write((request.method + " " + request.url + " " + request.protocol + "\r\n").getBytes()); 109 out.write((request.method + " " + request.url + " " + request.protocol + "\r\n").getBytes());
113 request.headers.print(out); 110 request.headers.print(out);
114 out.write("\r\n".getBytes()); 111 out.write("\r\n".getBytes());
115 out.flush(); 112 out.flush();
116 } 113 }
117 else 114 else
118 { 115 {
119 // Send response to client 116 // Send response to client
120 OutputStream out = request.sock.getOutputStream(); 117 final OutputStream out = request.sock.getOutputStream();
121 out.write((request.protocol + " 200 Connection established\r\n\r\n").get Bytes()); 118 out.write((request.protocol + " 200 Connection established\r\n\r\n").get Bytes());
122 out.flush(); 119 out.flush();
123 } 120 }
124 121
125 // Start bi-directional data transfer 122 // Start bi-directional data transfer
126 ConnectionHandler client = new ConnectionHandler(request.sock, serverSocke t); 123 final ConnectionHandler client = new ConnectionHandler(request.sock, serve rSocket);
127 ConnectionHandler server = new ConnectionHandler(serverSocket, request.soc k); 124 final ConnectionHandler server = new ConnectionHandler(serverSocket, reque st.sock);
128 client.start(); 125 client.start();
129 server.start(); 126 server.start();
130 127
131 // Wait for connections to close 128 // Wait for connections to close
132 client.join(); 129 client.join();
133 server.join(); 130 server.join();
134 } 131 }
135 catch (InterruptedException e) 132 catch (final InterruptedException e)
136 { 133 {
137 request.log(Server.LOG_ERROR, prefix, "Data exchange error: " + e.getMessa ge()); 134 request.log(Server.LOG_ERROR, prefix, "Data exchange error: " + e.getMessa ge());
138 } 135 }
139 136
140 // Close connection 137 // Close connection
141 serverSocket.close(); 138 serverSocket.close();
142 request.log(Server.LOG_LOG, prefix, "SSL connection closed"); 139 request.log(Server.LOG_LOG, prefix, "SSL connection closed");
143 140
144 return true; 141 return true;
145 } 142 }
146 143
147 private class ConnectionHandler extends Thread 144 private class ConnectionHandler extends Thread
148 { 145 {
149 private InputStream in; 146 private final InputStream in;
150 private OutputStream out; 147 private final OutputStream out;
151 148
152 ConnectionHandler(Socket sin, Socket sout) throws IOException 149 ConnectionHandler(final Socket sin, final Socket sout) throws IOException
153 { 150 {
154 in = sin.getInputStream(); 151 in = sin.getInputStream();
155 out = sout.getOutputStream(); 152 out = sout.getOutputStream();
156 } 153 }
157 154
158 @Override 155 @Override
159 public void run() 156 public void run()
160 { 157 {
161 byte[] buf = new byte[4096]; 158 final byte[] buf = new byte[4096];
162 int count; 159 int count;
163 160
164 try 161 try
165 { 162 {
166 while ((count = in.read(buf, 0, buf.length)) != -1) 163 while ((count = in.read(buf, 0, buf.length)) != -1)
167 { 164 {
168 out.write(buf, 0, count); 165 out.write(buf, 0, count);
169 } 166 }
170 out.flush(); 167 out.flush();
171 } 168 }
172 catch (IOException e) 169 catch (final IOException e)
173 { 170 {
174 e.printStackTrace(); 171 e.printStackTrace();
175 } 172 }
176 } 173 }
177 } 174 }
178 } 175 }
OLDNEW
« no previous file with comments | « src/org/adblockplus/brazil/RequestHandler.java ('k') | src/org/adblockplus/brazil/TransparentProxyHandler.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld