Return-Path: Delivered-To: apmail-jakarta-httpclient-commits-archive@www.apache.org Received: (qmail 10561 invoked from network); 24 Nov 2005 21:07:17 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 24 Nov 2005 21:07:17 -0000 Received: (qmail 25389 invoked by uid 500); 24 Nov 2005 21:07:17 -0000 Mailing-List: contact httpclient-commits-help@jakarta.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: httpclient-dev@jakarta.apache.org Delivered-To: mailing list httpclient-commits@jakarta.apache.org Received: (qmail 25378 invoked by uid 99); 24 Nov 2005 21:07:17 -0000 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [209.237.227.194] (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.29) with SMTP; Thu, 24 Nov 2005 13:07:17 -0800 Received: (qmail 10234 invoked by uid 65534); 24 Nov 2005 21:06:56 -0000 Message-ID: <20051124210656.10233.qmail@minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r348803 - in /jakarta/httpcomponents/trunk/http-core/src: java/org/apache/http/Header.java java/org/apache/http/HeaderElement.java test/org/apache/http/TestHeaderElement.java Date: Thu, 24 Nov 2005 21:06:56 -0000 To: httpclient-commits@jakarta.apache.org From: olegk@apache.org X-Mailer: svnmailer-1.0.5 X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: olegk Date: Thu Nov 24 13:06:48 2005 New Revision: 348803 URL: http://svn.apache.org/viewcvs?rev=348803&view=rev Log: HeaderElement parsing code refactored to make use of CharArrayBuffer Modified: jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/Header.java jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/HeaderElement.java jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestHeaderElement.java Modified: jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/Header.java URL: http://svn.apache.org/viewcvs/jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/Header.java?rev=348803&r1=348802&r2=348803&view=diff ============================================================================== --- jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/Header.java (original) +++ jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/Header.java Thu Nov 24 13:06:48 2005 @@ -176,8 +176,7 @@ * @since 3.0 */ public HeaderElement[] getElements() { - return HeaderElement.parseElements( - this.buffer.internBuffer(), this.posValue, this.buffer.length()); + return HeaderElement.parseElements(this.buffer, this.posValue, this.buffer.length()); } } 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=348803&r1=348802&r2=348803&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 Thu Nov 24 13:06:48 2005 @@ -124,47 +124,6 @@ } /** - * Constructor with array of characters. - * - * @param chars the array of characters - * @param offset - the initial offset. - * @param length - the length. - * - * @since 3.0 - */ - public HeaderElement(char[] chars, int offset, int length) { - super(); - ParameterParser parser = new ParameterParser(); - List params = parser.parse(chars, offset, length, ';'); - if (params.size() > 0) { - NameValuePair element = (NameValuePair) params.remove(0); - this.name = element.getName(); - this.value = element.getValue(); - if (params.size() > 0) { - this.parameters = (NameValuePair[]) - params.toArray(new NameValuePair[params.size()]); - } else { - this.parameters = new NameValuePair[] {}; - } - } else { - this.name = ""; - this.value = null; - this.parameters = new NameValuePair[] {}; - } - } - - /** - * Constructor with array of characters. - * - * @param chars the array of characters - * - * @since 3.0 - */ - public HeaderElement(char[] chars) { - this(chars, 0, chars.length); - } - - /** * Returns the name. * * @return String name The name @@ -204,24 +163,33 @@ * * @since 3.0 */ - public static final HeaderElement[] parseElements(char[] headerValue, int indexFrom, int indexTo) { - if (headerValue == null) { - return new HeaderElement[] {}; + public static final HeaderElement[] parseElements(final CharArrayBuffer buffer, int indexFrom, int indexTo) { + 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(); } List elements = new ArrayList(); int i = indexFrom; boolean qouted = false; while (i < indexTo) { - char ch = headerValue[i]; + char ch = buffer.charAt(i); if (ch == '"') { qouted = !qouted; } HeaderElement element = null; if ((!qouted) && (ch == ',')) { - element = new HeaderElement(headerValue, indexFrom, i); + element = parse(buffer, indexFrom, i); indexFrom = i + 1; } else if (i == indexTo - 1) { - element = new HeaderElement(headerValue, indexFrom, indexTo); + element = parse(buffer, indexFrom, indexTo); } if (element != null && !element.getName().equals("")) { elements.add(element); @@ -236,17 +204,57 @@ * This parses the value part of a header. The result is an array of * HeaderElement objects. * - * @param headerValue the string representation of the header value + * @param s the string representation of the header value * (as received from the web server). * @return array of {@link HeaderElement}s. * * @since 3.0 */ - public static final HeaderElement[] parseElements(final String headerValue) { - if (headerValue == null) { - return new HeaderElement[] {}; + public static final HeaderElement[] parseElements(final String s) { + if (s == null) { + throw new IllegalArgumentException("String may not be null"); + } + CharArrayBuffer buffer = new CharArrayBuffer(s.length()); + buffer.append(s); + return parseElements(buffer, 0, buffer.length()); + } + + public static HeaderElement parse(final CharArrayBuffer buffer, int indexFrom, int indexTo) { + 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(); + } + ParameterParser parser = new ParameterParser(); + List paramlist = parser.parse(buffer.internBuffer(), indexFrom, indexTo, ';'); + if (paramlist.size() > 0) { + NameValuePair element = (NameValuePair) paramlist.remove(0); + String name = element.getName(); + String value = element.getValue(); + NameValuePair[] params = null; + if (paramlist.size() > 0) { + params = (NameValuePair[]) paramlist.toArray(new NameValuePair[paramlist.size()]); + } + return new HeaderElement(name, value, params); + } else { + return new HeaderElement("", null, null); + } + } + + public static final HeaderElement parse(final String s) { + if (s == null) { + throw new IllegalArgumentException("String may not be null"); } - return parseElements(headerValue.toCharArray(), 0, headerValue.length()); + CharArrayBuffer buffer = new CharArrayBuffer(s.length()); + buffer.append(s); + return parse(buffer, 0, buffer.length()); } /** Modified: jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestHeaderElement.java URL: http://svn.apache.org/viewcvs/jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestHeaderElement.java?rev=348803&r1=348802&r2=348803&view=diff ============================================================================== --- jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestHeaderElement.java (original) +++ jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestHeaderElement.java Thu Nov 24 13:06:48 2005 @@ -30,6 +30,8 @@ package org.apache.http; +import org.apache.http.io.CharArrayBuffer; + import junit.framework.*; /** @@ -82,7 +84,7 @@ public void testCharArrayConstructor() throws Exception { String s = "name = value; param1 = value1"; - HeaderElement element = new HeaderElement(s.toCharArray()); + HeaderElement element = HeaderElement.parse(s); assertEquals("name", element.getName()); assertEquals("value", element.getValue()); assertEquals(1, element.getParameters().length); @@ -149,19 +151,75 @@ HeaderElement[] elements = HeaderElement.parseElements(headerValue); assertEquals("Number of elements", 0, elements.length); } - - public void testNullInput() throws Exception { - HeaderElement[] elements = HeaderElement.parseElements((char [])null, 0, 0); - assertNotNull(elements); - assertEquals("Number of elements", 0, elements.length); - elements = HeaderElement.parseElements((String)null); - assertNotNull(elements); - assertEquals("Number of elements", 0, elements.length); - } + public void testInvalidInput() throws Exception { + CharArrayBuffer buffer = new CharArrayBuffer(32); + buffer.append("name = value"); + try { + HeaderElement.parseElements(null, 0, 0); + fail("IllegalArgumentException should have been thrown"); + } catch (IllegalArgumentException ex) { + // expected + } + try { + HeaderElement.parseElements(null); + fail("IllegalArgumentException should have been thrown"); + } catch (IllegalArgumentException ex) { + // expected + } + try { + HeaderElement.parseElements(buffer, -1, 0); + fail("IllegalArgumentException should have been thrown"); + } catch (IndexOutOfBoundsException ex) { + // expected + } + try { + HeaderElement.parseElements(buffer, 0, 1000); + fail("IllegalArgumentException should have been thrown"); + } catch (IndexOutOfBoundsException ex) { + // expected + } + try { + HeaderElement.parseElements(buffer, 2, 1); + fail("IllegalArgumentException should have been thrown"); + } catch (IndexOutOfBoundsException ex) { + // expected + } + try { + HeaderElement.parse(null, 0, 0); + fail("IllegalArgumentException should have been thrown"); + } catch (IllegalArgumentException ex) { + // expected + } + try { + HeaderElement.parse(null); + fail("IllegalArgumentException should have been thrown"); + } catch (IllegalArgumentException ex) { + // expected + } + try { + HeaderElement.parse(buffer, -1, 0); + fail("IllegalArgumentException should have been thrown"); + } catch (IndexOutOfBoundsException ex) { + // expected + } + try { + HeaderElement.parse(buffer, 0, 1000); + fail("IllegalArgumentException should have been thrown"); + } catch (IndexOutOfBoundsException ex) { + // expected + } + try { + HeaderElement.parse(buffer, 2, 1); + fail("IllegalArgumentException should have been thrown"); + } catch (IndexOutOfBoundsException ex) { + // expected + } + } + public void testParamByName() throws Exception { String s = "name = value; param1 = value1; param2 = value2"; - HeaderElement element = new HeaderElement(s.toCharArray()); + HeaderElement element = HeaderElement.parse(s); assertEquals("value1", element.getParameterByName("param1").getValue()); assertEquals("value2", element.getParameterByName("param2").getValue()); assertNull(element.getParameterByName("param3")); @@ -228,10 +286,10 @@ public void testToString() { String s = "name = value; param1 = value1; param2 = value2"; - HeaderElement element = new HeaderElement(s.toCharArray()); + HeaderElement element = HeaderElement.parse(s); assertEquals(s, element.toString()); s = "name; param1 = value1; param2 = value2"; - element = new HeaderElement(s.toCharArray()); + element = HeaderElement.parse(s); assertEquals(s, element.toString()); }