Mercurial Hosting > luan
comparison src/org/eclipse/jetty/server/Server.java @ 812:700317ba03ad
remove SessionIdManager
| author | Franklin Schmidt <fschmidt@gmail.com> |
|---|---|
| date | Thu, 08 Sep 2016 21:44:37 -0600 |
| parents | 3428c60d7cfc |
| children | 8e9db0bbf4f9 |
comparison
equal
deleted
inserted
replaced
| 811:1bedcd0ec275 | 812:700317ba03ad |
|---|---|
| 55 * | 55 * |
| 56 * @org.apache.xbean.XBean description="Creates an embedded Jetty web server" | 56 * @org.apache.xbean.XBean description="Creates an embedded Jetty web server" |
| 57 */ | 57 */ |
| 58 public class Server extends HandlerWrapper implements Attributes | 58 public class Server extends HandlerWrapper implements Attributes |
| 59 { | 59 { |
| 60 private static final Logger LOG = Log.getLogger(Server.class); | 60 private static final Logger LOG = Log.getLogger(Server.class); |
| 61 | 61 |
| 62 private static final String __version; | 62 private static final String __version; |
| 63 static | 63 static |
| 64 { | 64 { |
| 65 if (Server.class.getPackage()!=null && | 65 if (Server.class.getPackage()!=null && |
| 66 "Eclipse.org - Jetty".equals(Server.class.getPackage().getImplementationVendor()) && | 66 "Eclipse.org - Jetty".equals(Server.class.getPackage().getImplementationVendor()) && |
| 67 Server.class.getPackage().getImplementationVersion()!=null) | 67 Server.class.getPackage().getImplementationVersion()!=null) |
| 68 __version=Server.class.getPackage().getImplementationVersion(); | 68 __version=Server.class.getPackage().getImplementationVersion(); |
| 69 else | 69 else |
| 70 __version=System.getProperty("jetty.version","8.y.z-SNAPSHOT"); | 70 __version=System.getProperty("jetty.version","8.y.z-SNAPSHOT"); |
| 71 } | 71 } |
| 72 | 72 |
| 73 private final Container _container=new Container(); | 73 private final Container _container=new Container(); |
| 74 private final AttributesMap _attributes = new AttributesMap(); | 74 private final AttributesMap _attributes = new AttributesMap(); |
| 75 private ThreadPool _threadPool; | 75 private ThreadPool _threadPool; |
| 76 private Connector[] _connectors; | 76 private Connector[] _connectors; |
| 77 private SessionIdManager _sessionIdManager; | 77 private boolean _sendServerVersion = true; //send Server: header |
| 78 private boolean _sendServerVersion = true; //send Server: header | 78 private boolean _sendDateHeader = false; //send Date: header |
| 79 private boolean _sendDateHeader = false; //send Date: header | 79 private int _graceful=0; |
| 80 private int _graceful=0; | 80 private boolean _stopAtShutdown; |
| 81 private boolean _stopAtShutdown; | 81 private boolean _dumpAfterStart=false; |
| 82 private boolean _dumpAfterStart=false; | 82 private boolean _dumpBeforeStop=false; |
| 83 private boolean _dumpBeforeStop=false; | 83 private boolean _uncheckedPrintWriter=false; |
| 84 private boolean _uncheckedPrintWriter=false; | 84 |
| 85 | 85 |
| 86 | 86 /* ------------------------------------------------------------ */ |
| 87 /* ------------------------------------------------------------ */ | 87 public Server() |
| 88 public Server() | 88 { |
| 89 { | 89 setServer(this); |
| 90 setServer(this); | 90 } |
| 91 } | 91 |
| 92 | 92 /* ------------------------------------------------------------ */ |
| 93 /* ------------------------------------------------------------ */ | 93 /** Convenience constructor |
| 94 /** Convenience constructor | 94 * Creates server and a {@link SelectChannelConnector} at the passed port. |
| 95 * Creates server and a {@link SelectChannelConnector} at the passed port. | 95 */ |
| 96 */ | 96 public Server(int port) |
| 97 public Server(int port) | 97 { |
| 98 { | 98 setServer(this); |
| 99 setServer(this); | 99 |
| 100 | 100 Connector connector=new SelectChannelConnector(); |
| 101 Connector connector=new SelectChannelConnector(); | 101 connector.setPort(port); |
| 102 connector.setPort(port); | 102 setConnectors(new Connector[]{connector}); |
| 103 setConnectors(new Connector[]{connector}); | 103 } |
| 104 } | 104 |
| 105 | 105 /* ------------------------------------------------------------ */ |
| 106 /* ------------------------------------------------------------ */ | 106 /** Convenience constructor |
| 107 /** Convenience constructor | 107 * Creates server and a {@link SelectChannelConnector} at the passed address. |
| 108 * Creates server and a {@link SelectChannelConnector} at the passed address. | 108 */ |
| 109 */ | 109 public Server(InetSocketAddress addr) |
| 110 public Server(InetSocketAddress addr) | 110 { |
| 111 { | 111 setServer(this); |
| 112 setServer(this); | 112 |
| 113 | 113 Connector connector=new SelectChannelConnector(); |
| 114 Connector connector=new SelectChannelConnector(); | 114 connector.setHost(addr.getHostName()); |
| 115 connector.setHost(addr.getHostName()); | 115 connector.setPort(addr.getPort()); |
| 116 connector.setPort(addr.getPort()); | 116 setConnectors(new Connector[]{connector}); |
| 117 setConnectors(new Connector[]{connector}); | 117 } |
| 118 } | 118 |
| 119 | 119 |
| 120 | 120 /* ------------------------------------------------------------ */ |
| 121 /* ------------------------------------------------------------ */ | 121 public static String getVersion() |
| 122 public static String getVersion() | 122 { |
| 123 { | 123 return __version; |
| 124 return __version; | 124 } |
| 125 } | 125 |
| 126 | 126 /* ------------------------------------------------------------ */ |
| 127 /* ------------------------------------------------------------ */ | 127 /** |
| 128 /** | 128 * @return Returns the container. |
| 129 * @return Returns the container. | 129 */ |
| 130 */ | 130 public Container getContainer() |
| 131 public Container getContainer() | 131 { |
| 132 { | 132 return _container; |
| 133 return _container; | 133 } |
| 134 } | 134 |
| 135 | 135 /* ------------------------------------------------------------ */ |
| 136 /* ------------------------------------------------------------ */ | 136 public boolean getStopAtShutdown() |
| 137 public boolean getStopAtShutdown() | 137 { |
| 138 { | 138 return _stopAtShutdown; |
| 139 return _stopAtShutdown; | 139 } |
| 140 } | 140 |
| 141 | 141 /* ------------------------------------------------------------ */ |
| 142 /* ------------------------------------------------------------ */ | 142 public void setStopAtShutdown(boolean stop) |
| 143 public void setStopAtShutdown(boolean stop) | 143 { |
| 144 { | 144 //if we now want to stop |
| 145 //if we now want to stop | 145 if (stop) |
| 146 if (stop) | 146 { |
| 147 { | 147 //and we weren't stopping before |
| 148 //and we weren't stopping before | 148 if (!_stopAtShutdown) |
| 149 if (!_stopAtShutdown) | 149 { |
| 150 { | 150 //only register to stop if we're already started (otherwise we'll do it in doStart()) |
| 151 //only register to stop if we're already started (otherwise we'll do it in doStart()) | 151 if (isStarted()) |
| 152 if (isStarted()) | 152 ShutdownThread.register(this); |
| 153 ShutdownThread.register(this); | 153 } |
| 154 } | 154 } |
| 155 } | 155 else |
| 156 else | 156 ShutdownThread.deregister(this); |
| 157 ShutdownThread.deregister(this); | 157 |
| 158 | 158 _stopAtShutdown=stop; |
| 159 _stopAtShutdown=stop; | 159 } |
| 160 } | 160 |
| 161 | 161 /* ------------------------------------------------------------ */ |
| 162 /* ------------------------------------------------------------ */ | 162 /** |
| 163 /** | 163 * @return Returns the connectors. |
| 164 * @return Returns the connectors. | 164 */ |
| 165 */ | 165 public Connector[] getConnectors() |
| 166 public Connector[] getConnectors() | 166 { |
| 167 { | 167 return _connectors; |
| 168 return _connectors; | 168 } |
| 169 } | 169 |
| 170 | 170 /* ------------------------------------------------------------ */ |
| 171 /* ------------------------------------------------------------ */ | 171 public void addConnector(Connector connector) |
| 172 public void addConnector(Connector connector) | 172 { |
| 173 { | 173 setConnectors((Connector[])LazyList.addToArray(getConnectors(), connector, Connector.class)); |
| 174 setConnectors((Connector[])LazyList.addToArray(getConnectors(), connector, Connector.class)); | 174 } |
| 175 } | 175 |
| 176 | 176 /* ------------------------------------------------------------ */ |
| 177 /* ------------------------------------------------------------ */ | 177 /** |
| 178 /** | 178 * Conveniance method which calls {@link #getConnectors()} and {@link #setConnectors(Connector[])} to |
| 179 * Conveniance method which calls {@link #getConnectors()} and {@link #setConnectors(Connector[])} to | 179 * remove a connector. |
| 180 * remove a connector. | 180 * @param connector The connector to remove. |
| 181 * @param connector The connector to remove. | 181 */ |
| 182 */ | 182 public void removeConnector(Connector connector) { |
| 183 public void removeConnector(Connector connector) { | 183 setConnectors((Connector[])LazyList.removeFromArray (getConnectors(), connector)); |
| 184 setConnectors((Connector[])LazyList.removeFromArray (getConnectors(), connector)); | 184 } |
| 185 } | 185 |
| 186 | 186 /* ------------------------------------------------------------ */ |
| 187 /* ------------------------------------------------------------ */ | 187 /** Set the connectors for this server. |
| 188 /** Set the connectors for this server. | 188 * Each connector has this server set as it's ThreadPool and its Handler. |
| 189 * Each connector has this server set as it's ThreadPool and its Handler. | 189 * @param connectors The connectors to set. |
| 190 * @param connectors The connectors to set. | 190 */ |
| 191 */ | 191 public void setConnectors(Connector[] connectors) |
| 192 public void setConnectors(Connector[] connectors) | 192 { |
| 193 { | 193 if (connectors!=null) |
| 194 if (connectors!=null) | 194 { |
| 195 { | 195 for (int i=0;i<connectors.length;i++) |
| 196 for (int i=0;i<connectors.length;i++) | 196 connectors[i].setServer(this); |
| 197 connectors[i].setServer(this); | 197 } |
| 198 } | 198 |
| 199 | 199 _container.update(this, _connectors, connectors, "connector"); |
| 200 _container.update(this, _connectors, connectors, "connector"); | 200 _connectors = connectors; |
| 201 _connectors = connectors; | 201 } |
| 202 } | 202 |
| 203 | 203 /* ------------------------------------------------------------ */ |
| 204 /* ------------------------------------------------------------ */ | 204 /** |
| 205 /** | 205 * @return Returns the threadPool. |
| 206 * @return Returns the threadPool. | 206 */ |
| 207 */ | 207 public ThreadPool getThreadPool() |
| 208 public ThreadPool getThreadPool() | 208 { |
| 209 { | 209 return _threadPool; |
| 210 return _threadPool; | 210 } |
| 211 } | 211 |
| 212 | 212 /* ------------------------------------------------------------ */ |
| 213 /* ------------------------------------------------------------ */ | 213 /** |
| 214 /** | 214 * @param threadPool The threadPool to set. |
| 215 * @param threadPool The threadPool to set. | 215 */ |
| 216 */ | 216 public void setThreadPool(ThreadPool threadPool) |
| 217 public void setThreadPool(ThreadPool threadPool) | 217 { |
| 218 { | 218 if (_threadPool!=null) |
| 219 if (_threadPool!=null) | 219 removeBean(_threadPool); |
| 220 removeBean(_threadPool); | 220 _container.update(this, _threadPool, threadPool, "threadpool",false); |
| 221 _container.update(this, _threadPool, threadPool, "threadpool",false); | 221 _threadPool = threadPool; |
| 222 _threadPool = threadPool; | 222 if (_threadPool!=null) |
| 223 if (_threadPool!=null) | 223 addBean(_threadPool); |
| 224 addBean(_threadPool); | 224 } |
| 225 } | 225 |
| 226 | 226 /** |
| 227 /** | 227 * @return true if {@link #dumpStdErr()} is called after starting |
| 228 * @return true if {@link #dumpStdErr()} is called after starting | 228 */ |
| 229 */ | 229 public boolean isDumpAfterStart() |
| 230 public boolean isDumpAfterStart() | 230 { |
| 231 { | 231 return _dumpAfterStart; |
| 232 return _dumpAfterStart; | 232 } |
| 233 } | 233 |
| 234 | 234 /** |
| 235 /** | 235 * @param dumpAfterStart true if {@link #dumpStdErr()} is called after starting |
| 236 * @param dumpAfterStart true if {@link #dumpStdErr()} is called after starting | 236 */ |
| 237 */ | 237 public void setDumpAfterStart(boolean dumpAfterStart) |
| 238 public void setDumpAfterStart(boolean dumpAfterStart) | 238 { |
| 239 { | 239 _dumpAfterStart = dumpAfterStart; |
| 240 _dumpAfterStart = dumpAfterStart; | 240 } |
| 241 } | 241 |
| 242 | 242 /** |
| 243 /** | 243 * @return true if {@link #dumpStdErr()} is called before stopping |
| 244 * @return true if {@link #dumpStdErr()} is called before stopping | 244 */ |
| 245 */ | 245 public boolean isDumpBeforeStop() |
| 246 public boolean isDumpBeforeStop() | 246 { |
| 247 { | 247 return _dumpBeforeStop; |
| 248 return _dumpBeforeStop; | 248 } |
| 249 } | 249 |
| 250 | 250 /** |
| 251 /** | 251 * @param dumpBeforeStop true if {@link #dumpStdErr()} is called before stopping |
| 252 * @param dumpBeforeStop true if {@link #dumpStdErr()} is called before stopping | 252 */ |
| 253 */ | 253 public void setDumpBeforeStop(boolean dumpBeforeStop) |
| 254 public void setDumpBeforeStop(boolean dumpBeforeStop) | 254 { |
| 255 { | 255 _dumpBeforeStop = dumpBeforeStop; |
| 256 _dumpBeforeStop = dumpBeforeStop; | 256 } |
| 257 } | 257 |
| 258 | 258 |
| 259 | 259 |
| 260 | 260 /* ------------------------------------------------------------ */ |
| 261 /* ------------------------------------------------------------ */ | 261 @Override |
| 262 @Override | 262 protected void doStart() throws Exception |
| 263 protected void doStart() throws Exception | 263 { |
| 264 { | 264 if (getStopAtShutdown()) |
| 265 if (getStopAtShutdown()) | 265 { |
| 266 { | 266 ShutdownThread.register(this); |
| 267 ShutdownThread.register(this); | 267 } |
| 268 } | 268 |
| 269 | 269 ShutdownMonitor.getInstance().start(); // initialize |
| 270 ShutdownMonitor.getInstance().start(); // initialize | 270 |
| 271 | 271 LOG.info("jetty-"+__version); |
| 272 LOG.info("jetty-"+__version); | 272 HttpGenerator.setServerVersion(__version); |
| 273 HttpGenerator.setServerVersion(__version); | 273 |
| 274 | 274 MultiException mex=new MultiException(); |
| 275 MultiException mex=new MultiException(); | 275 |
| 276 | 276 if (_threadPool==null) |
| 277 if (_threadPool==null) | 277 setThreadPool(new QueuedThreadPool()); |
| 278 setThreadPool(new QueuedThreadPool()); | 278 |
| 279 | 279 try |
| 280 try | 280 { |
| 281 { | 281 super.doStart(); |
| 282 super.doStart(); | 282 } |
| 283 } | 283 catch(Throwable e) |
| 284 catch(Throwable e) | 284 { |
| 285 { | 285 mex.add(e); |
| 286 mex.add(e); | 286 } |
| 287 } | 287 |
| 288 | 288 if (_connectors!=null && mex.size()==0) |
| 289 if (_connectors!=null && mex.size()==0) | 289 { |
| 290 { | 290 for (int i=0;i<_connectors.length;i++) |
| 291 for (int i=0;i<_connectors.length;i++) | 291 { |
| 292 { | 292 try{_connectors[i].start();} |
| 293 try{_connectors[i].start();} | 293 catch(Throwable e) |
| 294 catch(Throwable e) | 294 { |
| 295 { | 295 mex.add(e); |
| 296 mex.add(e); | 296 } |
| 297 } | 297 } |
| 298 } | 298 } |
| 299 } | 299 |
| 300 | 300 if (isDumpAfterStart()) |
| 301 if (isDumpAfterStart()) | 301 dumpStdErr(); |
| 302 dumpStdErr(); | 302 |
| 303 | 303 mex.ifExceptionThrow(); |
| 304 mex.ifExceptionThrow(); | 304 } |
| 305 } | 305 |
| 306 | 306 /* ------------------------------------------------------------ */ |
| 307 /* ------------------------------------------------------------ */ | 307 @Override |
| 308 @Override | 308 protected void doStop() throws Exception |
| 309 protected void doStop() throws Exception | 309 { |
| 310 { | 310 if (isDumpBeforeStop()) |
| 311 if (isDumpBeforeStop()) | 311 dumpStdErr(); |
| 312 dumpStdErr(); | 312 |
| 313 | 313 MultiException mex=new MultiException(); |
| 314 MultiException mex=new MultiException(); | 314 |
| 315 | 315 if (_graceful>0) |
| 316 if (_graceful>0) | 316 { |
| 317 { | 317 if (_connectors!=null) |
| 318 if (_connectors!=null) | 318 { |
| 319 { | 319 for (int i=_connectors.length;i-->0;) |
| 320 for (int i=_connectors.length;i-->0;) | 320 { |
| 321 { | 321 LOG.info("Graceful shutdown {}",_connectors[i]); |
| 322 LOG.info("Graceful shutdown {}",_connectors[i]); | 322 try{_connectors[i].close();}catch(Throwable e){mex.add(e);} |
| 323 try{_connectors[i].close();}catch(Throwable e){mex.add(e);} | 323 } |
| 324 } | 324 } |
| 325 } | 325 |
| 326 | 326 Handler[] contexts = getChildHandlersByClass(Graceful.class); |
| 327 Handler[] contexts = getChildHandlersByClass(Graceful.class); | 327 for (int c=0;c<contexts.length;c++) |
| 328 for (int c=0;c<contexts.length;c++) | 328 { |
| 329 { | 329 Graceful context=(Graceful)contexts[c]; |
| 330 Graceful context=(Graceful)contexts[c]; | 330 LOG.info("Graceful shutdown {}",context); |
| 331 LOG.info("Graceful shutdown {}",context); | 331 context.setShutdown(true); |
| 332 context.setShutdown(true); | 332 } |
| 333 } | 333 Thread.sleep(_graceful); |
| 334 Thread.sleep(_graceful); | 334 } |
| 335 } | 335 |
| 336 | 336 if (_connectors!=null) |
| 337 if (_connectors!=null) | 337 { |
| 338 { | 338 for (int i=_connectors.length;i-->0;) |
| 339 for (int i=_connectors.length;i-->0;) | 339 try{_connectors[i].stop();}catch(Throwable e){mex.add(e);} |
| 340 try{_connectors[i].stop();}catch(Throwable e){mex.add(e);} | 340 } |
| 341 } | 341 |
| 342 | 342 try {super.doStop(); } catch(Throwable e) { mex.add(e);} |
| 343 try {super.doStop(); } catch(Throwable e) { mex.add(e);} | 343 |
| 344 | 344 mex.ifExceptionThrow(); |
| 345 mex.ifExceptionThrow(); | 345 |
| 346 | 346 if (getStopAtShutdown()) |
| 347 if (getStopAtShutdown()) | 347 ShutdownThread.deregister(this); |
| 348 ShutdownThread.deregister(this); | 348 } |
| 349 } | 349 |
| 350 | 350 /* ------------------------------------------------------------ */ |
| 351 /* ------------------------------------------------------------ */ | 351 /* Handle a request from a connection. |
| 352 /* Handle a request from a connection. | 352 * Called to handle a request on the connection when either the header has been received, |
| 353 * Called to handle a request on the connection when either the header has been received, | 353 * or after the entire request has been received (for short requests of known length), or |
| 354 * or after the entire request has been received (for short requests of known length), or | 354 * on the dispatch of an async request. |
| 355 * on the dispatch of an async request. | 355 */ |
| 356 */ | 356 public void handle(AbstractHttpConnection connection) throws IOException, ServletException |
| 357 public void handle(AbstractHttpConnection connection) throws IOException, ServletException | 357 { |
| 358 { | 358 final String target=connection.getRequest().getPathInfo(); |
| 359 final String target=connection.getRequest().getPathInfo(); | 359 final Request request=connection.getRequest(); |
| 360 final Request request=connection.getRequest(); | 360 final Response response=connection.getResponse(); |
| 361 final Response response=connection.getResponse(); | 361 |
| 362 | 362 if (LOG.isDebugEnabled()) |
| 363 if (LOG.isDebugEnabled()) | 363 { |
| 364 { | 364 LOG.debug("REQUEST "+target+" on "+connection); |
| 365 LOG.debug("REQUEST "+target+" on "+connection); | 365 handle(target, request, request, response); |
| 366 handle(target, request, request, response); | 366 LOG.debug("RESPONSE "+target+" "+connection.getResponse().getStatus()+" handled="+request.isHandled()); |
| 367 LOG.debug("RESPONSE "+target+" "+connection.getResponse().getStatus()+" handled="+request.isHandled()); | 367 } |
| 368 } | 368 else |
| 369 else | 369 handle(target, request, request, response); |
| 370 handle(target, request, request, response); | 370 } |
| 371 } | 371 |
| 372 | 372 /* ------------------------------------------------------------ */ |
| 373 /* ------------------------------------------------------------ */ | 373 /* Handle a request from a connection. |
| 374 /* Handle a request from a connection. | 374 * Called to handle a request on the connection when either the header has been received, |
| 375 * Called to handle a request on the connection when either the header has been received, | 375 * or after the entire request has been received (for short requests of known length), or |
| 376 * or after the entire request has been received (for short requests of known length), or | 376 * on the dispatch of an async request. |
| 377 * on the dispatch of an async request. | 377 */ |
| 378 */ | 378 public void handleAsync(AbstractHttpConnection connection) throws IOException, ServletException |
| 379 public void handleAsync(AbstractHttpConnection connection) throws IOException, ServletException | 379 { |
| 380 { | 380 final AsyncContinuation async = connection.getRequest().getAsyncContinuation(); |
| 381 final AsyncContinuation async = connection.getRequest().getAsyncContinuation(); | 381 final AsyncContinuation.AsyncEventState state = async.getAsyncEventState(); |
| 382 final AsyncContinuation.AsyncEventState state = async.getAsyncEventState(); | 382 |
| 383 | 383 final Request baseRequest=connection.getRequest(); |
| 384 final Request baseRequest=connection.getRequest(); | 384 final String path=state.getPath(); |
| 385 final String path=state.getPath(); | 385 |
| 386 | 386 if (path!=null) |
| 387 if (path!=null) | 387 { |
| 388 { | 388 // this is a dispatch with a path |
| 389 // this is a dispatch with a path | 389 final String contextPath=state.getServletContext().getContextPath(); |
| 390 final String contextPath=state.getServletContext().getContextPath(); | 390 HttpURI uri = new HttpURI(URIUtil.addPaths(contextPath,path)); |
| 391 HttpURI uri = new HttpURI(URIUtil.addPaths(contextPath,path)); | 391 baseRequest.setUri(uri); |
| 392 baseRequest.setUri(uri); | 392 baseRequest.setRequestURI(null); |
| 393 baseRequest.setRequestURI(null); | 393 baseRequest.setPathInfo(baseRequest.getRequestURI()); |
| 394 baseRequest.setPathInfo(baseRequest.getRequestURI()); | 394 if (uri.getQuery()!=null) |
| 395 if (uri.getQuery()!=null) | 395 baseRequest.mergeQueryString(uri.getQuery()); //we have to assume dispatch path and query are UTF8 |
| 396 baseRequest.mergeQueryString(uri.getQuery()); //we have to assume dispatch path and query are UTF8 | 396 } |
| 397 } | 397 |
| 398 | 398 final String target=baseRequest.getPathInfo(); |
| 399 final String target=baseRequest.getPathInfo(); | 399 final HttpServletRequest request=(HttpServletRequest)async.getRequest(); |
| 400 final HttpServletRequest request=(HttpServletRequest)async.getRequest(); | 400 final HttpServletResponse response=(HttpServletResponse)async.getResponse(); |
| 401 final HttpServletResponse response=(HttpServletResponse)async.getResponse(); | 401 |
| 402 | 402 if (LOG.isDebugEnabled()) |
| 403 if (LOG.isDebugEnabled()) | 403 { |
| 404 { | 404 LOG.debug("REQUEST "+target+" on "+connection); |
| 405 LOG.debug("REQUEST "+target+" on "+connection); | 405 handle(target, baseRequest, request, response); |
| 406 handle(target, baseRequest, request, response); | 406 LOG.debug("RESPONSE "+target+" "+connection.getResponse().getStatus()); |
| 407 LOG.debug("RESPONSE "+target+" "+connection.getResponse().getStatus()); | 407 } |
| 408 } | 408 else |
| 409 else | 409 handle(target, baseRequest, request, response); |
| 410 handle(target, baseRequest, request, response); | 410 |
| 411 | 411 } |
| 412 } | 412 |
| 413 | 413 |
| 414 | 414 /* ------------------------------------------------------------ */ |
| 415 /* ------------------------------------------------------------ */ | 415 public void join() throws InterruptedException |
| 416 public void join() throws InterruptedException | 416 { |
| 417 { | 417 getThreadPool().join(); |
| 418 getThreadPool().join(); | 418 } |
| 419 } | 419 |
| 420 | 420 /* ------------------------------------------------------------ */ |
| 421 /* ------------------------------------------------------------ */ | 421 |
| 422 /* ------------------------------------------------------------ */ | 422 /* ------------------------------------------------------------ */ |
| 423 /** | 423 public void setSendServerVersion (boolean sendServerVersion) |
| 424 * @return Returns the sessionIdManager. | 424 { |
| 425 */ | 425 _sendServerVersion = sendServerVersion; |
| 426 public SessionIdManager getSessionIdManager() | 426 } |
| 427 { | 427 |
| 428 return _sessionIdManager; | 428 /* ------------------------------------------------------------ */ |
| 429 } | 429 public boolean getSendServerVersion() |
| 430 | 430 { |
| 431 /* ------------------------------------------------------------ */ | 431 return _sendServerVersion; |
| 432 /* ------------------------------------------------------------ */ | 432 } |
| 433 /** | 433 |
| 434 * @param sessionIdManager The sessionIdManager to set. | 434 /* ------------------------------------------------------------ */ |
| 435 */ | 435 /** |
| 436 public void setSessionIdManager(SessionIdManager sessionIdManager) | 436 * @param sendDateHeader |
| 437 { | 437 */ |
| 438 if (_sessionIdManager!=null) | 438 public void setSendDateHeader(boolean sendDateHeader) |
| 439 removeBean(_sessionIdManager); | 439 { |
| 440 _container.update(this, _sessionIdManager, sessionIdManager, "sessionIdManager",false); | 440 _sendDateHeader = sendDateHeader; |
| 441 _sessionIdManager = sessionIdManager; | 441 } |
| 442 if (_sessionIdManager!=null) | 442 |
| 443 addBean(_sessionIdManager); | 443 /* ------------------------------------------------------------ */ |
| 444 } | 444 public boolean getSendDateHeader() |
| 445 | 445 { |
| 446 /* ------------------------------------------------------------ */ | 446 return _sendDateHeader; |
| 447 public void setSendServerVersion (boolean sendServerVersion) | 447 } |
| 448 { | 448 |
| 449 _sendServerVersion = sendServerVersion; | 449 /* ------------------------------------------------------------ */ |
| 450 } | 450 /** |
| 451 | 451 */ |
| 452 /* ------------------------------------------------------------ */ | 452 @Deprecated |
| 453 public boolean getSendServerVersion() | 453 public int getMaxCookieVersion() |
| 454 { | 454 { |
| 455 return _sendServerVersion; | 455 return 1; |
| 456 } | 456 } |
| 457 | 457 |
| 458 /* ------------------------------------------------------------ */ | 458 /* ------------------------------------------------------------ */ |
| 459 /** | 459 /** |
| 460 * @param sendDateHeader | 460 */ |
| 461 */ | 461 @Deprecated |
| 462 public void setSendDateHeader(boolean sendDateHeader) | 462 public void setMaxCookieVersion(int maxCookieVersion) |
| 463 { | 463 { |
| 464 _sendDateHeader = sendDateHeader; | 464 } |
| 465 } | 465 |
| 466 | 466 /* ------------------------------------------------------------ */ |
| 467 /* ------------------------------------------------------------ */ | 467 /** |
| 468 public boolean getSendDateHeader() | 468 * Add a LifeCycle object to be started/stopped |
| 469 { | 469 * along with the Server. |
| 470 return _sendDateHeader; | 470 * @deprecated Use {@link #addBean(Object)} |
| 471 } | 471 * @param c |
| 472 | 472 */ |
| 473 /* ------------------------------------------------------------ */ | 473 @Deprecated |
| 474 /** | 474 public void addLifeCycle (LifeCycle c) |
| 475 */ | 475 { |
| 476 @Deprecated | 476 addBean(c); |
| 477 public int getMaxCookieVersion() | 477 } |
| 478 { | 478 |
| 479 return 1; | 479 /* ------------------------------------------------------------ */ |
| 480 } | 480 /** |
| 481 | 481 * Add an associated bean. |
| 482 /* ------------------------------------------------------------ */ | 482 * The bean will be added to the servers {@link Container} |
| 483 /** | 483 * and if it is a {@link LifeCycle} instance, it will be |
| 484 */ | 484 * started/stopped along with the Server. Any beans that are also |
| 485 @Deprecated | 485 * {@link Destroyable}, will be destroyed with the server. |
| 486 public void setMaxCookieVersion(int maxCookieVersion) | 486 * @param o the bean object to add |
| 487 { | 487 */ |
| 488 } | 488 @Override |
| 489 | 489 public boolean addBean(Object o) |
| 490 /* ------------------------------------------------------------ */ | 490 { |
| 491 /** | 491 if (super.addBean(o)) |
| 492 * Add a LifeCycle object to be started/stopped | 492 { |
| 493 * along with the Server. | 493 _container.addBean(o); |
| 494 * @deprecated Use {@link #addBean(Object)} | 494 return true; |
| 495 * @param c | 495 } |
| 496 */ | 496 return false; |
| 497 @Deprecated | 497 } |
| 498 public void addLifeCycle (LifeCycle c) | 498 |
| 499 { | 499 /** |
| 500 addBean(c); | 500 * Remove a LifeCycle object to be started/stopped |
| 501 } | 501 * along with the Server |
| 502 | 502 * @deprecated Use {@link #removeBean(Object)} |
| 503 /* ------------------------------------------------------------ */ | 503 */ |
| 504 /** | 504 @Deprecated |
| 505 * Add an associated bean. | 505 public void removeLifeCycle (LifeCycle c) |
| 506 * The bean will be added to the servers {@link Container} | 506 { |
| 507 * and if it is a {@link LifeCycle} instance, it will be | 507 removeBean(c); |
| 508 * started/stopped along with the Server. Any beans that are also | 508 } |
| 509 * {@link Destroyable}, will be destroyed with the server. | 509 |
| 510 * @param o the bean object to add | 510 /* ------------------------------------------------------------ */ |
| 511 */ | 511 /** |
| 512 @Override | 512 * Remove an associated bean. |
| 513 public boolean addBean(Object o) | 513 */ |
| 514 { | 514 @Override |
| 515 if (super.addBean(o)) | 515 public boolean removeBean (Object o) |
| 516 { | 516 { |
| 517 _container.addBean(o); | 517 if (super.removeBean(o)) |
| 518 return true; | 518 { |
| 519 } | 519 _container.removeBean(o); |
| 520 return false; | 520 return true; |
| 521 } | 521 } |
| 522 | 522 return false; |
| 523 /** | 523 } |
| 524 * Remove a LifeCycle object to be started/stopped | 524 |
| 525 * along with the Server | 525 /* ------------------------------------------------------------ */ |
| 526 * @deprecated Use {@link #removeBean(Object)} | 526 /* |
| 527 */ | 527 * @see org.eclipse.util.AttributesMap#clearAttributes() |
| 528 @Deprecated | 528 */ |
| 529 public void removeLifeCycle (LifeCycle c) | 529 public void clearAttributes() |
| 530 { | 530 { |
| 531 removeBean(c); | 531 _attributes.clearAttributes(); |
| 532 } | 532 } |
| 533 | 533 |
| 534 /* ------------------------------------------------------------ */ | 534 /* ------------------------------------------------------------ */ |
| 535 /** | 535 /* |
| 536 * Remove an associated bean. | 536 * @see org.eclipse.util.AttributesMap#getAttribute(java.lang.String) |
| 537 */ | 537 */ |
| 538 @Override | 538 public Object getAttribute(String name) |
| 539 public boolean removeBean (Object o) | 539 { |
| 540 { | 540 return _attributes.getAttribute(name); |
| 541 if (super.removeBean(o)) | 541 } |
| 542 { | 542 |
| 543 _container.removeBean(o); | 543 /* ------------------------------------------------------------ */ |
| 544 return true; | 544 /* |
| 545 } | 545 * @see org.eclipse.util.AttributesMap#getAttributeNames() |
| 546 return false; | 546 */ |
| 547 } | 547 public Enumeration getAttributeNames() |
| 548 | 548 { |
| 549 /* ------------------------------------------------------------ */ | 549 return AttributesMap.getAttributeNamesCopy(_attributes); |
| 550 /* | 550 } |
| 551 * @see org.eclipse.util.AttributesMap#clearAttributes() | 551 |
| 552 */ | 552 /* ------------------------------------------------------------ */ |
| 553 public void clearAttributes() | 553 /* |
| 554 { | 554 * @see org.eclipse.util.AttributesMap#removeAttribute(java.lang.String) |
| 555 _attributes.clearAttributes(); | 555 */ |
| 556 } | 556 public void removeAttribute(String name) |
| 557 | 557 { |
| 558 /* ------------------------------------------------------------ */ | 558 _attributes.removeAttribute(name); |
| 559 /* | 559 } |
| 560 * @see org.eclipse.util.AttributesMap#getAttribute(java.lang.String) | 560 |
| 561 */ | 561 /* ------------------------------------------------------------ */ |
| 562 public Object getAttribute(String name) | 562 /* |
| 563 { | 563 * @see org.eclipse.util.AttributesMap#setAttribute(java.lang.String, java.lang.Object) |
| 564 return _attributes.getAttribute(name); | 564 */ |
| 565 } | 565 public void setAttribute(String name, Object attribute) |
| 566 | 566 { |
| 567 /* ------------------------------------------------------------ */ | 567 _attributes.setAttribute(name, attribute); |
| 568 /* | 568 } |
| 569 * @see org.eclipse.util.AttributesMap#getAttributeNames() | 569 |
| 570 */ | 570 /* ------------------------------------------------------------ */ |
| 571 public Enumeration getAttributeNames() | 571 /** |
| 572 { | 572 * @return the graceful |
| 573 return AttributesMap.getAttributeNamesCopy(_attributes); | 573 */ |
| 574 } | 574 public int getGracefulShutdown() |
| 575 | 575 { |
| 576 /* ------------------------------------------------------------ */ | 576 return _graceful; |
| 577 /* | 577 } |
| 578 * @see org.eclipse.util.AttributesMap#removeAttribute(java.lang.String) | 578 |
| 579 */ | 579 /* ------------------------------------------------------------ */ |
| 580 public void removeAttribute(String name) | 580 /** |
| 581 { | 581 * Set graceful shutdown timeout. If set, the internal <code>doStop()</code> method will not immediately stop the |
| 582 _attributes.removeAttribute(name); | 582 * server. Instead, all {@link Connector}s will be closed so that new connections will not be accepted |
| 583 } | 583 * and all handlers that implement {@link Graceful} will be put into the shutdown mode so that no new requests |
| 584 | 584 * will be accepted, but existing requests can complete. The server will then wait the configured timeout |
| 585 /* ------------------------------------------------------------ */ | 585 * before stopping. |
| 586 /* | 586 * @param timeoutMS the milliseconds to wait for existing request to complete before stopping the server. |
| 587 * @see org.eclipse.util.AttributesMap#setAttribute(java.lang.String, java.lang.Object) | 587 * |
| 588 */ | 588 */ |
| 589 public void setAttribute(String name, Object attribute) | 589 public void setGracefulShutdown(int timeoutMS) |
| 590 { | 590 { |
| 591 _attributes.setAttribute(name, attribute); | 591 _graceful=timeoutMS; |
| 592 } | 592 } |
| 593 | 593 |
| 594 /* ------------------------------------------------------------ */ | 594 /* ------------------------------------------------------------ */ |
| 595 /** | 595 @Override |
| 596 * @return the graceful | 596 public String toString() |
| 597 */ | 597 { |
| 598 public int getGracefulShutdown() | 598 return this.getClass().getName()+"@"+Integer.toHexString(hashCode()); |
| 599 { | 599 } |
| 600 return _graceful; | 600 |
| 601 } | 601 /* ------------------------------------------------------------ */ |
| 602 | 602 @Override |
| 603 /* ------------------------------------------------------------ */ | 603 public void dump(Appendable out,String indent) throws IOException |
| 604 /** | 604 { |
| 605 * Set graceful shutdown timeout. If set, the internal <code>doStop()</code> method will not immediately stop the | 605 dumpThis(out); |
| 606 * server. Instead, all {@link Connector}s will be closed so that new connections will not be accepted | 606 dump(out,indent,TypeUtil.asList(getHandlers()),getBeans(),TypeUtil.asList(_connectors)); |
| 607 * and all handlers that implement {@link Graceful} will be put into the shutdown mode so that no new requests | 607 } |
| 608 * will be accepted, but existing requests can complete. The server will then wait the configured timeout | 608 |
| 609 * before stopping. | 609 |
| 610 * @param timeoutMS the milliseconds to wait for existing request to complete before stopping the server. | 610 /* ------------------------------------------------------------ */ |
| 611 * | 611 public boolean isUncheckedPrintWriter() |
| 612 */ | 612 { |
| 613 public void setGracefulShutdown(int timeoutMS) | 613 return _uncheckedPrintWriter; |
| 614 { | 614 } |
| 615 _graceful=timeoutMS; | 615 |
| 616 } | 616 /* ------------------------------------------------------------ */ |
| 617 | 617 public void setUncheckedPrintWriter(boolean unchecked) |
| 618 /* ------------------------------------------------------------ */ | 618 { |
| 619 @Override | 619 _uncheckedPrintWriter=unchecked; |
| 620 public String toString() | 620 } |
| 621 { | 621 |
| 622 return this.getClass().getName()+"@"+Integer.toHexString(hashCode()); | 622 |
| 623 } | 623 /* ------------------------------------------------------------ */ |
| 624 | 624 /* A handler that can be gracefully shutdown. |
| 625 /* ------------------------------------------------------------ */ | 625 * Called by doStop if a {@link #setGracefulShutdown} period is set. |
| 626 @Override | 626 * TODO move this somewhere better |
| 627 public void dump(Appendable out,String indent) throws IOException | 627 */ |
| 628 { | 628 public interface Graceful extends Handler |
| 629 dumpThis(out); | 629 { |
| 630 dump(out,indent,TypeUtil.asList(getHandlers()),getBeans(),TypeUtil.asList(_connectors)); | 630 public void setShutdown(boolean shutdown); |
| 631 } | 631 } |
| 632 | 632 |
| 633 | 633 /* ------------------------------------------------------------ */ |
| 634 /* ------------------------------------------------------------ */ | 634 public static void main(String...args) throws Exception |
| 635 public boolean isUncheckedPrintWriter() | 635 { |
| 636 { | 636 System.err.println(getVersion()); |
| 637 return _uncheckedPrintWriter; | 637 } |
| 638 } | |
| 639 | |
| 640 /* ------------------------------------------------------------ */ | |
| 641 public void setUncheckedPrintWriter(boolean unchecked) | |
| 642 { | |
| 643 _uncheckedPrintWriter=unchecked; | |
| 644 } | |
| 645 | |
| 646 | |
| 647 /* ------------------------------------------------------------ */ | |
| 648 /* A handler that can be gracefully shutdown. | |
| 649 * Called by doStop if a {@link #setGracefulShutdown} period is set. | |
| 650 * TODO move this somewhere better | |
| 651 */ | |
| 652 public interface Graceful extends Handler | |
| 653 { | |
| 654 public void setShutdown(boolean shutdown); | |
| 655 } | |
| 656 | |
| 657 /* ------------------------------------------------------------ */ | |
| 658 public static void main(String...args) throws Exception | |
| 659 { | |
| 660 System.err.println(getVersion()); | |
| 661 } | |
| 662 } | 638 } |
