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/12/07 23:44:21 UTC
svn commit: r354885 - in /jakarta/httpcomponents/trunk/http-core/src:
java/org/apache/http/Header.java test/org/apache/http/TestHeader.java
Author: olegk
Date: Wed Dec 7 14:44:11 2005
New Revision: 354885
URL: http://svn.apache.org/viewcvs?rev=354885&view=rev
Log:
* Header class made immutable again. It is no longer possible to render the content of a Header invalid by mutating the underlying char array buffer
* Header#parseAll method uses an private inner class to produce headers whose parsing is deferred until the header value is consumed (if at all)
Modified:
jakarta/httpcomponents/trunk/http-core/src/java/org/apache/http/Header.java
jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestHeader.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=354885&r1=354884&r2=354885&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 Wed Dec 7 14:44:11 2005
@@ -51,14 +51,9 @@
private final String name;
/**
- * Buffer containing the header in a raw form.
+ * Header value.
*/
- private final CharArrayBuffer buffer;
-
- /**
- * Position of the value in the header.
- */
- private final int posValue;
+ private final String value;
/**
* Autogenerated header flag.
@@ -72,20 +67,13 @@
* @param value the header value
* @param isAutogenerated <tt>true</tt> if the header is autogenerated,
*/
- public Header(final String name, String value, boolean isAutogenerated) {
+ public Header(final String name, final String value, boolean isAutogenerated) {
super();
if (name == null) {
throw new IllegalArgumentException("Name may not be null");
}
this.name = name;
- this.posValue = name.length() + 2;
- int len = name.length() + 2 + (value != null ? value.length() : 0);
- this.buffer = new CharArrayBuffer(len);
- this.buffer.append(name);
- this.buffer.append(": ");
- if (value != null) {
- this.buffer.append(value);
- }
+ this.value = value;
this.isAutogenerated = isAutogenerated;
}
@@ -103,35 +91,6 @@
}
/**
- * <p> Constructor with char array buffer </p>
- * <p> Please note this constructor does not make a deep copy of the
- * char array buffer. If the char array is modified outside the Header
- * object, it may leave the object in a inconsistent state</p>
- *
- * @param name the header name
- * @param value the header value
- * @param isAutogenerated <tt>true</tt> if the header is autogenerated,
- */
- public Header(final CharArrayBuffer buffer) throws ProtocolException {
- super();
- if (buffer == null) {
- throw new IllegalArgumentException("Char array buffer may not be null");
- }
- int comma = buffer.indexOf(':');
- if (comma == -1) {
- throw new ProtocolException("Invalid header: " + buffer.toString());
- }
- this.posValue = comma + 1;
- String s = buffer.substringTrimmed(0, comma);
- if (s.equals("")) {
- throw new ProtocolException("Invalid header: " + buffer.toString());
- }
- this.name = s;
- this.buffer = buffer;
- this.isAutogenerated = false;
- }
-
- /**
* Returns the header name.
*
* @return String name The name
@@ -146,7 +105,7 @@
* @return String value The current value.
*/
public String getValue() {
- return this.buffer.substringTrimmed(this.posValue, this.buffer.length());
+ return this.value;
}
/**
@@ -167,6 +126,12 @@
* @return a string
*/
public String toString() {
+ CharArrayBuffer buffer = new CharArrayBuffer(32);
+ buffer.append(this.name);
+ buffer.append(": ");
+ if (this.value != null) {
+ buffer.append(this.value);
+ }
return buffer.toString();
}
@@ -180,9 +145,39 @@
* @since 3.0
*/
public HeaderElement[] getElements() {
- return HeaderElement.parseAll(this.buffer, this.posValue, this.buffer.length());
+ if (this.value != null) {
+ return HeaderElement.parseAll(this.value);
+ } else {
+ return new HeaderElement[] {};
+ }
}
+
+ static class BufferedHeader extends Header {
+
+ private final CharArrayBuffer buffer;
+ private final int posValue;
+
+ private BufferedHeader(final String name, final CharArrayBuffer buffer, int posValue) {
+ super(name, null, false);
+ this.buffer = buffer;
+ this.posValue = posValue;
+ }
+
+ public String getValue() {
+ return this.buffer.substringTrimmed(this.posValue, this.buffer.length());
+ }
+
+ public HeaderElement[] getElements() {
+ return HeaderElement.parseAll(this.buffer, this.posValue, this.buffer.length());
+ }
+
+ public String toString() {
+ return this.buffer.toString();
+ }
+
+ }
+
public static Header[] parseAll(final HttpDataReceiver datareceiver)
throws HttpException, IOException {
ArrayList headerLines = new ArrayList();
@@ -224,7 +219,16 @@
}
Header[] headers = new Header[headerLines.size()];
for (int i = 0; i < headerLines.size(); i++) {
- headers[i] = new Header((CharArrayBuffer) headerLines.get(i));
+ CharArrayBuffer buffer = (CharArrayBuffer) headerLines.get(i);
+ int comma = buffer.indexOf(':');
+ if (comma == -1) {
+ throw new ProtocolException("Invalid header: " + buffer.toString());
+ }
+ String s = buffer.substringTrimmed(0, comma);
+ if (s.equals("")) {
+ throw new ProtocolException("Invalid header: " + buffer.toString());
+ }
+ headers[i] = new BufferedHeader(s, buffer, comma + 1);
}
return headers;
}
Modified: jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestHeader.java
URL: http://svn.apache.org/viewcvs/jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestHeader.java?rev=354885&r1=354884&r2=354885&view=diff
==============================================================================
--- jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestHeader.java (original)
+++ jakarta/httpcomponents/trunk/http-core/src/test/org/apache/http/TestHeader.java Wed Dec 7 14:44:11 2005
@@ -29,7 +29,6 @@
package org.apache.http;
-import org.apache.http.io.CharArrayBuffer;
import org.apache.http.io.HttpDataReceiver;
import org.apache.http.mockup.HttpDataReceiverMockup;
@@ -64,17 +63,10 @@
assertTrue(header.isAutogenerated());
}
- public void testBasicConstructorValueWithBlanks() {
- Header header = new Header("name", " value ", true);
- assertEquals("name", header.getName());
- assertEquals("value", header.getValue());
- assertTrue(header.isAutogenerated());
- }
-
public void testBasicConstructorNullValue() {
Header header = new Header("name", null, true);
assertEquals("name", header.getName());
- assertEquals("", header.getValue());
+ assertEquals(null, header.getValue());
assertTrue(header.isAutogenerated());
}
@@ -86,49 +78,7 @@
//expected
}
}
-
- public void testCharArrayConstructor() throws Exception {
- CharArrayBuffer buffer1 = new CharArrayBuffer(16);
- buffer1.append("name:value");
- Header header1 = new Header(buffer1);
- assertEquals("name", header1.getName());
- assertEquals("value", header1.getValue());
-
- CharArrayBuffer buffer2 = new CharArrayBuffer(16);
- buffer2.append(" name : value ");
- Header header2 = new Header(buffer2);
- assertEquals("name", header2.getName());
- assertEquals("value", header2.getValue());
- }
-
- public void testNullCharArrayConstructor() throws Exception {
- try {
- new Header(null);
- fail("IllegalArgumentException should have been thrown");
- } catch (IllegalArgumentException ex) {
- // expected
- }
- }
- public void testMalformedCharArrayConstructor() throws Exception {
- try {
- CharArrayBuffer buffer = new CharArrayBuffer(16);
- buffer.append(" whatever ");
- new Header(buffer);
- fail("ProtocolException should have been thrown");
- } catch (ProtocolException ex) {
- // expected
- }
- try {
- CharArrayBuffer buffer = new CharArrayBuffer(16);
- buffer.append(" : whatever ");
- new Header(buffer);
- fail("ProtocolException should have been thrown");
- } catch (ProtocolException ex) {
- // expected
- }
- }
-
public void testToString() {
Header header1 = new Header("name1", "value1");
assertEquals("name1: value1", header1.toString());