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 2005/11/26 00:25:35 UTC

svn commit: r349036 - in /jakarta/httpcomponents/trunk/http-core/src: java/org/apache/http/ java/org/apache/http/impl/ test/org/apache/http/

Author: olegk
Date: Fri Nov 25 15:25:13 2005
New Revision: 349036

URL: http://svn.apache.org/viewcvs?rev=349036&view=rev
Log:
StatusLine, RequestLine and HttpVersion parsing code refactored to make use of CharArrayBuffer

Modified:
    jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/HeaderElement.java
    jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/HttpVersion.java
    jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/RequestLine.java
    jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/StatusLine.java
    jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/impl/DefaultHttpClientConnection.java
    jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/impl/DefaultHttpServerConnection.java
    jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestHttpVersion.java
    jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestRequestLine.java
    jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestStatusLine.java

Modified: jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/HeaderElement.java
URL: http://svn.apache.org/viewcvs/jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/HeaderElement.java?rev=349036&r1=349035&r2=349036&view=diff
==============================================================================
--- jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/HeaderElement.java (original)
+++ jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/HeaderElement.java Fri Nov 25 15:25:13 2005
@@ -163,7 +163,8 @@
      * 
      * @since 3.0
      */
-    public static final HeaderElement[] parseElements(final CharArrayBuffer buffer, int indexFrom, int indexTo) {
+    public static final HeaderElement[] parseElements(
+            final CharArrayBuffer buffer, final int indexFrom, final int indexTo) {
         if (buffer == null) {
             throw new IllegalArgumentException("Char array buffer may not be null");
         }
@@ -177,24 +178,25 @@
             throw new IndexOutOfBoundsException();
         }
         List elements = new ArrayList(); 
-        int i = indexFrom;
+        int cur = indexFrom;
+        int from = indexFrom;
         boolean qouted = false;
-        while (i < indexTo) {
-            char ch = buffer.charAt(i);
+        while (cur < indexTo) {
+            char ch = buffer.charAt(cur);
             if (ch == '"') {
                 qouted = !qouted;
             }
             HeaderElement element = null;
             if ((!qouted) && (ch == ',')) {
-                element = parse(buffer, indexFrom, i);
-                indexFrom = i + 1;
-            } else if (i == indexTo - 1) {
-                element = parse(buffer, indexFrom, indexTo);
+                element = parse(buffer, from, cur);
+                from = cur + 1;
+            } else if (cur == indexTo - 1) {
+                element = parse(buffer, from, indexTo);
             }
             if (element != null && !element.getName().equals("")) {
                 elements.add(element);
             }
-            i++;
+            cur++;
         }
         return (HeaderElement[])
             elements.toArray(new HeaderElement[elements.size()]);
@@ -219,7 +221,8 @@
         return parseElements(buffer, 0, buffer.length());
     }
 
-    public static HeaderElement parse(final CharArrayBuffer buffer, int indexFrom, int indexTo) {
+    public static HeaderElement parse(
+            final CharArrayBuffer buffer, final int indexFrom, final int indexTo) {
         if (buffer == null) {
             throw new IllegalArgumentException("Char array buffer may not be null");
         }

Modified: jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/HttpVersion.java
URL: http://svn.apache.org/viewcvs/jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/HttpVersion.java?rev=349036&r1=349035&r2=349036&view=diff
==============================================================================
--- jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/HttpVersion.java (original)
+++ jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/HttpVersion.java Fri Nov 25 15:25:13 2005
@@ -218,33 +218,70 @@
      * 
      * @throws ProtocolException if the string is not a valid HTTP protocol version. 
      */
-    public static HttpVersion parse(final String s) throws ProtocolException {
-        if (s == null) {
-            throw new IllegalArgumentException("String may not be null");
+    public static HttpVersion parse(
+            final CharArrayBuffer buffer, final int indexFrom, final int indexTo) 
+            throws ProtocolException {
+        if (buffer == null) {
+            throw new IllegalArgumentException("Char array buffer may not be null");
         }
-        if (!s.startsWith("HTTP/")) {
-            throw new ProtocolException("Invalid HTTP version string: " + s);
+        if (indexFrom < 0) {
+            throw new IndexOutOfBoundsException();
         }
-        int major, minor;
-        
-        int i1 = "HTTP/".length();
-        int i2 = s.indexOf(".", i1);
-        if (i2 == -1) {
-            throw new ProtocolException("Invalid HTTP version number: " + s);
+        if (indexTo > buffer.length()) {
+            throw new IndexOutOfBoundsException();
         }
-        try {
-            major = Integer.parseInt(s.substring(i1, i2)); 
-        } catch (NumberFormatException e) {
-            throw new ProtocolException("Invalid HTTP major version number: " + s);
+        if (indexFrom > indexTo) {
+            throw new IndexOutOfBoundsException();
         }
-        i1 = i2 + 1;
-        i2 = s.length();
         try {
-            minor = Integer.parseInt(s.substring(i1, i2)); 
-        } catch (NumberFormatException e) {
-            throw new ProtocolException("Invalid HTTP minor version number: " + s);
+            int major, minor;
+
+            int i = indexFrom;
+            while (Character.isWhitespace(buffer.charAt(i))) {
+                i++;
+            }            
+            if (buffer.charAt(i    ) != 'H' 
+             || buffer.charAt(i + 1) != 'T'
+             || buffer.charAt(i + 2) != 'T'
+             || buffer.charAt(i + 3) != 'P'
+             || buffer.charAt(i + 4) != '/') {
+                throw new ProtocolException("Not a valid HTTP version string: " + 
+                        buffer.substring(indexFrom, indexTo));
+            }
+            i += 5;
+            int period = buffer.indexOf('.', i);
+            if (period == -1) {
+                throw new ProtocolException("Invalid HTTP version number: " + 
+                        buffer.substring(indexFrom, indexTo));
+            }
+            try {
+                major = Integer.parseInt(buffer.substringTrimmed(i, period)); 
+            } catch (NumberFormatException e) {
+                throw new ProtocolException("Invalid HTTP major version number: " + 
+                        buffer.substring(indexFrom, indexTo));
+            }
+            try {
+                minor = Integer.parseInt(buffer.substringTrimmed(period + 1, indexTo)); 
+            } catch (NumberFormatException e) {
+                throw new ProtocolException("Invalid HTTP minor version number: " + 
+                        buffer.substring(indexFrom, indexTo));
+            }
+            return new HttpVersion(major, minor);
+            
+        } catch (IndexOutOfBoundsException e) {
+            throw new ProtocolException("Invalid HTTP version string: " + 
+                    buffer.substring(indexFrom, indexTo)); 
         }
-        return new HttpVersion(major, minor);
     }
 
+    public static final HttpVersion parse(final String s)
+            throws ProtocolException {
+        if (s == null) {
+            throw new IllegalArgumentException("String may not be null");
+        }
+        CharArrayBuffer buffer = new CharArrayBuffer(s.length()); 
+        buffer.append(s);
+        return parse(buffer, 0, buffer.length());
+    }
+    
 }

Modified: jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/RequestLine.java
URL: http://svn.apache.org/viewcvs/jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/RequestLine.java?rev=349036&r1=349035&r2=349036&view=diff
==============================================================================
--- jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/RequestLine.java (original)
+++ jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/RequestLine.java Fri Nov 25 15:25:13 2005
@@ -29,9 +29,6 @@
 
 package org.apache.http;
 
-import java.util.NoSuchElementException;
-import java.util.StringTokenizer;
-
 import org.apache.http.io.CharArrayBuffer;
 
 /**
@@ -87,23 +84,58 @@
         return buffer.toString();
     }
     
-    public static RequestLine parse(final String requestLine) 
-            throws HttpException {
-        if (requestLine == null) {
-            throw new IllegalArgumentException("Request line string may not be null");
-        }
-        String method = null;
-        String uri = null;
-        String protocol = null;
+    public static RequestLine parse(
+            final CharArrayBuffer buffer, final int indexFrom, final int indexTo) 
+            throws ProtocolException {
+        if (buffer == 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();
+        }
         try {
-            StringTokenizer st = new StringTokenizer(requestLine, " ");
-            method = st.nextToken().trim();
-            uri = st.nextToken().trim();
-            protocol = st.nextToken();
-        } catch (NoSuchElementException e) {
-            throw new ProtocolException("Invalid request line: " + requestLine);
+            int i = indexFrom;
+            while (Character.isWhitespace(buffer.charAt(i))) {
+                i++;
+            }
+            int blank = buffer.indexOf(' ', i);
+            if (blank < 0) {
+                throw new ProtocolException("Invalid request line: " + 
+                        buffer.substring(indexFrom, indexTo));
+            }
+            String method = buffer.substringTrimmed(i, blank);
+            i = blank;
+            while (Character.isWhitespace(buffer.charAt(i))) {
+                i++;
+            }
+            blank = buffer.indexOf(' ', i);
+            if (blank < 0) {
+                throw new ProtocolException("Invalid request line: " + 
+                        buffer.substring(indexFrom, indexTo));
+            }
+            String uri = buffer.substringTrimmed(i, blank);
+            HttpVersion ver = HttpVersion.parse(buffer, blank, indexTo);
+            return new RequestLine(method, uri, ver);
+        } catch (IndexOutOfBoundsException e) {
+            throw new ProtocolException("Invalid request line: " + 
+                    buffer.substring(indexFrom, indexTo)); 
         }
-        return new RequestLine(method, uri, HttpVersion.parse(protocol));
     }
 
+    public static final RequestLine parse(final String s)
+            throws ProtocolException {
+        if (s == null) {
+            throw new IllegalArgumentException("String may not be null");
+        }
+        CharArrayBuffer buffer = new CharArrayBuffer(s.length()); 
+        buffer.append(s);
+        return parse(buffer, 0, buffer.length());
+    }
+    
 }

Modified: jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/StatusLine.java
URL: http://svn.apache.org/viewcvs/jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/StatusLine.java?rev=349036&r1=349035&r2=349036&view=diff
==============================================================================
--- jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/StatusLine.java (original)
+++ jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/StatusLine.java Fri Nov 25 15:25:13 2005
@@ -99,62 +99,77 @@
      * 
      * @since 4.0 
      */
-    public static StatusLine parse(final String statusLine) throws HttpException {
-        if (statusLine == null) {
-            throw new IllegalArgumentException("Status line string may not be null");
-        }
-        HttpVersion httpVersion = null;
-        int statusCode = 0;
-        String reasonPhrase = null;
-        int length = statusLine.length();
-        int at = 0;
-        int start = 0;
+    public static StatusLine parse(
+            final CharArrayBuffer buffer, final int indexFrom, final int indexTo) 
+            throws ProtocolException {
+        if (buffer == 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();
+        }
         try {
-            while (Character.isWhitespace(statusLine.charAt(at))) {
-                ++at;
-                ++start;
-            }
-            if (!"HTTP".equals(statusLine.substring(at, at += 4))) {
-                throw new HttpException("Status-Line '" + statusLine 
-                    + "' does not start with HTTP");
-            }
+            int i = indexFrom;
             //handle the HTTP-Version
-            at = statusLine.indexOf(" ", at);
-            if (at <= 0) {
+            while (Character.isWhitespace(buffer.charAt(i))) {
+                i++;
+            }            
+            int blank = buffer.indexOf(' ', i);
+            if (blank <= 0) {
                 throw new ProtocolException(
-                        "Unable to parse HTTP-Version from the status line: '"
-                        + statusLine + "'");
+                        "Unable to parse HTTP-Version from the status line: "
+                        + buffer.substring(indexFrom, indexTo));
             }
-            httpVersion = HttpVersion.parse(statusLine.substring(start, at));
+            HttpVersion ver = HttpVersion.parse(buffer, i, blank);
 
+            i = blank;
             //advance through spaces
-            while (statusLine.charAt(at) == ' ') {
-                at++;
-            }
+            while (Character.isWhitespace(buffer.charAt(i))) {
+                i++;
+            }            
 
             //handle the Status-Code
-            int to = statusLine.indexOf(" ", at);
-            if (to < 0) {
-                to = length;
+            blank = buffer.indexOf(' ', i);
+            if (blank < 0) {
+                blank = indexTo;
             }
+            int statusCode = 0;
             try {
-                statusCode = Integer.parseInt(statusLine.substring(at, to));
+                statusCode = Integer.parseInt(buffer.substringTrimmed(i, blank));
             } catch (NumberFormatException e) {
                 throw new ProtocolException(
-                    "Unable to parse status code from status line: '" 
-                    + statusLine + "'");
+                    "Unable to parse status code from status line: " 
+                    + buffer.substring(indexFrom, indexTo));
             }
             //handle the Reason-Phrase
-            at = to + 1;
-            if (at < length) {
-                reasonPhrase = statusLine.substring(at).trim();
+            i = blank;
+            String reasonPhrase = null;
+            if (i < indexTo) {
+                reasonPhrase = buffer.substringTrimmed(i, indexTo);
             } else {
                 reasonPhrase = "";
             }
-        } catch (StringIndexOutOfBoundsException e) {
-            throw new HttpException("Status-Line '" + statusLine + "' is not valid"); 
+            return new StatusLine(ver, statusCode, reasonPhrase);
+        } catch (IndexOutOfBoundsException e) {
+            throw new ProtocolException("Invalid status line: " + 
+                    buffer.substring(indexFrom, indexTo)); 
         }
-        return new StatusLine(httpVersion, statusCode, reasonPhrase);
+    }
+
+    public static final StatusLine parse(final String s)
+            throws ProtocolException {
+        if (s == null) {
+            throw new IllegalArgumentException("String may not be null");
+        }
+        CharArrayBuffer buffer = new CharArrayBuffer(s.length()); 
+        buffer.append(s);
+        return parse(buffer, 0, buffer.length());
     }
 
     // --------------------------------------------------------- Public Methods
@@ -191,22 +206,5 @@
         }
         return buffer.toString();
     }
-
-    /**
-     * Tests if the string starts with 'HTTP' signature.
-     * @param s string to test
-     * @return <tt>true</tt> if the line starts with 'HTTP' 
-     *   signature, <tt>false</tt> otherwise.
-     */
-    public static boolean startsWithHTTP(final String s) {
-        try {
-            int at = 0;
-            while (Character.isWhitespace(s.charAt(at))) {
-                ++at;
-            }
-            return ("HTTP".equals(s.substring(at, at + 4)));
-        } catch (StringIndexOutOfBoundsException e) {
-            return false;
-        }
-    }
+    
 }

Modified: jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/impl/DefaultHttpClientConnection.java
URL: http://svn.apache.org/viewcvs/jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/impl/DefaultHttpClientConnection.java?rev=349036&r1=349035&r2=349036&view=diff
==============================================================================
--- jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/impl/DefaultHttpClientConnection.java (original)
+++ jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/impl/DefaultHttpClientConnection.java Fri Nov 25 15:25:13 2005
@@ -53,6 +53,7 @@
 import org.apache.http.impl.entity.DefaultEntityGenerator;
 import org.apache.http.impl.entity.EntityGenerator;
 import org.apache.http.impl.entity.EntityWriter;
+import org.apache.http.io.CharArrayBuffer;
 import org.apache.http.io.SocketFactory;
 import org.apache.http.params.HttpParams;
 import org.apache.http.params.HttpProtocolParams;
@@ -77,6 +78,8 @@
     private HttpHost targethost = null;
     private InetAddress localAddress = null;
 
+    private final CharArrayBuffer buffer; 
+    
     /*
      * Dependent interfaces
      */
@@ -86,6 +89,7 @@
         super();
         this.targethost = targethost;
         this.localAddress = localAddress;
+        this.buffer = new CharArrayBuffer(64);
         this.responsefactory = new DefaultHttpResponseFactory();
     }
     
@@ -266,38 +270,60 @@
         }
         return response;
     }
-
+    
+    /**
+     * Tests if the string starts with 'HTTP' signature.
+     * @param buffer buffer to test
+     * @return <tt>true</tt> if the line starts with 'HTTP' 
+     *   signature, <tt>false</tt> otherwise.
+     */
+    private static boolean startsWithHTTP(final CharArrayBuffer buffer) {
+        try {
+            int i = 0;
+            while (Character.isWhitespace(buffer.charAt(i))) {
+                ++i;
+            }
+            return buffer.charAt(i) == 'H' 
+                && buffer.charAt(i + 1) == 'T'
+                && buffer.charAt(i + 2) == 'T'
+                && buffer.charAt(i + 3) == 'P';
+        } catch (IndexOutOfBoundsException e) {
+            return false;
+        }
+    }
+    
     protected HttpMutableResponse readResponseStatusLine(final HttpParams params) 
                 throws HttpException, IOException {
+        // clear the buffer
+        this.buffer.clear();
         //read out the HTTP status string
         int maxGarbageLines = params.getIntParameter(
                 HttpProtocolParams.STATUS_LINE_GARBAGE_LIMIT, Integer.MAX_VALUE);
         int count = 0;
-        String s;
         do {
-            s = this.datareceiver.readLine();
-            if (s == null && count == 0) {
+            int i = this.datareceiver.readLine(this.buffer);
+            if (i == -1 && count == 0) {
                 // The server just dropped connection on us
                 throw new NoHttpResponseException("The server " + 
                         this.targethost.getHostName() + " failed to respond");
             }
-            if (s != null && StatusLine.startsWithHTTP(s)) {
+            if (startsWithHTTP(this.buffer)) {
                 // Got one
                 break;
-            } else if (s == null || count >= maxGarbageLines) {
+            } else if (i == -1 || count >= maxGarbageLines) {
                 // Giving up
                 throw new ProtocolException("The server " + this.targethost.getHostName() + 
                         " failed to respond with a valid HTTP response");
             }
             count++;
             if (isWirelogEnabled()) {
-                wirelog("<< " + s + "[\\r][\\n]");
+                wirelog("<< " + this.buffer.toString() + "[\\r][\\n]");
             }
         } while(true);
         //create the status line from the status string
-        StatusLine statusline = StatusLine.parse(s);
+        StatusLine statusline = StatusLine.parse(this.buffer, 0, this.buffer.length());
         if (isWirelogEnabled()) {
-            wirelog("<< " + s + "[\\r][\\n]");
+            wirelog("<< " + this.buffer.toString() + "[\\r][\\n]");
         }
         HttpMutableResponse response = this.responsefactory.newHttpResponse(statusline);
         response.getParams().setDefaults(params);

Modified: jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/impl/DefaultHttpServerConnection.java
URL: http://svn.apache.org/viewcvs/jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/impl/DefaultHttpServerConnection.java?rev=349036&r1=349035&r2=349036&view=diff
==============================================================================
--- jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/impl/DefaultHttpServerConnection.java (original)
+++ jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/impl/DefaultHttpServerConnection.java Fri Nov 25 15:25:13 2005
@@ -47,6 +47,7 @@
 import org.apache.http.impl.entity.DefaultServerEntityWriter;
 import org.apache.http.impl.entity.EntityGenerator;
 import org.apache.http.impl.entity.EntityWriter;
+import org.apache.http.io.CharArrayBuffer;
 import org.apache.http.params.HttpParams;
 import org.apache.http.util.HeaderParser;
 
@@ -67,9 +68,12 @@
      */
     private HttpRequestFactory requestfactory = null; 
 
+    private final CharArrayBuffer buffer; 
+        
     public DefaultHttpServerConnection() {
         super();
         this.requestfactory = new DefaultHttpRequestFactory();
+        this.buffer = new CharArrayBuffer(128);
     }
     
     public void setRequestFactory(final HttpRequestFactory requestfactory) {
@@ -103,13 +107,14 @@
     
     protected HttpMutableRequest receiveRequestLine(final HttpParams params)
             throws HttpException, IOException {
-        String line = this.datareceiver.readLine();
-        if (line == null) {
+        this.buffer.clear();
+        int i = this.datareceiver.readLine(this.buffer);
+        if (i == -1) {
             throw new ConnectionClosedException("Client closed connection"); 
         }
-        RequestLine requestline = RequestLine.parse(line);
+        RequestLine requestline = RequestLine.parse(this.buffer, 0, this.buffer.length());
         if (isWirelogEnabled()) {
-            wirelog(">> " + line + "[\\r][\\n]");
+            wirelog(">> " + this.buffer.toString() + "[\\r][\\n]");
         }
         HttpMutableRequest request = this.requestfactory.newHttpRequest(requestline);
         request.getParams().setDefaults(params);

Modified: jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestHttpVersion.java
URL: http://svn.apache.org/viewcvs/jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestHttpVersion.java?rev=349036&r1=349035&r2=349036&view=diff
==============================================================================
--- jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestHttpVersion.java (original)
+++ jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestHttpVersion.java Fri Nov 25 15:25:13 2005
@@ -29,6 +29,8 @@
 
 package org.apache.http;
 
+import org.apache.http.io.CharArrayBuffer;
+
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
@@ -91,6 +93,18 @@
             //expected
         }
         try {
+            HttpVersion.parse("    ");
+            fail("ProtocolException should have been thrown");
+        } catch (ProtocolException e) {
+            //expected
+        }
+        try {
+            HttpVersion.parse("HTT");
+            fail("ProtocolException should have been thrown");
+        } catch (ProtocolException e) {
+            //expected
+        }
+        try {
             HttpVersion.parse("crap");
             fail("ProtocolException should have been thrown");
         } catch (ProtocolException e) {
@@ -137,6 +151,41 @@
             fail("ProtocolException should have been thrown");
         } catch (ProtocolException e) {
             //expected
+        }
+    }
+
+    public void testInvalidInput() throws Exception {
+        CharArrayBuffer buffer = new CharArrayBuffer(32);
+        buffer.append("HTTP/1.1");
+        try {
+            HttpVersion.parse(null, 0, 0);
+            fail("IllegalArgumentException should have been thrown");
+        } catch (IllegalArgumentException ex) {
+            // expected
+        }
+        try {
+            HttpVersion.parse(null);
+            fail("IllegalArgumentException should have been thrown");
+        } catch (IllegalArgumentException ex) {
+            // expected
+        }
+        try {
+            HttpVersion.parse(buffer, -1, 0);
+            fail("IllegalArgumentException should have been thrown");
+        } catch (IndexOutOfBoundsException ex) {
+            // expected
+        }
+        try {
+            HttpVersion.parse(buffer, 0, 1000);
+            fail("IllegalArgumentException should have been thrown");
+        } catch (IndexOutOfBoundsException ex) {
+            // expected
+        }
+        try {
+            HttpVersion.parse(buffer, 2, 1);
+            fail("IllegalArgumentException should have been thrown");
+        } catch (IndexOutOfBoundsException ex) {
+            // expected
         }
     }
 

Modified: jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestRequestLine.java
URL: http://svn.apache.org/viewcvs/jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestRequestLine.java?rev=349036&r1=349035&r2=349036&view=diff
==============================================================================
--- jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestRequestLine.java (original)
+++ jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestRequestLine.java Fri Nov 25 15:25:13 2005
@@ -28,6 +28,8 @@
 
 package org.apache.http;
 
+import org.apache.http.io.CharArrayBuffer;
+
 import junit.framework.*;
 
 /**
@@ -102,6 +104,16 @@
 
     public void testFailure() throws Exception {
         try {
+            RequestLine.parse("    ");
+            fail();
+        } catch (HttpException e) { /* expected */ }
+
+        try {
+            RequestLine.parse("  GET");
+            fail();
+        } catch (HttpException e) { /* expected */ }
+
+        try {
             RequestLine.parse("GET /stuff");
             fail();
         } catch (HttpException e) { /* expected */ }
@@ -112,11 +124,39 @@
         } catch (HttpException e) { /* expected */ }
     }
 
-    public void testNullInput() throws Exception {
+    public void testInvalidInput() throws Exception {
+        CharArrayBuffer buffer = new CharArrayBuffer(32);
+        buffer.append("GET /stuff HTTP/1.1");
+        try {
+            RequestLine.parse(null, 0, 0);
+            fail("IllegalArgumentException should have been thrown");
+        } catch (IllegalArgumentException ex) {
+            // expected
+        }
         try {
             RequestLine.parse(null);
             fail("IllegalArgumentException should have been thrown");
-        } catch (IllegalArgumentException e) { /* expected */ }
+        } catch (IllegalArgumentException ex) {
+            // expected
+        }
+        try {
+            RequestLine.parse(buffer, -1, 0);
+            fail("IllegalArgumentException should have been thrown");
+        } catch (IndexOutOfBoundsException ex) {
+            // expected
+        }
+        try {
+            RequestLine.parse(buffer, 0, 1000);
+            fail("IllegalArgumentException should have been thrown");
+        } catch (IndexOutOfBoundsException ex) {
+            // expected
+        }
+        try {
+            RequestLine.parse(buffer, 2, 1);
+            fail("IllegalArgumentException should have been thrown");
+        } catch (IndexOutOfBoundsException ex) {
+            // expected
+        }
     }
 
 }

Modified: jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestStatusLine.java
URL: http://svn.apache.org/viewcvs/jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestStatusLine.java?rev=349036&r1=349035&r2=349036&view=diff
==============================================================================
--- jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestStatusLine.java (original)
+++ jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestStatusLine.java Fri Nov 25 15:25:13 2005
@@ -28,6 +28,8 @@
 
 package org.apache.http;
 
+import org.apache.http.io.CharArrayBuffer;
+
 import junit.framework.*;
 
 /**
@@ -84,16 +86,6 @@
         } catch (IllegalArgumentException e) { /* expected */ }
     }
         
-    public void testIfStatusLine() throws Exception {
-        assertTrue(StatusLine.startsWithHTTP("HTTP"));
-        assertTrue(StatusLine.startsWithHTTP("         HTTP"));
-        assertTrue(StatusLine.startsWithHTTP("\rHTTP"));
-        assertTrue(StatusLine.startsWithHTTP("\tHTTP"));
-        assertFalse(StatusLine.startsWithHTTP("crap"));
-        assertFalse(StatusLine.startsWithHTTP("HTT"));
-        assertFalse(StatusLine.startsWithHTTP("http"));
-    }
-
     public void testSuccess() throws Exception {
         //typical status line
         StatusLine statusLine = StatusLine.parse("HTTP/1.1 200 OK");
@@ -164,13 +156,41 @@
         } catch (HttpException e) { /* expected */ }
     }
 
