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">