1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 package org.apache.commons.httpclient.server;
31
32 import java.io.IOException;
33
34 import org.apache.commons.httpclient.Header;
35 import org.apache.commons.httpclient.HttpException;
36 import org.apache.commons.httpclient.HttpStatus;
37 import org.apache.commons.httpclient.HttpVersion;
38 import org.apache.commons.httpclient.URI;
39 import org.apache.commons.logging.Log;
40 import org.apache.commons.logging.LogFactory;
41
42 /***
43 * @author Ortwin Glueck
44 * @author Oleg Kalnichevski
45 */
46 public class ProxyRequestHandler implements HttpRequestHandler {
47
48 private static final Log LOG = LogFactory.getLog(ProxyRequestHandler.class);
49
50 private SimpleConnManager connmanager = null;
51
52 public ProxyRequestHandler(final SimpleConnManager connmanager) {
53 super();
54 if (connmanager == null) {
55 throw new IllegalArgumentException("Connection manager may not be null");
56 }
57 this.connmanager = connmanager;
58 }
59
60 /***
61 * @see org.apache.commons.httpclient.server.HttpRequestHandler#processRequest(org.apache.commons.httpclient.server.SimpleHttpServerConnection)
62 */
63 public boolean processRequest(
64 final SimpleHttpServerConnection conn,
65 final SimpleRequest request) throws IOException
66 {
67 httpProxy(conn, request);
68 return true;
69 }
70
71 private void httpProxy(
72 final SimpleHttpServerConnection conn,
73 final SimpleRequest request) throws IOException {
74
75 RequestLine oldreqline = request.getRequestLine();
76 URI uri = new URI(oldreqline.getUri(), true);
77 SimpleHost host = new SimpleHost(uri.getHost(), uri.getPort());
78 SimpleHttpServerConnection proxyconn = this.connmanager.openConnection(host);
79 proxyconn.setSocketTimeout(0);
80 try {
81
82
83
84 RequestLine newreqline = new RequestLine(
85 oldreqline.getMethod(),
86 uri.getEscapedPath(),
87 oldreqline.getHttpVersion());
88 request.setRequestLine(newreqline);
89
90 request.removeHeaders("Proxy-Authorization");
91
92 Header connheader = request.getFirstHeader("Proxy-Connection");
93 if (connheader != null) {
94 if (connheader.getValue().equalsIgnoreCase("close")) {
95 request.setHeader(new Header("Connection", "close"));
96 }
97 }
98 request.removeHeaders("Proxy-Connection");
99
100 proxyconn.writeRequest(request);
101
102 SimpleResponse response = proxyconn.readResponse();
103 if (response == null) {
104 return;
105 }
106 connheader = response.getFirstHeader("Connection");
107 if (connheader != null) {
108 String s = connheader.getValue();
109 if (s.equalsIgnoreCase("close")) {
110 response.setHeader(new Header("Proxy-Connection", "close"));
111 conn.setKeepAlive(false);
112 proxyconn.setKeepAlive(false);
113 response.removeHeaders("Connection");
114 }
115 if (s.equalsIgnoreCase("keep-alive")) {
116 response.setHeader(new Header("Proxy-Connection", "keep-alive"));
117 conn.setKeepAlive(true);
118 proxyconn.setKeepAlive(true);
119 response.removeHeaders("Connection");
120 }
121 } else {
122
123 if (response.getHttpVersion().greaterEquals(HttpVersion.HTTP_1_1)) {
124 conn.setKeepAlive(true);
125 proxyconn.setKeepAlive(true);
126 } else {
127 conn.setKeepAlive(false);
128 proxyconn.setKeepAlive(false);
129 }
130 }
131 if ("HEAD".equalsIgnoreCase(request.getRequestLine().getMethod())) {
132
133 response.setBody(null);
134 }
135 conn.writeResponse(response);
136
137 } catch (HttpException e) {
138 SimpleResponse response = ErrorResponse.getResponse(HttpStatus.SC_BAD_REQUEST);
139 conn.writeResponse(response);
140 proxyconn.setKeepAlive(false);
141 } catch (IOException e) {
142 LOG.warn(e.getMessage());
143 proxyconn.setKeepAlive(false);
144 } finally {
145 this.connmanager.releaseConnection(host, proxyconn);
146 }
147 }
148
149 }