Author: jochen
Date: Thu Apr  9 07:22:06 2009
New Revision: 763541

URL: http://svn.apache.org/viewvc?rev=763541&view=rev
Log:
PR: XMLRPC-166
Submitted-By: Alan Burlison <[email protected]>
- The webserver's connection timeout wasn't applied to the
  ServletWebServer.
- A client could prevent other clients from connecting by
  not sending any data.

Modified:
    
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/Connection.java
    
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/HttpServletRequestImpl.java
    
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/ServletConnection.java
    
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/WebServer.java
    webservices/xmlrpc/trunk/src/changes/changes.xml

Modified: 
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/Connection.java
URL: 
http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/Connection.java?rev=763541&r1=763540&r2=763541&view=diff
==============================================================================
--- 
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/Connection.java
 (original)
+++ 
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/Connection.java
 Thu Apr  9 07:22:06 2009
@@ -118,8 +118,6 @@
         webServer = pWebServer;
         server = pServer;
         socket = pSocket;
-        // set read timeout to 30 seconds
-        socket.setSoTimeout (30000);
         input = new BufferedInputStream(socket.getInputStream()){
             /** It may happen, that the XML parser invokes close().
              * Closing the input stream must not occur, because

Modified: 
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/HttpServletRequestImpl.java
URL: 
http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/HttpServletRequestImpl.java?rev=763541&r1=763540&r2=763541&view=diff
==============================================================================
--- 
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/HttpServletRequestImpl.java
 (original)
+++ 
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/HttpServletRequestImpl.java
 Thu Apr  9 07:22:06 2009
@@ -60,11 +60,11 @@
        private ServletInputStream sistream;
        private BufferedReader reader;
        private boolean postParametersParsed;
-       private final String method;
-       private final String protocol;
-       private final String uri;
-       private final String queryString;
-       private final String httpVersion;
+       private String method;
+       private String protocol;
+       private String uri;
+       private String queryString;
+       private String httpVersion;
        private final Map headers = new HashMap();
        private final Map attributes = new HashMap();
        private Map parameters;
@@ -98,34 +98,36 @@
                                return c;
                        }
                };
+       }
 
-        /** Read the header lines, one by one. Note, that the size of
+   /**
+    * Read the header lines, one by one. Note, that the size of
          * the buffer is a limitation of the maximum header length!
          */
+    public void readHttpHeaders()
+      throws IOException, ServletWebServer.Exception {
         byte[] buffer = new byte[2048];
         String line = readLine(buffer);
-        
-        StringTokenizer tokens = line!=null? new StringTokenizer(line): null;
-        if (tokens==null || !tokens.hasMoreTokens()) {
-               throw new ServletWebServer.Exception(400, "Bad Request",
-                                                                               
         "Unable to parse requests first line (should"
-                                                                               
          + " be 'METHOD uri HTTP/version', was empty.");
+        StringTokenizer tokens =
+          line != null ? new StringTokenizer(line) : null;
+        if (tokens == null || !tokens.hasMoreTokens()) {
+            throw new ServletWebServer.Exception(400, "Bad Request", "Unable 
to parse requests first line (should" +
+              " be 'METHOD uri HTTP/version', was empty.");
         }
         method = tokens.nextToken();
                if (!"POST".equalsIgnoreCase(method)) {
-                       throw new ServletWebServer.Exception(400, "Bad Request",
-                                                                               
                 "Expected 'POST' method, got " + method);
+            throw new ServletWebServer.Exception(400, "Bad Request", "Expected 
'POST' method, got " +
+              method);
                }
                if (!tokens.hasMoreTokens()) {
-               throw new ServletWebServer.Exception(400, "Bad Request",
-                                                                               
         "Unable to parse requests first line (should"
-                                                                               
                 + " be 'METHOD uri HTTP/version', was: " + line);
+            throw new ServletWebServer.Exception(400, "Bad Request", "Unable 
to parse requests first line (should" +
+              " be 'METHOD uri HTTP/version', was: " + line);
                }
                String u = tokens.nextToken();
                int offset = u.indexOf('?');
                if (offset >= 0) {
                        uri = u.substring(0, offset);
-                       queryString = u.substring(offset+1);
+            queryString = u.substring(offset + 1);
                } else {
                        uri = u;
                        queryString = null;
@@ -133,34 +135,32 @@
                if (tokens.hasMoreTokens()) {
                        String v = tokens.nextToken().toUpperCase();
                        if (tokens.hasMoreTokens()) {
-                       throw new ServletWebServer.Exception(400, "Bad Request",
-                                                                               
                 "Unable to parse requests first line (should"
-                                                                               
                          + " be 'METHOD uri HTTP/version', was: " + line);
+                throw new ServletWebServer.Exception(400, "Bad Request", 
"Unable to parse requests first line (should" +
+                  " be 'METHOD uri HTTP/version', was: " + line);
                        } else {
                                int index = v.indexOf('/');
                                if (index == -1) {
-                               throw new ServletWebServer.Exception(400, "Bad 
Request",
-                                                                               
                         "Unable to parse requests first line (should"
-                                                                               
                                 + " be 'METHOD uri HTTP/version', was: " + 
line);
+                    throw new ServletWebServer.Exception(400, "Bad Request", 
"Unable to parse requests first line (should" +
+                      " be 'METHOD uri HTTP/version', was: " + line);
                                }
                                protocol = v.substring(0, index).toUpperCase();
-                               httpVersion = v.substring(index+1);
+                httpVersion = v.substring(index + 1);
                        }
                } else {
                        httpVersion = "1.0";
                        protocol = "HTTP";
                }
-
                for (;;) {
                        line = HttpUtil.readLine(istream, buffer);
-                       if (line == null  ||  line.length() == 0) {
+            if (line == null || line.length() == 0) {
                                break;
                        }
                        int off = line.indexOf(':');
                        if (off > 0) {
-                               addHeader(line.substring(0, off), 
line.substring(off+1).trim());
+                addHeader(line.substring(0, off), line.substring(off + 
1).trim());
                        } else {
-                               throw new ServletWebServer.Exception(400, "Bad 
Request", "Unable to parse header line: " + line);
+                throw new ServletWebServer.Exception(400, "Bad Request", 
"Unable to parse header line: " +
+                  line);
                        }
                }
                contentBytesRemaining = getIntHeader("content-length");

Modified: 
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/ServletConnection.java
URL: 
http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/ServletConnection.java?rev=763541&r1=763540&r2=763541&view=diff
==============================================================================
--- 
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/ServletConnection.java
 (original)
+++ 
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/ServletConnection.java
 Thu Apr  9 07:22:06 2009
@@ -22,8 +22,6 @@
 import java.net.Socket;
 
 import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 
 import org.apache.xmlrpc.util.ThreadPool.InterruptableTask;
 
@@ -35,8 +33,8 @@
 public class ServletConnection implements InterruptableTask {
        private final HttpServlet servlet;
        private final Socket socket;
-       private final HttpServletRequest request;
-       private final HttpServletResponse response;
+       private final HttpServletRequestImpl request;
+       private final HttpServletResponseImpl response;
     private boolean shuttingDown;
 
        /** Creates a new instance.
@@ -53,6 +51,7 @@
 
        public void run() throws Throwable {
         try {
+            request.readHttpHeaders();
             servlet.service(request, response);
         } catch (Throwable t) {
             if (!shuttingDown) {

Modified: 
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/WebServer.java
URL: 
http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/WebServer.java?rev=763541&r1=763540&r2=763541&view=diff
==============================================================================
--- 
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/WebServer.java
 (original)
+++ 
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/WebServer.java
 Thu Apr  9 07:22:06 2009
@@ -332,6 +332,8 @@
                                        
                                        try {
                                                if (allowConnection(socket)) {
+                                               // set read timeout to 30 
seconds
+                                               socket.setSoTimeout(30000);
                                                        final ThreadPool.Task 
task = newTask(this, server, socket);
                                                        if 
(pool.startTask(task)) {
                                                                socket = null;

Modified: webservices/xmlrpc/trunk/src/changes/changes.xml
URL: 
http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/src/changes/changes.xml?rev=763541&r1=763540&r2=763541&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/src/changes/changes.xml (original)
+++ webservices/xmlrpc/trunk/src/changes/changes.xml Thu Apr  9 07:22:06 2009
@@ -44,6 +44,14 @@
       <action dev="jochen" type="fix" due-to="Alan Burlison" 
due-to-email="[email protected]">
         Fixed a possible NPE in case of a malformed HTTP request in the 
WebServer.
       </action>
+      <action dev="jochen" type="fix" due-to="Alan Burlison" 
due-to-email="[email protected]"
+          issue="XMLRPC-166">
+        The webserver's connection timeout wasn't applied to the 
ServletWebServer.
+      </action>
+      <action dev="jochen" type="fix" due-to="Alan Burlison" 
due-to-email="[email protected]"
+          issue="XMLRPC-166">
+        A client could prevent other clients from connecting by not sending 
any data.
+      </action>
     </release>
 
     <release version="3.1.1" date="2008-Aug-10">


Reply via email to