Mercurial Hosting > luan
comparison src/org/eclipse/jetty/server/AbstractHttpConnection.java @ 939:8db5996c8c89
remove AsyncContinuation
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 10 Oct 2016 00:50:06 -0600 |
parents | fe461f7cfc8e |
children | 1094975d013b |
comparison
equal
deleted
inserted
replaced
938:a088981f9cd4 | 939:8db5996c8c89 |
---|---|
388 _uri.clear(); | 388 _uri.clear(); |
389 _writer=null; | 389 _writer=null; |
390 _earlyEOF = false; | 390 _earlyEOF = false; |
391 } | 391 } |
392 | 392 |
393 /* ------------------------------------------------------------ */ | |
394 protected void handleRequest() throws IOException | 393 protected void handleRequest() throws IOException |
395 { | 394 { |
396 boolean error = false; | 395 boolean error = false; |
397 | 396 |
398 String threadName=null; | |
399 Throwable async_exception=null; | |
400 try | 397 try |
401 { | 398 { |
402 if (LOG.isDebugEnabled()) | |
403 { | |
404 threadName=Thread.currentThread().getName(); | |
405 Thread.currentThread().setName(threadName+" - "+_uri); | |
406 } | |
407 | |
408 | |
409 // Loop here to handle async request redispatches. | 399 // Loop here to handle async request redispatches. |
410 // The loop is controlled by the call to async.unhandle in the | 400 // The loop is controlled by the call to async.unhandle in the |
411 // finally block below. If call is from a non-blocking connector, | 401 // finally block below. If call is from a non-blocking connector, |
412 // then the unhandle will return false only if an async dispatch has | 402 // then the unhandle will return false only if an async dispatch has |
413 // already happened when unhandle is called. For a blocking connector, | 403 // already happened when unhandle is called. For a blocking connector, |
414 // the wait for the asynchronous dispatch or timeout actually happens | 404 // the wait for the asynchronous dispatch or timeout actually happens |
415 // within the call to unhandle(). | 405 // within the call to unhandle(). |
416 | 406 |
417 final Server server=_server; | 407 _request.setHandled(false); |
418 _request._async.handling(); | 408 |
419 if(server!=null && server.isRunning()) | 409 String info=null; |
420 { | 410 try |
421 _request.setHandled(false); | 411 { |
422 | 412 _uri.getPort(); |
423 String info=null; | 413 String path = null; |
414 | |
424 try | 415 try |
425 { | 416 { |
426 _uri.getPort(); | 417 path = _uri.getDecodedPath(); |
427 String path = null; | 418 } |
428 | 419 catch (Exception e) |
429 try | 420 { |
421 LOG.warn("Failed UTF-8 decode for request path, trying ISO-8859-1"); | |
422 LOG.trace("",e); | |
423 path = _uri.getDecodedPath(StringUtil.__ISO_8859_1); | |
424 } | |
425 | |
426 info = URIUtil.canonicalPath(path); | |
427 if (info==null && !_request.getMethod().equals(HttpMethods.CONNECT)) | |
428 { | |
429 if (path==null && _uri.getScheme()!=null && _uri.getHost()!=null) | |
430 { | 430 { |
431 path = _uri.getDecodedPath(); | 431 info="/"; |
432 } | 432 _request.setRequestURI(""); |
433 catch (Exception e) | |
434 { | |
435 LOG.warn("Failed UTF-8 decode for request path, trying ISO-8859-1"); | |
436 LOG.trace("",e); | |
437 path = _uri.getDecodedPath(StringUtil.__ISO_8859_1); | |
438 } | |
439 | |
440 info=URIUtil.canonicalPath(path); | |
441 if (info==null && !_request.getMethod().equals(HttpMethods.CONNECT)) | |
442 { | |
443 if (path==null && _uri.getScheme()!=null && _uri.getHost()!=null) | |
444 { | |
445 info="/"; | |
446 _request.setRequestURI(""); | |
447 } | |
448 else | |
449 throw new HttpException(400); | |
450 } | |
451 _request.setPathInfo(info); | |
452 | |
453 if (_out!=null) | |
454 _out.reopen(); | |
455 | |
456 _request.setDispatcherType(DispatcherType.REQUEST); | |
457 _connector.customize(_endp, _request); | |
458 server.handle(this); | |
459 } | |
460 catch (EofException e) | |
461 { | |
462 async_exception=e; | |
463 LOG.debug("",e); | |
464 error=true; | |
465 _request.setHandled(true); | |
466 if (!_response.isCommitted()) | |
467 _generator.sendError(500, null, null, true); | |
468 } | |
469 catch (RuntimeIOException e) | |
470 { | |
471 async_exception=e; | |
472 LOG.debug("",e); | |
473 error=true; | |
474 _request.setHandled(true); | |
475 } | |
476 catch (HttpException e) | |
477 { | |
478 LOG.debug("",e); | |
479 error=true; | |
480 _request.setHandled(true); | |
481 _response.sendError(e.getStatus(), e.getReason()); | |
482 } | |
483 catch (Throwable e) | |
484 { | |
485 async_exception=e; | |
486 LOG.warn(String.valueOf(_uri),e); | |
487 error=true; | |
488 _request.setHandled(true); | |
489 _generator.sendError(info==null?400:500, null, null, true); | |
490 | |
491 } | |
492 finally | |
493 { | |
494 _request._async.unhandle(); | |
495 } | |
496 } | |
497 } | |
498 finally | |
499 { | |
500 if (threadName!=null) | |
501 Thread.currentThread().setName(threadName); | |
502 | |
503 if (_request._async.isUncompleted()) | |
504 { | |
505 | |
506 _request._async.doComplete(async_exception); | |
507 | |
508 if (_expect100Continue) | |
509 { | |
510 LOG.debug("100 continues not sent"); | |
511 // We didn't send 100 continues, but the latest interpretation | |
512 // of the spec (see httpbis) is that the client will either | |
513 // send the body anyway, or close. So we no longer need to | |
514 // do anything special here other than make the connection not persistent | |
515 _expect100Continue = false; | |
516 if (!_response.isCommitted()) | |
517 _generator.setPersistent(false); | |
518 } | |
519 | |
520 if(_endp.isOpen()) | |
521 { | |
522 if (error) | |
523 { | |
524 _endp.shutdownOutput(); | |
525 _generator.setPersistent(false); | |
526 if (!_generator.isComplete()) | |
527 _response.complete(); | |
528 } | 433 } |
529 else | 434 else |
530 { | 435 throw new HttpException(400); |
531 if (!_response.isCommitted() && !_request.isHandled()) | 436 } |
532 _response.sendError(HttpServletResponse.SC_NOT_FOUND); | 437 _request.setPathInfo(info); |
438 | |
439 if (_out!=null) | |
440 _out.reopen(); | |
441 | |
442 _request.setDispatcherType(DispatcherType.REQUEST); | |
443 _connector.customize(_endp, _request); | |
444 _server.handle(this); | |
445 } | |
446 catch (EofException e) | |
447 { | |
448 LOG.debug("",e); | |
449 error=true; | |
450 _request.setHandled(true); | |
451 if (!_response.isCommitted()) | |
452 _generator.sendError(500, null, null, true); | |
453 } | |
454 catch (RuntimeIOException e) | |
455 { | |
456 LOG.debug("",e); | |
457 error=true; | |
458 _request.setHandled(true); | |
459 } | |
460 catch (HttpException e) | |
461 { | |
462 LOG.debug("",e); | |
463 error=true; | |
464 _request.setHandled(true); | |
465 _response.sendError(e.getStatus(), e.getReason()); | |
466 } | |
467 catch (Throwable e) | |
468 { | |
469 LOG.warn(String.valueOf(_uri),e); | |
470 error=true; | |
471 _request.setHandled(true); | |
472 _generator.sendError(info==null?400:500, null, null, true); | |
473 | |
474 } | |
475 } | |
476 finally | |
477 { | |
478 if (_expect100Continue) | |
479 { | |
480 LOG.debug("100 continues not sent"); | |
481 // We didn't send 100 continues, but the latest interpretation | |
482 // of the spec (see httpbis) is that the client will either | |
483 // send the body anyway, or close. So we no longer need to | |
484 // do anything special here other than make the connection not persistent | |
485 _expect100Continue = false; | |
486 if (!_response.isCommitted()) | |
487 _generator.setPersistent(false); | |
488 } | |
489 | |
490 if(_endp.isOpen()) | |
491 { | |
492 if (error) | |
493 { | |
494 _endp.shutdownOutput(); | |
495 _generator.setPersistent(false); | |
496 if (!_generator.isComplete()) | |
533 _response.complete(); | 497 _response.complete(); |
534 if (_generator.isPersistent()) | |
535 _connector.persist(_endp); | |
536 } | |
537 } | 498 } |
538 else | 499 else |
539 { | 500 { |
501 if (!_response.isCommitted() && !_request.isHandled()) | |
502 _response.sendError(HttpServletResponse.SC_NOT_FOUND); | |
540 _response.complete(); | 503 _response.complete(); |
541 } | 504 if (_generator.isPersistent()) |
542 | 505 _connector.persist(_endp); |
543 _request.setHandled(true); | 506 } |
544 } | 507 } |
508 else | |
509 { | |
510 _response.complete(); | |
511 } | |
512 | |
513 _request.setHandled(true); | |
545 } | 514 } |
546 } | 515 } |
547 | 516 |
548 /* ------------------------------------------------------------ */ | 517 /* ------------------------------------------------------------ */ |
549 public abstract Connection handle() throws IOException; | 518 public abstract Connection handle() throws IOException; |