Mercurial Hosting > luan
annotate src/org/eclipse/jetty/server/bio/SocketConnector.java @ 870:b745110a30f4
remove SslSocketConnector
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 03 Oct 2016 19:46:15 -0600 |
parents | 6b210bb66c63 |
children |
rev | line source |
---|---|
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
1 // |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
2 // ======================================================================== |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
3 // Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd. |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
4 // ------------------------------------------------------------------------ |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
5 // All rights reserved. This program and the accompanying materials |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
6 // are made available under the terms of the Eclipse Public License v1.0 |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
7 // and Apache License v2.0 which accompanies this distribution. |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
8 // |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
9 // The Eclipse Public License is available at |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
10 // http://www.eclipse.org/legal/epl-v10.html |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
11 // |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
12 // The Apache License v2.0 is available at |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
13 // http://www.opensource.org/licenses/apache2.0.php |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
14 // |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
15 // You may elect to redistribute this code under either of these licenses. |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
16 // ======================================================================== |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
17 // |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
18 |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
19 package org.eclipse.jetty.server.bio; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
20 |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
21 import java.io.IOException; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
22 import java.net.InetAddress; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
23 import java.net.ServerSocket; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
24 import java.net.Socket; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
25 import java.net.SocketException; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
26 import java.util.HashSet; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
27 import java.util.Set; |
865 | 28 import java.util.concurrent.RejectedExecutionException; |
29 import java.util.concurrent.ThreadPoolExecutor; | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
30 |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
31 import org.eclipse.jetty.http.HttpException; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
32 import org.eclipse.jetty.io.Buffer; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
33 import org.eclipse.jetty.io.ConnectedEndPoint; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
34 import org.eclipse.jetty.io.Connection; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
35 import org.eclipse.jetty.io.EndPoint; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
36 import org.eclipse.jetty.io.EofException; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
37 import org.eclipse.jetty.io.bio.SocketEndPoint; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
38 import org.eclipse.jetty.server.AbstractConnector; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
39 import org.eclipse.jetty.server.AbstractHttpConnection; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
40 import org.eclipse.jetty.server.BlockingHttpConnection; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
41 import org.eclipse.jetty.server.Request; |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
42 import org.eclipse.jetty.util.component.AggregateLifeCycle; |
820
8e9db0bbf4f9
remove org.eclipse.jetty.util.log and upgrade slf4j
Franklin Schmidt <fschmidt@gmail.com>
parents:
802
diff
changeset
|
43 import org.slf4j.Logger; |
8e9db0bbf4f9
remove org.eclipse.jetty.util.log and upgrade slf4j
Franklin Schmidt <fschmidt@gmail.com>
parents:
802
diff
changeset
|
44 import org.slf4j.LoggerFactory; |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
45 |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
46 |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
47 /* ------------------------------------------------------------------------------- */ |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
48 /** Socket Connector. |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
49 * This connector implements a traditional blocking IO and threading model. |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
50 * Normal JRE sockets are used and a thread is allocated per connection. |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
51 * Buffers are managed so that large buffers are only allocated to active connections. |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
52 * |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
53 * This Connector should only be used if NIO is not available. |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
54 * |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
55 * @org.apache.xbean.XBean element="bioConnector" description="Creates a BIO based socket connector" |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
56 * |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
57 * |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
58 */ |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
59 public class SocketConnector extends AbstractConnector |
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
60 { |
865 | 61 private static final Logger LOG = LoggerFactory.getLogger(SocketConnector.class); |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
62 |
865 | 63 protected ServerSocket _serverSocket; |
64 protected final Set<EndPoint> _connections; | |
65 protected volatile int _localPort=-1; | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
66 |
865 | 67 /* ------------------------------------------------------------ */ |
68 /** Constructor. | |
69 * | |
70 */ | |
71 public SocketConnector() | |
72 { | |
73 _connections=new HashSet<EndPoint>(); | |
74 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
75 |
865 | 76 /* ------------------------------------------------------------ */ |
77 public Object getConnection() | |
78 { | |
79 return _serverSocket; | |
80 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
81 |
865 | 82 /* ------------------------------------------------------------ */ |
83 public void open() throws IOException | |
84 { | |
85 // Create a new server socket and set to non blocking mode | |
86 if (_serverSocket==null || _serverSocket.isClosed()) | |
87 _serverSocket= newServerSocket(getHost(),getPort(),getAcceptQueueSize()); | |
88 _serverSocket.setReuseAddress(getReuseAddress()); | |
89 _localPort=_serverSocket.getLocalPort(); | |
90 if (_localPort<=0) | |
91 throw new IllegalStateException("port not allocated for "+this); | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
92 |
865 | 93 } |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
94 |
865 | 95 /* ------------------------------------------------------------ */ |
96 protected ServerSocket newServerSocket(String host, int port,int backlog) throws IOException | |
97 { | |
98 ServerSocket ss= host==null? | |
99 new ServerSocket(port,backlog): | |
100 new ServerSocket(port,backlog,InetAddress.getByName(host)); | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
101 |
865 | 102 return ss; |
103 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
104 |
865 | 105 /* ------------------------------------------------------------ */ |
106 public void close() throws IOException | |
107 { | |
108 if (_serverSocket!=null) | |
109 _serverSocket.close(); | |
110 _serverSocket=null; | |
111 _localPort=-2; | |
112 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
113 |
865 | 114 /* ------------------------------------------------------------ */ |
115 @Override | |
116 public void accept(int acceptorID) | |
117 throws IOException, InterruptedException | |
118 { | |
119 Socket socket = _serverSocket.accept(); | |
120 configure(socket); | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
121 |
865 | 122 ConnectorEndPoint connection=new ConnectorEndPoint(socket); |
123 connection.dispatch(); | |
124 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
125 |
865 | 126 /* ------------------------------------------------------------------------------- */ |
127 /** | |
128 * Allows subclass to override Conection if required. | |
129 */ | |
130 protected Connection newConnection(EndPoint endpoint) | |
131 { | |
132 return new BlockingHttpConnection(this, endpoint, getServer()); | |
133 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
134 |
865 | 135 /* ------------------------------------------------------------------------------- */ |
136 @Override | |
137 public void customize(EndPoint endpoint, Request request) | |
138 throws IOException | |
139 { | |
140 ConnectorEndPoint connection = (ConnectorEndPoint)endpoint; | |
141 int lrmit = isLowResources()?_lowResourceMaxIdleTime:_maxIdleTime; | |
142 connection.setMaxIdleTime(lrmit); | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
143 |
865 | 144 super.customize(endpoint, request); |
145 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
146 |
865 | 147 /* ------------------------------------------------------------------------------- */ |
148 public int getLocalPort() | |
149 { | |
150 return _localPort; | |
151 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
152 |
865 | 153 /* ------------------------------------------------------------------------------- */ |
154 @Override | |
155 protected void doStart() throws Exception | |
156 { | |
157 _connections.clear(); | |
158 super.doStart(); | |
159 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
160 |
865 | 161 /* ------------------------------------------------------------------------------- */ |
162 @Override | |
163 protected void doStop() throws Exception | |
164 { | |
165 super.doStop(); | |
166 Set<EndPoint> set = new HashSet<EndPoint>(); | |
167 synchronized(_connections) | |
168 { | |
169 set.addAll(_connections); | |
170 } | |
171 for (EndPoint endPoint : set) | |
172 { | |
173 ConnectorEndPoint connection = (ConnectorEndPoint)endPoint; | |
174 connection.close(); | |
175 } | |
176 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
177 |
865 | 178 @Override |
179 public void dump(Appendable out, String indent) throws IOException | |
180 { | |
181 super.dump(out, indent); | |
182 Set<EndPoint> connections = new HashSet<EndPoint>(); | |
183 synchronized (_connections) | |
184 { | |
185 connections.addAll(_connections); | |
186 } | |
187 AggregateLifeCycle.dump(out, indent, connections); | |
188 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
189 |
865 | 190 /* ------------------------------------------------------------------------------- */ |
191 /* ------------------------------------------------------------------------------- */ | |
192 /* ------------------------------------------------------------------------------- */ | |
193 protected class ConnectorEndPoint extends SocketEndPoint implements Runnable, ConnectedEndPoint | |
194 { | |
195 volatile Connection _connection; | |
196 protected final Socket _socket; | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
197 |
865 | 198 public ConnectorEndPoint(Socket socket) throws IOException |
199 { | |
200 super(socket,_maxIdleTime); | |
201 _connection = newConnection(this); | |
202 _socket=socket; | |
203 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
204 |
865 | 205 public Connection getConnection() |
206 { | |
207 return _connection; | |
208 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
209 |
865 | 210 public void setConnection(Connection connection) |
211 { | |
212 if (_connection!=connection && _connection!=null) | |
213 connectionUpgraded(_connection,connection); | |
214 _connection=connection; | |
215 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
216 |
865 | 217 public void dispatch() throws IOException |
218 { | |
219 ThreadPoolExecutor tpe = getThreadPool(); | |
220 if( tpe != null ) { | |
221 try { | |
222 tpe.execute(this); | |
223 return; | |
224 } catch(RejectedExecutionException e) {} | |
225 } | |
226 LOG.warn("dispatch failed for {}",_connection); | |
227 close(); | |
228 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
229 |
865 | 230 @Override |
231 public int fill(Buffer buffer) throws IOException | |
232 { | |
233 int l = super.fill(buffer); | |
234 if (l<0) | |
235 { | |
236 if (!isInputShutdown()) | |
237 shutdownInput(); | |
238 if (isOutputShutdown()) | |
239 close(); | |
240 } | |
241 return l; | |
242 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
243 |
865 | 244 @Override |
245 public void close() throws IOException | |
246 { | |
247 if (_connection instanceof AbstractHttpConnection) | |
248 ((AbstractHttpConnection)_connection).getRequest().getAsyncContinuation().cancel(); | |
249 super.close(); | |
250 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
251 |
865 | 252 public void run() |
253 { | |
254 try | |
255 { | |
256 connectionOpened(_connection); | |
257 synchronized(_connections) | |
258 { | |
259 _connections.add(this); | |
260 } | |
261 | |
262 while (isStarted() && !isClosed()) | |
263 { | |
264 if (_connection.isIdle()) | |
265 { | |
266 if (isLowResources()) | |
267 setMaxIdleTime(getLowResourcesMaxIdleTime()); | |
268 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
269 |
865 | 270 _connection=_connection.handle(); |
271 } | |
272 } | |
273 catch (EofException e) | |
274 { | |
275 LOG.debug("EOF", e); | |
276 try{close();} | |
277 catch(IOException e2){LOG.trace("",e2);} | |
278 } | |
279 catch (SocketException e) | |
280 { | |
281 LOG.debug("EOF", e); | |
282 try{close();} | |
283 catch(IOException e2){LOG.trace("",e2);} | |
284 } | |
285 catch (HttpException e) | |
286 { | |
287 LOG.debug("BAD", e); | |
288 try{close();} | |
289 catch(IOException e2){LOG.trace("",e2);} | |
290 } | |
291 catch(Exception e) | |
292 { | |
293 LOG.warn("handle failed?",e); | |
294 try{close();} | |
295 catch(IOException e2){LOG.trace("",e2);} | |
296 } | |
297 finally | |
298 { | |
299 connectionClosed(_connection); | |
300 synchronized(_connections) | |
301 { | |
302 _connections.remove(this); | |
303 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
304 |
865 | 305 // wait for client to close, but if not, close ourselves. |
306 try | |
307 { | |
308 if (!_socket.isClosed()) | |
309 { | |
310 long timestamp=System.currentTimeMillis(); | |
311 int max_idle=getMaxIdleTime(); | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
312 |
865 | 313 _socket.setSoTimeout(getMaxIdleTime()); |
314 int c=0; | |
315 do | |
316 { | |
317 c = _socket.getInputStream().read(); | |
318 } | |
319 while (c>=0 && (System.currentTimeMillis()-timestamp)<max_idle); | |
320 if (!_socket.isClosed()) | |
321 _socket.close(); | |
322 } | |
323 } | |
324 catch(IOException e) | |
325 { | |
326 LOG.trace("",e); | |
327 } | |
328 } | |
329 } | |
330 } | |
802
3428c60d7cfc
replace jetty jars with source
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
331 } |