You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2013/05/07 17:51:23 UTC
svn commit: r1479951 - in /tomcat/trunk:
java/org/apache/tomcat/util/http/parser/HttpParser.java
test/org/apache/tomcat/util/http/parser/TestMediaType.java
Author: markt
Date: Tue May 7 15:51:22 2013
New Revision: 1479951
URL: http://svn.apache.org/r1479951
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=54703
Be tolerant of applications that pass CR or LF in setHeader() values.
Fix some whitespace parsing issues idnetifed by the extended test cases in readTokenOrQuotedString()
Modified:
tomcat/trunk/java/org/apache/tomcat/util/http/parser/HttpParser.java
tomcat/trunk/test/org/apache/tomcat/util/http/parser/TestMediaType.java
Modified: tomcat/trunk/java/org/apache/tomcat/util/http/parser/HttpParser.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/http/parser/HttpParser.java?rev=1479951&r1=1479950&r2=1479951&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/http/parser/HttpParser.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/http/parser/HttpParser.java Tue May 7 15:51:22 2013
@@ -260,17 +260,34 @@ public class HttpParser {
}
}
- private static SkipConstantResult skipConstant(StringReader input,
- String constant) throws IOException {
- int len = constant.length();
+ // Skip any LWS and return the next char
+ private static int skipLws(StringReader input, boolean withReset)
+ throws IOException {
+ if (withReset) {
+ input.mark(1);
+ }
int c = input.read();
- // Skip lws
- while (c == 32 || c == 9) {
+ while (c == 32 || c == 9 || c == 10 || c == 13) {
+ if (withReset) {
+ input.mark(1);
+ }
c = input.read();
}
+ if (withReset) {
+ input.reset();
+ }
+ return c;
+ }
+
+ private static SkipConstantResult skipConstant(StringReader input,
+ String constant) throws IOException {
+ int len = constant.length();
+
+ int c = skipLws(input, false);
+
for (int i = 0; i < len; i++) {
if (i == 0 && c == -1) {
return SkipConstantResult.EOF;
@@ -294,12 +311,7 @@ public class HttpParser {
private static String readToken(StringReader input) throws IOException {
StringBuilder result = new StringBuilder();
- int c = input.read();
-
- // Skip lws
- while (c == 32 || c == 9) {
- c = input.read();
- }
+ int c = skipLws(input, false);
while (c != -1 && isToken(c)) {
result.append((char) c);
@@ -323,12 +335,7 @@ public class HttpParser {
private static String readQuotedString(StringReader input,
boolean returnQuoted) throws IOException {
- int c = input.read();
-
- // Skip lws
- while (c == 32 || c == 9) {
- c = input.read();
- }
+ int c = skipLws(input, false);
if (c != '"') {
return null;
@@ -364,12 +371,8 @@ public class HttpParser {
private static String readTokenOrQuotedString(StringReader input,
boolean returnQuoted) throws IOException {
- // Use mark/reset as skip(-1) fails when reading the last character of
- // the input
- input.mark(1);
- int c = input.read();
- // Go back so first character is available to be read again
- input.reset();
+ // Go back so first non-LWS character is available to be read again
+ int c = skipLws(input, true);
if (c == '"') {
return readQuotedString(input, returnQuoted);
@@ -396,12 +399,7 @@ public class HttpParser {
StringBuilder result = new StringBuilder();
boolean quoted = false;
- int c = input.read();
-
- // Skip lws
- while (c == 32 || c == 9) {
- c = input.read();
- }
+ int c = skipLws(input, false);
if (c == '"') {
quoted = true;
@@ -453,12 +451,7 @@ public class HttpParser {
StringBuilder result = new StringBuilder();
boolean quoted = false;
- int c = input.read();
-
- // Skip lws
- while (c == 32 || c == 9) {
- c = input.read();
- }
+ int c = skipLws(input, false);
if (c == '"') {
quoted = true;
Modified: tomcat/trunk/test/org/apache/tomcat/util/http/parser/TestMediaType.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/util/http/parser/TestMediaType.java?rev=1479951&r1=1479950&r2=1479951&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/tomcat/util/http/parser/TestMediaType.java (original)
+++ tomcat/trunk/test/org/apache/tomcat/util/http/parser/TestMediaType.java Tue May 7 15:51:22 2013
@@ -46,6 +46,7 @@ public class TestMediaType {
new Parameter("z", "\"\"");
private static final Parameter PARAM_COMPLEX_QUOTED =
new Parameter("w", "\"foo'bar,a=b;x=y\"");
+
private static final String CHARSET = "UTF-8";
private static final String WS_CHARSET = " \tUTF-8";
private static final String CHARSET_WS = "UTF-8 \t";
@@ -61,6 +62,11 @@ public class TestMediaType {
new Parameter("charset", CHARSET_QUOTED);
+ private static final String[] LWS_VALUES = new String[] {
+ "", " ", "\t", "\r", "\n", "\r\n", " \r", " \n", " \r\n",
+ "\r ", "\n ", "\r\n ", " \r ", " \n ", " \r\n " };
+
+
@Test
public void testSimple() throws IOException {
doTest();
@@ -207,10 +213,17 @@ public class TestMediaType {
private void doTest(Parameter... parameters) throws IOException {
+ for (String lws : LWS_VALUES) {
+ doTest(lws, parameters);
+ }
+ }
+
+ private void doTest(String lws, Parameter... parameters)
+ throws IOException {
StringBuilder sb = new StringBuilder();
sb.append(TYPES);
for (Parameter p : parameters) {
- sb.append(p.toString());
+ sb.append(p.toString(lws));
}
StringReader sr = new StringReader(sb.toString());
@@ -250,14 +263,23 @@ public class TestMediaType {
@Override
public String toString() {
+ return toString("");
+ }
+
+ public String toString(String lws) {
StringBuilder sb = new StringBuilder();
+ sb.append(lws);
sb.append(";");
+ sb.append(lws);
sb.append(name);
+ sb.append(lws);
sb.append("=");
+ sb.append(lws);
sb.append(value);
+ sb.append(lws);
return sb.toString();
}
- }
+}
@Test
public void testCase() throws Exception {
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org