Hi all,
Wolfgang Baer wrote:
> Hi David,
>
> David Daney wrote:
[...]
>>
>>I wrote both put and putAll to mimic their old bahavior. I wanted to
>>change the behavior as little as possible, while still fixing it.
>>
>>putAll() IIRC is only used internally, to propagate the headers into the
>>Request object. I question whether it should be changed.
I am checking this in now. Just for clarification: The patch attached (and
committed) does not change the putAll() method anymore (it only uses
one iteration instead of two).
Committed with updated changelog.
Wolfgang
> 2006-03-07 Wolfgang Baer <[EMAIL PROTECTED]>
>
> * gnu/java/net/protocol/http/Headers.java: Added documentation all over.
> (dateFormat): Made private.
> (put): Replace only the last occurance and the value.
> (putAll): Save one iteration. Clarified documenation.
>
>
> ------------------------------------------------------------------------
>
> Index: Headers.java
> ===================================================================
> RCS file:
> /cvsroot/classpath/classpath/gnu/java/net/protocol/http/Headers.java,v
> retrieving revision 1.7
> diff -u -r1.7 Headers.java
> --- Headers.java 3 Mar 2006 23:05:33 -0000 1.7
> +++ Headers.java 7 Mar 2006 07:52:04 -0000
> @@ -50,7 +50,6 @@
> import java.util.Iterator;
> import java.util.LinkedHashMap;
> import java.util.Map;
> -import java.util.Set;
>
> /**
> * A collection of HTTP header names and associated values. The
> @@ -65,12 +64,18 @@
> {
> /**
> * A list of HeaderElements
> - *
> */
> private final ArrayList headers = new ArrayList();
>
> - static final DateFormat dateFormat = new HTTPDateFormat();
> + /**
> + * The HTTP dateformat used to parse date header fields.
> + */
> + private static final DateFormat dateFormat = new HTTPDateFormat();
>
> + /**
> + * Class for a Header element consisting of
> + * a name and value String.
> + */
> static class HeaderElement
> {
> String name;
> @@ -83,8 +88,12 @@
> }
> }
>
> + /**
> + * Default constructor.
> + */
> public Headers()
> {
> + // nothing to do
> }
>
> /**
> @@ -99,8 +108,11 @@
> }
>
> /**
> - * Returns the value of the specified header as a string. If
> + * Returns the value of the specified header as a string. If
> * multiple values are present, the last one is returned.
> + *
> + * @param header the header name (case insensitive search)
> + * @return The header value or <code>null</code> if not found.
> */
> public String getValue(String header)
> {
> @@ -116,8 +128,12 @@
> }
>
> /**
> - * Returns the value of the specified header as an integer,
> - * or -1 if the header is not present or not an integer.
> + * Returns the value of the specified header as an integer. If
> + * multiple values are present, the last one is returned.
> + *
> + * @param header the header name (case insensitive search)
> + * @return The header value or <code>-1</code> if not present or
> + * not an integer value.
> */
> public int getIntValue(String header)
> {
> @@ -132,13 +148,18 @@
> }
> catch (NumberFormatException e)
> {
> + // fall through
> }
> return -1;
> }
>
> /**
> - * Returns the value of the specified header as a long, or -1 if the
> - * header is not present or cannot be parsed as a long.
> + * Returns the value of the specified header as a long. If
> + * multiple values are present, the last one is returned.
> + *
> + * @param header the header name (case insensitive search)
> + * @return The header value or <code>-1</code> if not present or
> + * not a long value.
> */
> public long getLongValue(String header)
> {
> @@ -153,13 +174,18 @@
> }
> catch (NumberFormatException e)
> {
> + // fall through
> }
> return -1;
> }
>
> /**
> - * Returns the value of the specified header as a date,
> - * or <code>null</code> if the header is not present or not a date.
> + * Returns the value of the specified header as a date. If
> + * multiple values are present, the last one is returned.
> + *
> + * @param header the header name (case insensitive search)
> + * @return The header value or <code>null</code> if not present or
> + * not a date value.
> */
> public Date getDateValue(String header)
> {
> @@ -180,23 +206,35 @@
>
> /**
> * Add a header to this set of headers. If there is an existing
> - * header with the same name, it is discarded.
> + * header with the same name it's value is replaced with the new value.
> + * If multiple headers of the same name exist only the last one's value
> + * is replaced.
> *
> * @param name the header name
> * @param value the header value
> *
> - * @see #addValue
> + * @see #addValue(String, String)
> */
> public void put(String name, String value)
> - {
> - remove(name);
> - headers.add(headers.size(), new HeaderElement(name, value));
> + {
> + for (int i = headers.size() - 1; i >= 0; i--)
> + {
> + HeaderElement e = (HeaderElement)headers.get(i);
> + if (e.name.equalsIgnoreCase(name))
> + {
> + e.value = value;
> + return;
> + }
> + }
> +
> + // nothing was replaced so add it as new HeaderElement
> + addValue(name, value);
> }
> -
> +
> /**
> - * Add all headers from a set of headers to this set. If any of the
> - * headers to be added have the same name as existing headers, the
> - * existing headers will be discarded.
> + * Add all headers from a set of headers to this set. Any existing header
> + * with the same (case insensitive) name as one of the new headers will
> + * be overridden.
> *
> * @param o the headers to be added
> */
> @@ -206,10 +244,6 @@
> {
> HeaderElement e = (HeaderElement)it.next();
> remove(e.name);
> - }
> - for (Iterator it = o.iterator(); it.hasNext(); )
> - {
> - HeaderElement e = (HeaderElement)it.next();
> addValue(e.name, e.value);
> }
> }
> @@ -234,6 +268,7 @@
> * Parse the specified InputStream, adding headers to this collection.
> *
> * @param in the InputStream.
> + * @throws IOException if I/O error occured.
> */
> public void parse(InputStream in)
> throws IOException
> @@ -303,7 +338,7 @@
> * @param name the header name
> * @param value the header value
> *
> - * @see #put
> + * @see #put(String, String)
> */
> public void addValue(String name, String value)
> {
> @@ -312,13 +347,14 @@
>
> /**
> * Get a new Map containing all the headers. The keys of the Map
> - * are Strings (the header names). The values of the Map are
> + * are Strings (the header names). The headers will be included
> + * case-sensitive in the map so that querying must be done with the
> + * correct case of the needed header name. The values of the Map are
> * unmodifiable Lists containing Strings (the header values).
> *
> - * <p>
> - *
> - * The returned map is modifiable. Changing it will not effect this
> - * collection of Headers in any way.
> + * <p>
> + * The returned map is modifiable. Changing it will not effect this
> + * collection of Headers in any way.</p>
> *
> * @return a Map containing all the headers.
> */
> @@ -352,9 +388,9 @@
> *
> * @param i the header index.
> *
> - * @return the header name.
> + * @return The header name, or <code>null</code> if index outside of range.
> *
> - * @see #getHeaderValue
> + * @see #getHeaderValue(int)
> */
> public String getHeaderName(int i)
> {
> @@ -369,9 +405,9 @@
> *
> * @param i the header index.
> *
> - * @return the header value.
> + * @return the header value, or <code>null</code> if index outside of
> range.
> *
> - * @see #getHeaderName
> + * @see #getHeaderName(int)
> */
> public String getHeaderValue(int i)
> {