1 package org.eclipse.jetty.server;
2
3 import java.io.IOException;
4
5 import org.eclipse.jetty.http.Generator;
6 import org.eclipse.jetty.http.HttpException;
7 import org.eclipse.jetty.http.HttpStatus;
8 import org.eclipse.jetty.http.Parser;
9 import org.eclipse.jetty.io.AsyncEndPoint;
10 import org.eclipse.jetty.io.Connection;
11 import org.eclipse.jetty.io.EndPoint;
12 import org.eclipse.jetty.util.log.Log;
13
14 public class BlockingHttpConnection extends HttpConnection
15 {
16 private volatile boolean _handling;
17
18 public BlockingHttpConnection(Connector connector, EndPoint endpoint, Server server)
19 {
20 super(connector,endpoint,server);
21 }
22
23
24 public BlockingHttpConnection(Connector connector, EndPoint endpoint, Server server, Parser parser, Generator generator, Request request)
25 {
26 super(connector,endpoint,server,parser,generator,request);
27 }
28
29
30 public Connection handle() throws IOException
31 {
32 Connection connection = this;
33
34
35 boolean more_in_buffer =true;
36
37 try
38 {
39 setCurrentConnection(this);
40
41 while (more_in_buffer && _endp.isOpen())
42 {
43 try
44 {
45
46 if (!_parser.isComplete())
47 _parser.parseAvailable();
48
49
50
51
52
53 while (_generator.isCommitted() && !_generator.isComplete())
54 {
55 long written=_generator.flushBuffer();
56 if (written<=0)
57 break;
58 if (_endp.isBufferingOutput())
59 _endp.flush();
60 }
61
62
63 if (_endp.isBufferingOutput())
64 _endp.flush();
65
66 }
67 catch (HttpException e)
68 {
69 if (Log.isDebugEnabled())
70 {
71 Log.debug("uri="+_uri);
72 Log.debug("fields="+_requestFields);
73 Log.debug(e);
74 }
75 _generator.sendError(e.getStatus(), e.getReason(), null, true);
76
77 _parser.reset();
78 _endp.close();
79 }
80 finally
81 {
82 more_in_buffer = _parser.isMoreInBuffer() || _endp.isBufferingInput();
83
84
85 if (_parser.isComplete() && _generator.isComplete() && !_endp.isBufferingOutput())
86 {
87
88 Connection switched=(_response.getStatus()==HttpStatus.SWITCHING_PROTOCOLS_101)
89 ?(Connection)_request.getAttribute("org.eclipse.jetty.io.Connection"):null;
90
91
92 if (switched!=null)
93 {
94 _parser.reset();
95 _generator.reset(true);
96 connection=switched;
97 }
98 else
99 {
100
101 if (!_generator.isPersistent() || _endp.isInputShutdown())
102 {
103 _parser.reset();
104 more_in_buffer=false;
105 _endp.close();
106 }
107
108 if (more_in_buffer)
109 {
110 reset(false);
111 more_in_buffer = _parser.isMoreInBuffer() || _endp.isBufferingInput();
112 }
113 else
114 reset(true);
115 }
116 }
117 else if (_parser.isIdle() && _endp.isInputShutdown())
118 {
119 more_in_buffer=false;
120 _endp.close();
121 }
122
123 if (_request.isAsyncStarted())
124 throw new IllegalStateException();
125 }
126 }
127 }
128 finally
129 {
130 _parser.returnBuffers();
131 setCurrentConnection(null);
132 _handling=false;
133 }
134 return connection;
135 }
136
137 }