/*
 * ====================================================================
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 *
 */

package org.apache.http.message;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;

import org.apache.http.Header;
import org.apache.http.HeaderIterator;
import org.apache.http.util.CharArrayBuffer;

A class for combining a set of headers. This class allows for multiple headers with the same name and keeps track of the order in which headers were added.
Since:4.0
/** * A class for combining a set of headers. * This class allows for multiple headers with the same name and * keeps track of the order in which headers were added. * * * @since 4.0 */
public class HeaderGroup implements Cloneable, Serializable { private static final long serialVersionUID = 2608834160639271617L; private static final Header[] EMPTY = new Header[] {};
The list of headers for this group, in the order in which they were added
/** The list of headers for this group, in the order in which they were added */
private final List<Header> headers;
Constructor for HeaderGroup.
/** * Constructor for HeaderGroup. */
public HeaderGroup() { this.headers = new ArrayList<Header>(16); }
Removes any contained headers.
/** * Removes any contained headers. */
public void clear() { headers.clear(); }
Adds the given header to the group. The order in which this header was added is preserved.
Params:
  • header – the header to add
/** * Adds the given header to the group. The order in which this header was * added is preserved. * * @param header the header to add */
public void addHeader(final Header header) { if (header == null) { return; } headers.add(header); }
Removes the given header.
Params:
  • header – the header to remove
/** * Removes the given header. * * @param header the header to remove */
public void removeHeader(final Header header) { if (header == null) { return; } headers.remove(header); }
Replaces the first occurence of the header with the same name. If no header with the same name is found the given header is added to the end of the list.
Params:
  • header – the new header that should replace the first header with the same name if present in the list.
/** * Replaces the first occurence of the header with the same name. If no header with * the same name is found the given header is added to the end of the list. * * @param header the new header that should replace the first header with the same * name if present in the list. */
public void updateHeader(final Header header) { if (header == null) { return; } // HTTPCORE-361 : we don't use the for-each syntax, i.e. // for (Header header : headers) // as that creates an Iterator that needs to be garbage-collected for (int i = 0; i < this.headers.size(); i++) { final Header current = this.headers.get(i); if (current.getName().equalsIgnoreCase(header.getName())) { this.headers.set(i, header); return; } } this.headers.add(header); }
Sets all of the headers contained within this group overriding any existing headers. The headers are added in the order in which they appear in the array.
Params:
  • headers – the headers to set
/** * Sets all of the headers contained within this group overriding any * existing headers. The headers are added in the order in which they appear * in the array. * * @param headers the headers to set */
public void setHeaders(final Header[] headers) { clear(); if (headers == null) { return; } Collections.addAll(this.headers, headers); }
Gets a header representing all of the header values with the given name. If more that one header with the given name exists the values will be combined with a "," as per RFC 2616.

Header name comparison is case insensitive.

Params:
  • name – the name of the header(s) to get
Returns:a header with a condensed value or null if no headers by the given name are present
/** * Gets a header representing all of the header values with the given name. * If more that one header with the given name exists the values will be * combined with a "," as per RFC 2616. * * <p>Header name comparison is case insensitive. * * @param name the name of the header(s) to get * @return a header with a condensed value or {@code null} if no * headers by the given name are present */
public Header getCondensedHeader(final String name) { final Header[] hdrs = getHeaders(name); if (hdrs.length == 0) { return null; } else if (hdrs.length == 1) { return hdrs[0]; } else { final CharArrayBuffer valueBuffer = new CharArrayBuffer(128); valueBuffer.append(hdrs[0].getValue()); for (int i = 1; i < hdrs.length; i++) { valueBuffer.append(", "); valueBuffer.append(hdrs[i].getValue()); } return new BasicHeader(name.toLowerCase(Locale.ROOT), valueBuffer.toString()); } }
Gets all of the headers with the given name. The returned array maintains the relative order in which the headers were added.

Header name comparison is case insensitive.

Params:
  • name – the name of the header(s) to get
Returns:an array of length ≥ 0
/** * Gets all of the headers with the given name. The returned array * maintains the relative order in which the headers were added. * * <p>Header name comparison is case insensitive. * * @param name the name of the header(s) to get * * @return an array of length &ge; 0 */
public Header[] getHeaders(final String name) { List<Header> headersFound = null; // HTTPCORE-361 : we don't use the for-each syntax, i.e. // for (Header header : headers) // as that creates an Iterator that needs to be garbage-collected for (int i = 0; i < this.headers.size(); i++) { final Header header = this.headers.get(i); if (header.getName().equalsIgnoreCase(name)) { if (headersFound == null) { headersFound = new ArrayList<Header>(); } headersFound.add(header); } } return headersFound != null ? headersFound.toArray(new Header[headersFound.size()]) : EMPTY; }
Gets the first header with the given name.

Header name comparison is case insensitive.

Params:
  • name – the name of the header to get
Returns:the first header or null
/** * Gets the first header with the given name. * * <p>Header name comparison is case insensitive. * * @param name the name of the header to get * @return the first header or {@code null} */
public Header getFirstHeader(final String name) { // HTTPCORE-361 : we don't use the for-each syntax, i.e. // for (Header header : headers) // as that creates an Iterator that needs to be garbage-collected for (int i = 0; i < this.headers.size(); i++) { final Header header = this.headers.get(i); if (header.getName().equalsIgnoreCase(name)) { return header; } } return null; }
Gets the last header with the given name.

Header name comparison is case insensitive.

Params:
  • name – the name of the header to get
Returns:the last header or null
/** * Gets the last header with the given name. * * <p>Header name comparison is case insensitive. * * @param name the name of the header to get * @return the last header or {@code null} */
public Header getLastHeader(final String name) { // start at the end of the list and work backwards for (int i = headers.size() - 1; i >= 0; i--) { final Header header = headers.get(i); if (header.getName().equalsIgnoreCase(name)) { return header; } } return null; }
Gets all of the headers contained within this group.
Returns:an array of length ≥ 0
/** * Gets all of the headers contained within this group. * * @return an array of length &ge; 0 */
public Header[] getAllHeaders() { return headers.toArray(new Header[headers.size()]); }
Tests if headers with the given name are contained within this group.

Header name comparison is case insensitive.

Params:
  • name – the header name to test for
Returns:true if at least one header with the name is contained, false otherwise
/** * Tests if headers with the given name are contained within this group. * * <p>Header name comparison is case insensitive. * * @param name the header name to test for * @return {@code true} if at least one header with the name is * contained, {@code false} otherwise */
public boolean containsHeader(final String name) { // HTTPCORE-361 : we don't use the for-each syntax, i.e. // for (Header header : headers) // as that creates an Iterator that needs to be garbage-collected for (int i = 0; i < this.headers.size(); i++) { final Header header = this.headers.get(i); if (header.getName().equalsIgnoreCase(name)) { return true; } } return false; }
Returns an iterator over this group of headers.
Returns:iterator over this group of headers.
Since:4.0
/** * Returns an iterator over this group of headers. * * @return iterator over this group of headers. * * @since 4.0 */
public HeaderIterator iterator() { return new BasicListHeaderIterator(this.headers, null); }
Returns an iterator over the headers with a given name in this group.
Params:
  • name – the name of the headers over which to iterate, or null for all headers
Returns:iterator over some headers in this group.
Since:4.0
/** * Returns an iterator over the headers with a given name in this group. * * @param name the name of the headers over which to iterate, or * {@code null} for all headers * * @return iterator over some headers in this group. * * @since 4.0 */
public HeaderIterator iterator(final String name) { return new BasicListHeaderIterator(this.headers, name); }
Returns a copy of this object
Returns:copy of this object
Since:4.0
/** * Returns a copy of this object * * @return copy of this object * * @since 4.0 */
public HeaderGroup copy() { final HeaderGroup clone = new HeaderGroup(); clone.headers.addAll(this.headers); return clone; } @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } @Override public String toString() { return this.headers.toString(); } }