comparison src/org/eclipse/jetty/server/BlockingHttpConnection.java @ 874:ad495e897c32

minor
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 04 Oct 2016 13:34:23 -0600
parents 8e9db0bbf4f9
children fe461f7cfc8e
comparison
equal deleted inserted replaced
873:220ad4853cda 874:ad495e897c32
33 /* ------------------------------------------------------------ */ 33 /* ------------------------------------------------------------ */
34 /** Blocking Server HTTP Connection 34 /** Blocking Server HTTP Connection
35 */ 35 */
36 public class BlockingHttpConnection extends AbstractHttpConnection 36 public class BlockingHttpConnection extends AbstractHttpConnection
37 { 37 {
38 private static final Logger LOG = LoggerFactory.getLogger(BlockingHttpConnection.class); 38 private static final Logger LOG = LoggerFactory.getLogger(BlockingHttpConnection.class);
39 39
40 public BlockingHttpConnection(Connector connector, EndPoint endpoint, Server server) 40 public BlockingHttpConnection(Connector connector, EndPoint endpoint, Server server)
41 { 41 {
42 super(connector,endpoint,server); 42 super(connector,endpoint,server);
43 } 43 }
44 44
45 public BlockingHttpConnection(Connector connector, EndPoint endpoint, Server server, Parser parser, Generator generator, Request request) 45 public BlockingHttpConnection(Connector connector, EndPoint endpoint, Server server, Parser parser, Generator generator, Request request)
46 { 46 {
47 super(connector,endpoint,server,parser,generator,request); 47 super(connector,endpoint,server,parser,generator,request);
48 } 48 }
49 49
50 @Override 50 @Override
51 protected void handleRequest() throws IOException 51 protected void handleRequest() throws IOException
52 { 52 {
53 super.handleRequest(); 53 super.handleRequest();
54 } 54 }
55 55
56 public Connection handle() throws IOException 56 public Connection handle() throws IOException
57 { 57 {
58 Connection connection = this; 58 Connection connection = this;
59 59
60 try 60 try
61 { 61 {
62 setCurrentConnection(this); 62 setCurrentConnection(this);
63 63
64 // do while the endpoint is open 64 // do while the endpoint is open
65 // AND the connection has not changed 65 // AND the connection has not changed
66 while (_endp.isOpen() && connection==this) 66 while (_endp.isOpen() && connection==this)
67 { 67 {
68 try 68 try
69 { 69 {
70 // If we are not ended then parse available 70 // If we are not ended then parse available
71 if (!_parser.isComplete() && !_endp.isInputShutdown()) 71 if (!_parser.isComplete() && !_endp.isInputShutdown())
72 _parser.parseAvailable(); 72 _parser.parseAvailable();
73 73
74 // Do we have more generating to do? 74 // Do we have more generating to do?
75 // Loop here because some writes may take multiple steps and 75 // Loop here because some writes may take multiple steps and
76 // we need to flush them all before potentially blocking in the 76 // we need to flush them all before potentially blocking in the
77 // next loop. 77 // next loop.
78 if (_generator.isCommitted() && !_generator.isComplete() && !_endp.isOutputShutdown()) 78 if (_generator.isCommitted() && !_generator.isComplete() && !_endp.isOutputShutdown())
79 _generator.flushBuffer(); 79 _generator.flushBuffer();
80 80
81 // Flush buffers 81 // Flush buffers
82 _endp.flush(); 82 _endp.flush();
83 } 83 }
84 catch (HttpException e) 84 catch (HttpException e)
85 { 85 {
86 if (LOG.isDebugEnabled()) 86 if (LOG.isDebugEnabled())
87 { 87 {
88 LOG.debug("uri="+_uri); 88 LOG.debug("uri="+_uri);
89 LOG.debug("fields="+_requestFields); 89 LOG.debug("fields="+_requestFields);
90 LOG.debug("",e); 90 LOG.debug("",e);
91 } 91 }
92 _generator.sendError(e.getStatus(), e.getReason(), null, true); 92 _generator.sendError(e.getStatus(), e.getReason(), null, true);
93 _parser.reset(); 93 _parser.reset();
94 _endp.shutdownOutput(); 94 _endp.shutdownOutput();
95 } 95 }
96 finally 96 finally
97 { 97 {
98 // Is this request/response round complete and are fully flushed? 98 // Is this request/response round complete and are fully flushed?
99 if (_parser.isComplete() && _generator.isComplete()) 99 if (_parser.isComplete() && _generator.isComplete())
100 { 100 {
101 // Reset the parser/generator 101 // Reset the parser/generator
102 reset(); 102 reset();
103 103
104 // look for a switched connection instance? 104 // look for a switched connection instance?
105 if (_response.getStatus()==HttpStatus.SWITCHING_PROTOCOLS_101) 105 if (_response.getStatus()==HttpStatus.SWITCHING_PROTOCOLS_101)
106 { 106 {
107 Connection switched=(Connection)_request.getAttribute("org.eclipse.jetty.io.Connection"); 107 Connection switched=(Connection)_request.getAttribute("org.eclipse.jetty.io.Connection");
108 if (switched!=null) 108 if (switched!=null)
109 connection=switched; 109 connection=switched;
110 } 110 }
111 111
112 // TODO Is this required? 112 // TODO Is this required?
113 if (!_generator.isPersistent() && !_endp.isOutputShutdown()) 113 if (!_generator.isPersistent() && !_endp.isOutputShutdown())
114 { 114 {
115 LOG.warn("Safety net oshut!!! Please open a bugzilla"); 115 LOG.warn("Safety net oshut!!! Please open a bugzilla");
116 _endp.shutdownOutput(); 116 _endp.shutdownOutput();
117 } 117 }
118 } 118 }
119 119
120 // If we don't have a committed response and we are not suspended 120 // If we don't have a committed response and we are not suspended
121 if (_endp.isInputShutdown() && _generator.isIdle() && !_request.getAsyncContinuation().isSuspended()) 121 if (_endp.isInputShutdown() && _generator.isIdle() && !_request.getAsyncContinuation().isSuspended())
122 { 122 {
123 // then no more can happen, so close. 123 // then no more can happen, so close.
124 _endp.close(); 124 _endp.close();
125 } 125 }
126 } 126 }
127 } 127 }
128 128
129 return connection; 129 return connection;
130 } 130 }
131 finally 131 finally
132 { 132 {
133 setCurrentConnection(null); 133 setCurrentConnection(null);
134 _parser.returnBuffers(); 134 _parser.returnBuffers();
135 _generator.returnBuffers(); 135 _generator.returnBuffers();
136 } 136 }
137 } 137 }
138 } 138 }