You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2014/08/05 10:16:24 UTC

svn commit: r1615886 - in /httpcomponents/httpcore/trunk/httpcore/src: main/java/org/apache/http/message/BasicHeaderValueParser.java test/java/org/apache/http/message/TestBasicHeaderValueParser.java

Author: olegk
Date: Tue Aug  5 08:16:24 2014
New Revision: 1615886

URL: http://svn.apache.org/r1615886
Log:
Changed BasicHeaderValueParser to use TokenParser for header element parsing

Modified:
    httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicHeaderValueParser.java
    httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicHeaderValueParser.java

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicHeaderValueParser.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicHeaderValueParser.java?rev=1615886&r1=1615885&r2=1615886&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicHeaderValueParser.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/message/BasicHeaderValueParser.java Tue Aug  5 08:16:24 2014
@@ -28,13 +28,13 @@
 package org.apache.http.message;
 
 import java.util.ArrayList;
+import java.util.BitSet;
 import java.util.List;
 
 import org.apache.http.HeaderElement;
 import org.apache.http.NameValuePair;
 import org.apache.http.ParseException;
 import org.apache.http.annotation.Immutable;
-import org.apache.http.protocol.HTTP;
 import org.apache.http.util.Args;
 import org.apache.http.util.CharArrayBuffer;
 
@@ -64,13 +64,13 @@ public class BasicHeaderValueParser impl
 
     private final static char PARAM_DELIMITER                = ';';
     private final static char ELEM_DELIMITER                 = ',';