-    public void testNullInput() throws Exception {
+    public void testInvalidInput() throws Exception {
+        CharArrayBuffer buffer = new CharArrayBuffer(32);
+        buffer.append("HTTP/1.1 200 OK");
+        try {
+            StatusLine.parse(null, 0, 0);
+            fail("IllegalArgumentException should have been thrown");
+        } catch (IllegalArgumentException ex) {
+            // expected
+        }
         try {
             StatusLine.parse(null);
             fail("IllegalArgumentException should have been thrown");
-        } catch (IllegalArgumentException e) { /* expected */ }
+        } catch (IllegalArgumentException ex) {
+            // expected
+        }
+        try {
+            StatusLine.parse(buffer, -1, 0);
+            fail("IllegalArgumentException should have been thrown");
+        } catch (IndexOutOfBoundsException ex) {
+            // expected
+        }
+        try {
+            StatusLine.parse(buffer, 0, 1000);
+            fail("IllegalArgumentException should have been thrown");
+        } catch (IndexOutOfBoundsException ex) {
+            // expected
+        }
+        try {
+            StatusLine.parse(buffer, 2, 1);
+            fail("IllegalArgumentException should have been thrown");
+        } catch (IndexOutOfBoundsException ex) {
+            // expected
+        }
     }
-    
+
     public void testToString() throws Exception {
         StatusLine statusline = new StatusLine(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "OK");
         assertEquals("HTTP/1.1 200 OK", statusline.toString());