Return-Path:
null
- * if no value is specified
- */
+ // non-javadoc, see interface HeaderValueParser
public NameValuePair parseNameValuePair(final CharArrayBuffer buffer,
- final int indexFrom,
- final int indexTo) {
+ final ParserCursor cursor) {
if (buffer == null) {
- throw new IllegalArgumentException
- ("Char array buffer may not be null");
+ throw new IllegalArgumentException("Char array buffer may not be null");
}
- if (indexFrom < 0) {
- throw new IndexOutOfBoundsException();
- }
- if (indexTo > buffer.length()) {
- throw new IndexOutOfBoundsException();
- }
- if (indexFrom > indexTo) {
- throw new IndexOutOfBoundsException();
+ if (cursor == null) {
+ throw new IllegalArgumentException("Parser cursor may not be null");
}
- int eq = buffer.indexOf('=', indexFrom, indexTo);
- if (eq < 0) {
- return createNameValuePair(buffer.substringTrimmed(indexFrom, indexTo), null);
+ boolean terminated = false;
+
+ int pos = cursor.getPos();
+ int indexFrom = cursor.getPos();
+ int indexTo = cursor.getUpperBound();
+
+ // Find name
+ String name = null;
+ while (pos < indexTo) {
+ char ch = buffer.charAt(pos);
+ if (ch == '=') {
+ break;
+ }
+ if (ch == PARAM_DELIMITER || ch == ELEM_DELIMITER) {
+ terminated = true;
+ break;
+ }
+ pos++;
}
- String name = buffer.substringTrimmed(indexFrom, eq);
- int i1 = eq + 1;
- int i2 = indexTo;
+
+ if (pos == indexTo) {
+ terminated = true;
+ name = buffer.substringTrimmed(indexFrom, indexTo);
+ } else {
+ name = buffer.substringTrimmed(indexFrom, pos);
+ pos++;
+ }
+
+ if (terminated) {
+ cursor.updatePos(pos);
+ return createNameValuePair(name, null);
+ }
+
+ // Find value
+ String value = null;
+ int i1 = pos;
+
+ boolean qouted = false;
+ boolean escaped = false;
+ while (pos < indexTo) {
+ char ch = buffer.charAt(pos);
+ if (ch == '"' && !escaped) {
+ qouted = !qouted;
+ }
+ if (!qouted && !escaped &&
+ (ch == PARAM_DELIMITER || ch == ELEM_DELIMITER)) {
+ terminated = true;
+ break;
+ }
+ if (escaped) {
+ escaped = false;
+ } else {
+ escaped = qouted && ch == '\\';
+ }
+ pos++;
+ }
+
+ int i2 = pos;
// Trim leading white spaces
while (i1 < i2 && (HTTP.isWhitespace(buffer.charAt(i1)))) {
i1++;
@@ -374,11 +375,14 @@
i1++;
i2--;
}
- String value = buffer.substring(i1, i2);
+ value = buffer.substring(i1, i2);
+ if (terminated) {
+ pos++;
+ }
+ cursor.updatePos(pos);
return createNameValuePair(name, value);
}
-
/**
* Creates a name-value pair.
* Called from {@link #parseNameValuePair}.
@@ -391,7 +395,6 @@
protected NameValuePair createNameValuePair(final String name, final String value) {
return new BasicNameValuePair(name, value);
}
-
}
Modified: jakarta/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/message/BufferedHeader.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/message/BufferedHeader.java?rev=589325&r1=589324&r2=589325&view=diff
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/message/BufferedHeader.java (original)
+++ jakarta/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/message/BufferedHeader.java Sun Oct 28 03:37:56 2007
@@ -130,8 +130,9 @@
HeaderValueParser hvp = this.parser;
if (hvp == null)
hvp = BasicHeaderValueParser.DEFAULT;
- return hvp.parseElements(this.buffer,
- this.valuePos, this.buffer.length());
+ ParserCursor cursor = new ParserCursor(0, this.buffer.length());
+ cursor.updatePos(this.valuePos);
+ return hvp.parseElements(this.buffer, cursor);
}
public int getValuePos() {
Modified: jakarta/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/message/HeaderValueParser.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/message/HeaderValueParser.java?rev=589325&r1=589324&r2=589325&view=diff
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/message/HeaderValueParser.java (original)
+++ jakarta/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/message/HeaderValueParser.java Sun Oct 28 03:37:56 2007
@@ -81,17 +81,16 @@
*
null
* if no value is specified
- *
- * @throws ParseException in case of a parse error
*/
- NameValuePair parseNameValuePair(CharArrayBuffer buffer,
- int indexFrom,
- int indexTo)
- throws ParseException
- ;
-
+ NameValuePair parseNameValuePair(
+ CharArrayBuffer buffer,
+ ParserCursor cursor) throws ParseException;
+
}
Modified: jakarta/httpcomponents/httpcore/trunk/module-main/src/test/java/org/apache/http/message/TestBasicHeaderValueParser.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-main/src/test/java/org/apache/http/message/TestBasicHeaderValueParser.java?rev=589325&r1=589324&r2=589325&view=diff
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-main/src/test/java/org/apache/http/message/TestBasicHeaderValueParser.java (original)
+++ jakarta/httpcomponents/httpcore/trunk/module-main/src/test/java/org/apache/http/message/TestBasicHeaderValueParser.java Sun Oct 28 03:37:56 2007
@@ -134,70 +134,122 @@
assertEquals("Number of elements", 0, elements.length);
}
- public void testHEInvalidInput() throws Exception {
- CharArrayBuffer buffer = new CharArrayBuffer(32);
- buffer.append("name = value");
- try {
- BasicHeaderValueParser.parseElements(null, null);
- fail("IllegalArgumentException should have been thrown");
- } catch (IllegalArgumentException ex) {
- // expected
- }
-
- try {
- BasicHeaderValueParser.DEFAULT.parseElements(null, 0, 0);
- fail("IllegalArgumentException should have been thrown");
- } catch (IllegalArgumentException ex) {
- // expected
- }
- try {
- BasicHeaderValueParser.DEFAULT.parseElements(buffer, -1, 0);
- fail("IllegalArgumentException should have been thrown");
- } catch (IndexOutOfBoundsException ex) {
- // expected
- }
- try {
- BasicHeaderValueParser.DEFAULT.parseElements(buffer, 0, 1000);
- fail("IllegalArgumentException should have been thrown");
- } catch (IndexOutOfBoundsException ex) {
- // expected
- }
- try {
- BasicHeaderValueParser.DEFAULT.parseElements(buffer, 2, 1);
- fail("IllegalArgumentException should have been thrown");
- } catch (IndexOutOfBoundsException ex) {
- // expected
- }
-
-
- try {
- BasicHeaderValueParser.DEFAULT.parseHeaderElement(null, 0, 0);
- fail("IllegalArgumentException should have been thrown");
- } catch (IllegalArgumentException ex) {
- // expected
- }
- try {
- BasicHeaderValueParser.DEFAULT.parseHeaderElement(buffer, -1, 0);
- fail("IllegalArgumentException should have been thrown");
- } catch (IndexOutOfBoundsException ex) {
- // expected
- }
- try {
- BasicHeaderValueParser.DEFAULT.parseHeaderElement(buffer, 0, 1000);
- fail("IllegalArgumentException should have been thrown");
- } catch (IndexOutOfBoundsException ex) {
- // expected
- }
- try {
- BasicHeaderValueParser.DEFAULT.parseHeaderElement(buffer, 2, 1);
- fail("IllegalArgumentException should have been thrown");
- } catch (IndexOutOfBoundsException ex) {
- // expected
- }
- }
+ public void testNVParseUsingCursor() {
+
+ HeaderValueParser parser = BasicHeaderValueParser.DEFAULT;
+
+ String s = "test";
+ CharArrayBuffer buffer = new CharArrayBuffer(16);
+ buffer.append(s);
+ ParserCursor cursor = new ParserCursor(0, s.length());
+
+ NameValuePair param = parser.parseNameValuePair(buffer, cursor);
+ assertEquals("test", param.getName());
+ assertEquals(null, param.getValue());
+ assertEquals(s.length(), cursor.getPos());
+ assertTrue(cursor.atEnd());
+ s = "test;";
+ buffer = new CharArrayBuffer(16);
+ buffer.append(s);
+ cursor = new ParserCursor(0, s.length());
+
+ param = parser.parseNameValuePair(buffer, cursor);
+ assertEquals("test", param.getName());
+ assertEquals(null, param.getValue());
+ assertEquals(s.length(), cursor.getPos());
+ assertTrue(cursor.atEnd());
+
+ s = "test ,12";
+ buffer = new CharArrayBuffer(16);
+ buffer.append(s);
+ cursor = new ParserCursor(0, s.length());
+
+ param = parser.parseNameValuePair(buffer, cursor);
+ assertEquals("test", param.getName());
+ assertEquals(null, param.getValue());
+ assertEquals(s.length() - 2, cursor.getPos());
+ assertFalse(cursor.atEnd());
+
+ s = "test=stuff";
+ buffer = new CharArrayBuffer(16);
+ buffer.append(s);
+ cursor = new ParserCursor(0, s.length());
+
+ param = parser.parseNameValuePair(buffer, cursor);
+ assertEquals("test", param.getName());
+ assertEquals("stuff", param.getValue());
+ assertEquals(s.length(), cursor.getPos());
+ assertTrue(cursor.atEnd());
+
+ s = " test = stuff ";
+ buffer = new CharArrayBuffer(16);
+ buffer.append(s);
+ cursor = new ParserCursor(0, s.length());
+
+ param = parser.parseNameValuePair(buffer, cursor);
+ assertEquals("test", param.getName());
+ assertEquals("stuff", param.getValue());
+ assertEquals(s.length(), cursor.getPos());
+ assertTrue(cursor.atEnd());
+
+ s = " test = stuff ;1234";
+ buffer = new CharArrayBuffer(16);
+ buffer.append(s);
+ cursor = new ParserCursor(0, s.length());
+
+ param = parser.parseNameValuePair(buffer, cursor);
+ assertEquals("test", param.getName());
+ assertEquals("stuff", param.getValue());
+ assertEquals(s.length() - 4, cursor.getPos());
+ assertFalse(cursor.atEnd());
+
+ s = "test = \"stuff\"";
+ buffer = new CharArrayBuffer(16);
+ buffer.append(s);
+ cursor = new ParserCursor(0, s.length());
+
+ param = parser.parseNameValuePair(buffer, cursor);
+ assertEquals("test", param.getName());
+ assertEquals("stuff", param.getValue());
+
+ s = "test = \" stuff\\\"\"";
+ buffer = new CharArrayBuffer(16);
+ buffer.append(s);
+ cursor = new ParserCursor(0, s.length());
+
+ param = parser.parseNameValuePair(buffer, cursor);
+ assertEquals("test", param.getName());
+ assertEquals(" stuff\\\"", param.getValue());
+
+ s = " test";
+ buffer = new CharArrayBuffer(16);
+ buffer.append(s);
+ cursor = new ParserCursor(0, s.length());
+
+ param = parser.parseNameValuePair(buffer, cursor);
+ assertEquals("test", param.getName());
+ assertEquals(null, param.getValue());
+
+ s = " ";
+ buffer = new CharArrayBuffer(16);
+ buffer.append(s);
+ cursor = new ParserCursor(0, s.length());
+
+ param = parser.parseNameValuePair(buffer, cursor);
+ assertEquals("", param.getName());
+ assertEquals(null, param.getValue());
+
+ s = " = stuff ";
+ buffer = new CharArrayBuffer(16);
+ buffer.append(s);
+ cursor = new ParserCursor(0, s.length());
+
+ param = parser.parseNameValuePair(buffer, cursor);
+ assertEquals("", param.getName());
+ assertEquals("stuff", param.getValue());
+ }
-
public void testNVParse() {
String s = "test";
NameValuePair param =
@@ -241,6 +293,53 @@
assertEquals("stuff", param.getValue());
}
+ public void testNVParseAllWithCursor() {
+ HeaderValueParser parser = BasicHeaderValueParser.DEFAULT;
+
+ String s =
+ "test; test1 = stuff ; test2 = \"stuff; stuff\"; test3=\"stuff";
+ CharArrayBuffer buffer = new CharArrayBuffer(16);
+ buffer.append(s);
+ ParserCursor cursor = new ParserCursor(0, s.length());
+
+ NameValuePair[] params = parser.parseParameters(buffer, cursor);
+ assertEquals("test", params[0].getName());
+ assertEquals(null, params[0].getValue());
+ assertEquals("test1", params[1].getName());
+ assertEquals("stuff", params[1].getValue());
+ assertEquals("test2", params[2].getName());
+ assertEquals("stuff; stuff", params[2].getValue());
+ assertEquals("test3", params[3].getName());
+ assertEquals("\"stuff", params[3].getValue());
+ assertEquals(s.length(), cursor.getPos());
+ assertTrue(cursor.atEnd());
+
+ s =
+ "test; test1 = stuff ; test2 = \"stuff; stuff\"; test3=\"stuff\",123";
+ buffer = new CharArrayBuffer(16);
+ buffer.append(s);
+ cursor = new ParserCursor(0, s.length());
+
+ params = parser.parseParameters(buffer, cursor);
+ assertEquals("test", params[0].getName());
+ assertEquals(null, params[0].getValue());
+ assertEquals("test1", params[1].getName());
+ assertEquals("stuff", params[1].getValue());
+ assertEquals("test2", params[2].getName());
+ assertEquals("stuff; stuff", params[2].getValue());
+ assertEquals("test3", params[3].getName());
+ assertEquals("stuff", params[3].getValue());
+ assertEquals(s.length() - 3, cursor.getPos());
+ assertFalse(cursor.atEnd());
+
+ s = " ";
+ buffer = new CharArrayBuffer(16);
+ buffer.append(s);
+ cursor = new ParserCursor(0, s.length());
+ params = parser.parseParameters(buffer, cursor);
+ assertEquals(0, params.length);
+ }
+
public void testNVParseAll() {
String s =
"test; test1 = stuff ; test2 = \"stuff; stuff\"; test3=\"stuff";
@@ -272,73 +371,6 @@
assertEquals("\\\\", params[1].getValue());
assertEquals("test3", params[2].getName());
assertEquals("stuff; stuff", params[2].getValue());
- }
-
- public void testNVParseInvalidInput() throws Exception {
- CharArrayBuffer buffer = new CharArrayBuffer(32);
- buffer.append("name = value");
-
- try {
- BasicHeaderValueParser.parseParameters(null, null);
- fail("IllegalArgumentException should have been thrown");
- } catch (IllegalArgumentException ex) {
- // expected
- }
- try {
- BasicHeaderValueParser.DEFAULT.parseParameters(null, 0, 0);
- fail("IllegalArgumentException should have been thrown");
- } catch (IllegalArgumentException ex) {
- // expected
- }
- try {
- BasicHeaderValueParser.DEFAULT.parseParameters(buffer, -1, 0);
- fail("IllegalArgumentException should have been thrown");
- } catch (IndexOutOfBoundsException ex) {
- // expected
- }
- try {
- BasicHeaderValueParser.DEFAULT.parseParameters(buffer, 0, 1000);
- fail("IllegalArgumentException should have been thrown");
- } catch (IndexOutOfBoundsException ex) {
- // expected
- }
- try {
- BasicHeaderValueParser.DEFAULT.parseParameters(buffer, 2, 1);
- fail("IllegalArgumentException should have been thrown");
- } catch (IndexOutOfBoundsException ex) {
- // expected
- }
-
- try {
- BasicHeaderValueParser.parseNameValuePair(null, null);
- fail("IllegalArgumentException should have been thrown");
- } catch (IllegalArgumentException ex) {
- // expected
- }
- try {
- BasicHeaderValueParser.DEFAULT.parseNameValuePair(null, 0, 0);
- fail("IllegalArgumentException should have been thrown");
- } catch (IllegalArgumentException ex) {
- // expected
- }
- try {
- BasicHeaderValueParser.DEFAULT.parseNameValuePair(buffer, -1, 0);
- fail("IllegalArgumentException should have been thrown");
- } catch (IndexOutOfBoundsException ex) {
- // expected
- }
- try {
- BasicHeaderValueParser.DEFAULT.parseNameValuePair(buffer, 0, 1000);
- fail("IllegalArgumentException should have been thrown");
- } catch (IndexOutOfBoundsException ex) {
- // expected
- }
- try {
- BasicHeaderValueParser.DEFAULT.parseNameValuePair(buffer, 2, 1);
- fail("IllegalArgumentException should have been thrown");
- } catch (IndexOutOfBoundsException ex) {
- // expected
- }
}
}
Modified: jakarta/httpcomponents/httpcore/trunk/module-main/src/test/java/org/apache/http/message/TestHeaderElement.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-main/src/test/java/org/apache/http/message/TestHeaderElement.java?rev=589325&r1=589324&r2=589325&view=diff
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-main/src/test/java/org/apache/http/message/TestHeaderElement.java (original)
+++ jakarta/httpcomponents/httpcore/trunk/module-main/src/test/java/org/apache/http/message/TestHeaderElement.java Sun Oct 28 03:37:56 2007
@@ -38,7 +38,6 @@
import org.apache.http.HeaderElement;
import org.apache.http.NameValuePair;
-import org.apache.http.util.CharArrayBuffer;
/**
* Simple tests for {@link HeaderElement}.
@@ -89,16 +88,6 @@
}
- public void testConstructor1() throws Exception {
- String s = "name = value; param1 = value1";
- NameValuePair[] nvps = BasicHeaderValueParser.parseParameters(s, null);
- HeaderElement element = new BasicHeaderElement(nvps);
- assertEquals("name", element.getName());
- assertEquals("value", element.getValue());
- assertEquals(1, element.getParameters().length);
- assertEquals("value1", element.getParameterByName("param1").getValue());
- }
-
public void testInvalidName() {
try {
new BasicHeaderElement(null, null, null);
@@ -109,10 +98,8 @@
}
public void testParamByName() throws Exception {
- CharArrayBuffer buffer = new CharArrayBuffer(64);
- buffer.append("name = value; param1 = value1; param2 = value2");
- HeaderElement element = BasicHeaderValueParser.DEFAULT
- .parseHeaderElement(buffer, 0, buffer.length());
+ String s = "name = value; param1 = value1; param2 = value2";
+ HeaderElement element = BasicHeaderValueParser.parseHeaderElement(s, null);
assertEquals("value1", element.getParameterByName("param1").getValue());
assertEquals("value2", element.getParameterByName("param2").getValue());
assertNull(element.getParameterByName("param3"));
@@ -178,21 +165,11 @@
}
public void testToString() {
- CharArrayBuffer buffer = new CharArrayBuffer(64);
String s = "name=value; param1=value1; param2=value2";
- buffer.append(s);
-
-
- HeaderElement element = BasicHeaderValueParser.DEFAULT
- .parseHeaderElement(buffer, 0, buffer.length());
+ HeaderElement element = BasicHeaderValueParser.parseHeaderElement(s, null);
assertEquals(s, element.toString());
-
s = "name; param1=value1; param2=value2";
- buffer.clear();
- buffer.append(s);
-
- element = BasicHeaderValueParser.DEFAULT
- .parseHeaderElement(buffer, 0, buffer.length());
+ element = BasicHeaderValueParser.parseHeaderElement(s, null);
assertEquals(s, element.toString());
}
}