remm        02/03/14 21:45:05

  Modified:    http11/src/java/org/apache/coyote/http11
                        Http11Processor.java
  Log:
  - Add commons-logging based logger (static placeholder field at the moment;
    still better than writing directly to sys.err obviously).
  - Remove lots of the debug stack traces.
  - Add support for HTTP/1.1 expectations.
  - Add support for full HTTP/1.1 style URIs. When a full URI is used, the
    host header is optional. AFAIK, this was the last major feature missing
    in the processor.
  
  Revision  Changes    Path
  1.9       +91 -30    
jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/Http11Processor.java
  
  Index: Http11Processor.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-connectors/http11/src/java/org/apache/coyote/http11/Http11Processor.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- Http11Processor.java      14 Mar 2002 21:45:05 -0000      1.8
  +++ Http11Processor.java      15 Mar 2002 05:45:05 -0000      1.9
  @@ -151,6 +151,12 @@
   
   
       /**
  +     * State flag.
  +     */
  +    protected boolean started = false;
  +
  +
  +    /**
        * Error flag.
        */
       protected boolean error = false;
  @@ -187,6 +193,13 @@
       protected String[] restrictedUserAgents = null;
   
   
  +    /**
  +     * Logger.
  +     */
  +    protected static org.apache.commons.logging.Log log 
  +        = org.apache.commons.logging.LogFactory.getLog(Http11Processor.class);
  +
  +
       // --------------------------------------------------------- Public Methods
   
   
  @@ -267,10 +280,8 @@
           // Error flag
           error = false;
           keepAlive = true;
  -        // TEMP
  -        boolean stopped = false;
   
  -        while (!stopped && !error && keepAlive) {
  +        while (started && !error && keepAlive) {
   
               try {
                   inputBuffer.parseRequestLine();
  @@ -279,8 +290,9 @@
                   error = true;
                   break;
               } catch (Exception e) {
  -                e.printStackTrace();
  -                //SC_BAD_REQUEST
  +                log.warn("Error parsing HTTP request", e);
  +                // 500 - Bad Request
  +                response.setStatus(400);
                   error = true;
               }
   
  @@ -288,14 +300,17 @@
               prepareRequest();
   
               // Process the request in the adapter
  -            try {
  -                adapter.service(request, response);
  -            } catch (InterruptedIOException e) {
  -                error = true;
  -            } catch (Throwable t) {
  -                // ISE
  -                t.printStackTrace();
  -                error = true;
  +            if (!error) {
  +                try {
  +                    adapter.service(request, response);
  +                } catch (InterruptedIOException e) {
  +                    error = true;
  +                } catch (Throwable t) {
  +                    log.error("Error processing request", t);
  +                    // 500 - Internal Server Error
  +                    response.setStatus(500);
  +                    error = true;
  +                }
               }
   
               // Finish the handling of the request
  @@ -304,8 +319,9 @@
               } catch (IOException e) {
                   error = true;
               } catch (Throwable t) {
  -                // Problem ...
  -                t.printStackTrace();
  +                log.error("Error finishing request", t);
  +                // 500 - Internal Server Error
  +                response.setStatus(500);
                   error = true;
               }
               try {
  @@ -313,8 +329,7 @@
               } catch (IOException e) {
                   error = true;
               } catch (Throwable t) {
  -                // Problem ...
  -                t.printStackTrace();
  +                log.error("Error finishing response", t);
                   error = true;
               }
   
  @@ -351,8 +366,7 @@
               try {
                   outputBuffer.commit();
               } catch (IOException e) {
  -                // Log the error, and set error flag
  -                e.printStackTrace();
  +                // Set error flag
                   error = true;
               }
   
  @@ -363,12 +377,19 @@
               // Send a 100 status back if it makes sense (response not committed
               // yet, and client specified an expectation for 100-continue)
   
  -            try {
  -                outputBuffer.sendAck();
  -            } catch (IOException e) {
  -                // Log the error, and set error flag
  -                e.printStackTrace();
  -                error = true;
  +            if (response.isCommitted())
  +                return;
  +
  +            MessageBytes expectMB = 
  +                request.getMimeHeaders().getValue("expect");
  +            if ((expectMB != null)
  +                && (expectMB.indexOfIgnoreCase("100-continue", 0) != -1)) {
  +                try {
  +                    outputBuffer.sendAck();
  +                } catch (IOException e) {
  +                    // Set error flag
  +                    error = true;
  +                }
               }
   
           } else if (actionCode == ActionCode.ACTION_CLOSE) {
  @@ -381,8 +402,7 @@
               try {
                   outputBuffer.endRequest();
               } catch (IOException e) {
  -                // Log the error, and set error flag
  -                e.printStackTrace();
  +                // Set error flag
                   error = true;
               }
   
  @@ -398,6 +418,14 @@
   
               // Do nothing
   
  +        } else if (actionCode == ActionCode.ACTION_START) {
  +
  +            started = true;
  +
  +        } else if (actionCode == ActionCode.ACTION_STOP) {
  +
  +            started = false;
  +
           }
   
       }
  @@ -488,14 +516,47 @@
               }
           }
   
  +        // Check for a full URI (including protocol://host:port/)
  +        ByteChunk uriBC = request.requestURI().getByteChunk();
  +        if (uriBC.startsWithIgnoreCase("http", 0)) {
  +
  +            // If the first character of the URI is 'h', the URI is either
  +            // invalid, or is a full URI
  +
  +            int pos = uriBC.indexOf("://", 0, 3, 4);
  +            int uriBCStart = uriBC.getStart();
  +            int slashPos = -1;
  +            if (pos != -1) {
  +                byte[] uriB = uriBC.getBytes();
  +                slashPos = uriBC.indexOf('/', pos + 3);
  +                if (slashPos == -1) {
  +                    slashPos = uriBC.getLength();
  +                    // Set URI as "/"
  +                    request.requestURI().setBytes
  +                        (uriB, uriBCStart + pos + 1, 1);
  +                } else {
  +                    request.requestURI().setBytes
  +                        (uriB, uriBCStart + slashPos, 
  +                         uriBC.getLength() - slashPos);
  +                }
  +                MessageBytes hostMB = 
  +                    request.getMimeHeaders().setValue("host");
  +                hostMB.setBytes(uriB, uriBCStart + pos + 3, 
  +                                slashPos - pos - 3);
  +            }
  +
  +        }
  +
           // URI decoding
           try {
               request.decodedURI().duplicate(request.requestURI());
               request.getURLDecoder().convert(request.decodedURI(), true);
               request.decodedURI().setEncoding("UTF-8");
           } catch (IOException e) {
  -            // URL decoding failed
  -            e.printStackTrace();
  +            // 500 - Internal Server Error
  +            response.setStatus(500);
  +            log.warn("Error decoding URI");
  +            error = true;
           }
   
           // Input filter setup
  @@ -545,7 +606,7 @@
           // Check host header
           if (http11 && (request.getMimeHeaders().getValue("host") == null)) {
               error = true;
  -            // Send 400: Bad request
  +            // 400 - Bad request
               response.setStatus(400);
           }
   
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to