1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.ajp;
20
21 import java.io.ByteArrayInputStream;
22 import java.io.IOException;
23 import java.security.cert.CertificateFactory;
24 import java.security.cert.X509Certificate;
25 import java.util.Collection;
26
27 import javax.servlet.ServletInputStream;
28 import javax.servlet.http.HttpServletResponse;
29
30 import org.eclipse.jetty.http.HttpException;
31 import org.eclipse.jetty.io.Buffer;
32 import org.eclipse.jetty.io.EndPoint;
33 import org.eclipse.jetty.server.BlockingHttpConnection;
34 import org.eclipse.jetty.server.Connector;
35 import org.eclipse.jetty.server.Request;
36 import org.eclipse.jetty.server.Server;
37 import org.eclipse.jetty.util.log.Log;
38 import org.eclipse.jetty.util.log.Logger;
39
40
41
42
43
44
45 public class Ajp13Connection extends BlockingHttpConnection
46 {
47 private static final Logger LOG = Log.getLogger(Ajp13Connection.class);
48
49 public Ajp13Connection(Connector connector, EndPoint endPoint, Server server)
50 {
51 super(connector, endPoint, server,
52 new Ajp13Parser(connector.getRequestBuffers(), endPoint),
53 new Ajp13Generator(connector.getResponseBuffers(), endPoint),
54 new Ajp13Request()
55 );
56
57 ((Ajp13Parser)_parser).setEventHandler(new RequestHandler());
58 ((Ajp13Parser)_parser).setGenerator((Ajp13Generator)_generator);
59 ((Ajp13Request)_request).setConnection(this);
60 }
61
62 @Override
63 public boolean isConfidential(Request request)
64 {
65 return ((Ajp13Request) request).isSslSecure();
66 }
67
68 @Override
69 public boolean isIntegral(Request request)
70 {
71 return ((Ajp13Request) request).isSslSecure();
72 }
73
74 @Override
75 public ServletInputStream getInputStream()
76 {
77 if (_in == null)
78 _in = new Ajp13Parser.Input((Ajp13Parser) _parser, _connector.getMaxIdleTime());
79 return _in;
80 }
81
82 private class RequestHandler implements Ajp13Parser.EventHandler
83 {
84 public void startForwardRequest() throws IOException
85 {
86 _uri.clear();
87
88 ((Ajp13Request) _request).setSslSecure(false);
89 _request.setTimeStamp(System.currentTimeMillis());
90 _request.setUri(_uri);
91
92 }
93
94 public void parsedAuthorizationType(Buffer authType) throws IOException
95 {
96
97
98 }
99
100 public void parsedRemoteUser(Buffer remoteUser) throws IOException
101 {
102 ((Ajp13Request)_request).setRemoteUser(remoteUser.toString());
103 }
104
105 public void parsedServletPath(Buffer servletPath) throws IOException
106 {
107 _request.setServletPath(servletPath.toString());
108 }
109
110 public void parsedContextPath(Buffer context) throws IOException
111 {
112 _request.setContextPath(context.toString());
113 }
114
115 public void parsedSslCert(Buffer sslCert) throws IOException
116 {
117 try
118 {
119 CertificateFactory cf = CertificateFactory.getInstance("X.509");
120 ByteArrayInputStream bis = new ByteArrayInputStream(sslCert.toString().getBytes());
121
122 Collection<? extends java.security.cert.Certificate> certCollection = cf.generateCertificates(bis);
123 X509Certificate[] certificates = new X509Certificate[certCollection.size()];
124
125 int i=0;
126 for (Object aCertCollection : certCollection)
127 {
128 certificates[i++] = (X509Certificate) aCertCollection;
129 }
130
131 _request.setAttribute("javax.servlet.request.X509Certificate", certificates);
132 }
133 catch (Exception e)
134 {
135 LOG.warn(e.toString());
136 LOG.ignore(e);
137 if (sslCert!=null)
138 _request.setAttribute("javax.servlet.request.X509Certificate", sslCert.toString());
139 }
140 }
141
142 public void parsedSslCipher(Buffer sslCipher) throws IOException
143 {
144 _request.setAttribute("javax.servlet.request.cipher_suite", sslCipher.toString());
145 }
146
147 public void parsedSslSession(Buffer sslSession) throws IOException
148 {
149 _request.setAttribute("javax.servlet.request.ssl_session", sslSession.toString());
150 }
151
152 public void parsedSslKeySize(int keySize) throws IOException
153 {
154 _request.setAttribute("javax.servlet.request.key_size", new Integer(keySize));
155 }
156
157 public void parsedMethod(Buffer method) throws IOException
158 {
159 if (method == null)
160 throw new HttpException(HttpServletResponse.SC_BAD_REQUEST);
161 _request.setMethod(method.toString());
162 }
163
164 public void parsedUri(Buffer uri) throws IOException
165 {
166 _uri.parse(uri.toString());
167 }
168
169 public void parsedProtocol(Buffer protocol) throws IOException
170 {
171 if (protocol != null && protocol.length()>0)
172 {
173 _request.setProtocol(protocol.toString());
174 }
175 }
176
177 public void parsedRemoteAddr(Buffer addr) throws IOException
178 {
179 if (addr != null && addr.length()>0)
180 {
181 _request.setRemoteAddr(addr.toString());
182 }
183 }
184
185 public void parsedRemoteHost(Buffer name) throws IOException
186 {
187 if (name != null && name.length()>0)
188 {
189 _request.setRemoteHost(name.toString());
190 }
191 }
192
193 public void parsedServerName(Buffer name) throws IOException
194 {
195 if (name != null && name.length()>0)
196 {
197 _request.setServerName(name.toString());
198 }
199 }
200
201 public void parsedServerPort(int port) throws IOException
202 {
203 _request.setServerPort(port);
204 }
205
206 public void parsedSslSecure(boolean secure) throws IOException
207 {
208 ((Ajp13Request) _request).setSslSecure(secure);
209 }
210
211 public void parsedQueryString(Buffer value) throws IOException
212 {
213 String u = _uri + "?" + value;
214 _uri.parse(u);
215 }
216
217 public void parsedHeader(Buffer name, Buffer value) throws IOException
218 {
219 _requestFields.add(name, value);
220 }
221
222 public void parsedRequestAttribute(String key, Buffer value) throws IOException
223 {
224 if (value==null)
225 _request.removeAttribute(key);
226 else
227 _request.setAttribute(key,value.toString());
228 }
229
230 public void parsedRequestAttribute(String key, int value) throws IOException
231 {
232 _request.setAttribute(key, Integer.toString(value));
233 }
234
235 public void headerComplete() throws IOException
236 {
237 handleRequest();
238 }
239
240 public void messageComplete(long contextLength) throws IOException
241 {
242 }
243
244 public void content(Buffer ref) throws IOException
245 {
246 }
247
248 }
249
250 }