-    private final static char[] ALL_DELIMITERS               = new char[] {
-                                                                PARAM_DELIMITER,
-                                                                ELEM_DELIMITER
-                                                                };
+    private static final BitSet TOKEN_DELIMS = TokenParser.INIT_BITSET('=', PARAM_DELIMITER, ELEM_DELIMITER);
+    private static final BitSet VALUE_DELIMS = TokenParser.INIT_BITSET(PARAM_DELIMITER, ELEM_DELIMITER);
+
+    private final TokenParser tokenParser;
 
     public BasicHeaderValueParser() {
-        super();
+        this.tokenParser = TokenParser.INSTANCE;
     }
 
     /**
@@ -193,22 +193,7 @@ public class BasicHeaderValueParser impl
                                            final ParserCursor cursor) {
         Args.notNull(buffer, "Char array buffer");
         Args.notNull(cursor, "Parser cursor");
-        int pos = cursor.getPos();
-        final int indexTo = cursor.getUpperBound();
-
-        while (pos < indexTo) {
-            final char ch = buffer.charAt(pos);
-            if (HTTP.isWhitespace(ch)) {
-                pos++;
-            } else {
-                break;
-            }
-        }
-        cursor.updatePos(pos);
-        if (cursor.atEnd()) {
-            return new NameValuePair[] {};
-        }
-
+        tokenParser.skipWhiteSpace(buffer, cursor);
         final List<NameValuePair> params = new ArrayList<NameValuePair>();
         while (!cursor.atEnd()) {
             final NameValuePair param = parseNameValuePair(buffer, cursor);
@@ -218,7 +203,6 @@ public class BasicHeaderValueParser impl
                 break;
             }
         }
-
         return params.toArray(new NameValuePair[params.size()]);
     }
 
@@ -247,103 +231,56 @@ public class BasicHeaderValueParser impl
     @Override
     public NameValuePair parseNameValuePair(final CharArrayBuffer buffer,
                                             final ParserCursor cursor) {
-        return parseNameValuePair(buffer, cursor, ALL_DELIMITERS);
-    }
+        Args.notNull(buffer, "Char array buffer");
+        Args.notNull(cursor, "Parser cursor");
 
-    private static boolean isOneOf(final char ch, final char[] chs) {
-        if (chs != null) {
-            for (final char ch2 : chs) {
-                if (ch == ch2) {
-                    return true;
-                }
-            }
+        final String name = tokenParser.parseToken(buffer, cursor, TOKEN_DELIMS);
+        if (cursor.atEnd()) {
+            return new BasicNameValuePair(name, null);
+        }
+        final int delim = buffer.charAt(cursor.getPos());
+        cursor.updatePos(cursor.getPos() + 1);
+        if (delim != '=') {
+            return createNameValuePair(name, null);
+        }
+        final String value = tokenParser.parseValue(buffer, cursor, VALUE_DELIMS);
+        if (!cursor.atEnd()) {
+            cursor.updatePos(cursor.getPos() + 1);
         }
-        return false;
+        return createNameValuePair(name, value);
     }
 
+    /**
+     * @deprecated (4.4) use {@link org.apache.http.message.TokenParser}
+     */
+    @Deprecated
     public NameValuePair parseNameValuePair(final CharArrayBuffer buffer,
                                             final ParserCursor cursor,
                                             final char[] delimiters) {
         Args.notNull(buffer, "Char array buffer");
         Args.notNull(cursor, "Parser cursor");
 
-        boolean terminated = false;
-
-        int pos = cursor.getPos();
-        final int indexFrom = cursor.getPos();
-        final int indexTo = cursor.getUpperBound();
-
-        // Find name
-        final String name;
-        while (pos < indexTo) {
-            final char ch = buffer.charAt(pos);
-            if (ch == '=') {
-                break;
-            }
-            if (isOneOf(ch, delimiters)) {
-                terminated = true;
-                break;
+        final BitSet delimSet = new BitSet();
+        if (delimiters != null) {
+            for (char delimiter: delimiters) {
+                delimSet.set(delimiter);
             }
-            pos++;
         }
-
-        if (pos == indexTo) {
-            terminated = true;
-            name = buffer.substringTrimmed(indexFrom, indexTo);
-        } else {
-            name = buffer.substringTrimmed(indexFrom, pos);
-            pos++;
+        delimSet.set('=');
+        final String name = tokenParser.parseToken(buffer, cursor, delimSet);
+        if (cursor.atEnd()) {
+            return new BasicNameValuePair(name, null);
         }
-
-        if (terminated) {
-            cursor.updatePos(pos);
+        final int delim = buffer.charAt(cursor.getPos());
+        cursor.updatePos(cursor.getPos() + 1);
+        if (delim != '=') {
             return createNameValuePair(name, null);
         }
-
-        // Find value
-        final String value;
-        int i1 = pos;
-
-        boolean qouted = false;
-        boolean escaped = false;
-        while (pos < indexTo) {
-            final char ch = buffer.charAt(pos);
-            if (ch == '"' && !escaped) {
-                qouted = !qouted;
-            }
-            if (!qouted && !escaped && isOneOf(ch, delimiters)) {
-                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++;
-        }
-        // Trim trailing white spaces
-        while ((i2 > i1) && (HTTP.isWhitespace(buffer.charAt(i2 - 1)))) {
-            i2--;
-        }
-        // Strip away quotes if necessary
-        if (((i2 - i1) >= 2)
-            && (buffer.charAt(i1) == '"')
-            && (buffer.charAt(i2 - 1) == '"')) {
-            i1++;
-            i2--;
-        }
-        value = buffer.substring(i1, i2);
-        if (terminated) {
-            pos++;
+        delimSet.clear('=');
+        final String value = tokenParser.parseValue(buffer, cursor, delimSet);
+        if (!cursor.atEnd()) {
+            cursor.updatePos(cursor.getPos() + 1);
         }
-        cursor.updatePos(pos);
         return createNameValuePair(name, value);
     }
 

Modified: httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicHeaderValueParser.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicHeaderValueParser.java?rev=1615886&r1=1615885&r2=1615886&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicHeaderValueParser.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/test/java/org/apache/http/message/TestBasicHeaderValueParser.java Tue Aug  5 08:16:24 2014
@@ -80,9 +80,9 @@ public class TestBasicHeaderValueParser 
         final HeaderElement[] elements = BasicHeaderValueParser.parseElements(s, null);
         Assert.assertEquals(3, elements.length);
         Assert.assertEquals("test1", elements[0].getName());
-        Assert.assertEquals("\\\"stuff\\\"", elements[0].getValue());
+        Assert.assertEquals("\"stuff\"", elements[0].getValue());
         Assert.assertEquals("test2", elements[1].getName());
-        Assert.assertEquals("\\\\", elements[1].getValue());
+        Assert.assertEquals("\\", elements[1].getValue());
         Assert.assertEquals("test3", elements[2].getName());
         Assert.assertEquals("stuff, stuff", elements[2].getValue());
     }
@@ -195,7 +195,7 @@ public class TestBasicHeaderValueParser 
 
         param = parser.parseNameValuePair(buffer, cursor);
         Assert.assertEquals("test", param.getName());
-        Assert.assertEquals("  stuff\\\"", param.getValue());
+        Assert.assertEquals("  stuff\"", param.getValue());
 
         s = "  test";
         buffer = new CharArrayBuffer(16);
@@ -251,7 +251,7 @@ public class TestBasicHeaderValueParser 
         s = "test  = \"  stuff\\\"\"";
         param = BasicHeaderValueParser.parseNameValuePair(s, null);
         Assert.assertEquals("test", param.getName());
-        Assert.assertEquals("  stuff\\\"", param.getValue());
+        Assert.assertEquals("  stuff\"", param.getValue());
 
         s = "  test";
         param = BasicHeaderValueParser.parseNameValuePair(s, null);
@@ -287,7 +287,7 @@ public class TestBasicHeaderValueParser 
         Assert.assertEquals("test2", params[2].getName());
         Assert.assertEquals("stuff; stuff", params[2].getValue());
         Assert.assertEquals("test3", params[3].getName());
-        Assert.assertEquals("\"stuff", params[3].getValue());
+        Assert.assertEquals("stuff", params[3].getValue());
         Assert.assertEquals(s.length(), cursor.getPos());
         Assert.assertTrue(cursor.atEnd());
 
@@ -330,7 +330,7 @@ public class TestBasicHeaderValueParser 
         Assert.assertEquals("test2", params[2].getName());
         Assert.assertEquals("stuff; stuff", params[2].getValue());
         Assert.assertEquals("test3", params[3].getName());
-        Assert.assertEquals("\"stuff", params[3].getValue());
+        Assert.assertEquals("stuff", params[3].getValue());
 
         s = "  ";
         params = BasicHeaderValueParser.parseParameters(s, null);
@@ -345,9 +345,9 @@ public class TestBasicHeaderValueParser 
             BasicHeaderValueParser.parseParameters(s, null);
         Assert.assertEquals(3, params.length);
         Assert.assertEquals("test1", params[0].getName());
-        Assert.assertEquals("\\\"stuff\\\"", params[0].getValue());
+        Assert.assertEquals("\"stuff\"", params[0].getValue());
         Assert.assertEquals("test2", params[1].getName());
-        Assert.assertEquals("\\\\", params[1].getValue());
+        Assert.assertEquals("\\", params[1].getValue());
         Assert.assertEquals("test3", params[2].getName());
         Assert.assertEquals("stuff; stuff", params[2].getValue());
     }