View Javadoc

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          // Loop while more in buffer
35          boolean more_in_buffer =true; // assume true until proven otherwise
36  
37          try
38          {
39              setCurrentConnection(this);
40  
41              while (more_in_buffer && _endp.isOpen())
42              {
43                  try
44                  {
45                      // If we are not ended then parse available
46                      if (!_parser.isComplete())
47                          _parser.parseAvailable();
48  
49                      // Do we have more generating to do?
50                      // Loop here because some writes may take multiple steps and
51                      // we need to flush them all before potentially blocking in the
52                      // next loop.
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                      // Flush buffers
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                      // Is this request/response round complete?
85                      if (_parser.isComplete() && _generator.isComplete() && !_endp.isBufferingOutput())
86                      {
87                          // look for a switched connection instance?
88                          Connection switched=(_response.getStatus()==HttpStatus.SWITCHING_PROTOCOLS_101)
89                          ?(Connection)_request.getAttribute("org.eclipse.jetty.io.Connection"):null;
90  
91                          // have we switched?
92                          if (switched!=null)
93                          {
94                              _parser.reset();
95                              _generator.reset(true);
96                              connection=switched;
97                          }
98                          else
99                          {
100                             // No switch, so cleanup and reset
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 }