1069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project/*
2069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpcore/trunk/module-main/src/main/java/org/apache/http/message/HeaderGroup.java $
3069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * $Revision: 659185 $
4069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * $Date: 2008-05-22 11:07:36 -0700 (Thu, 22 May 2008) $
5069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
6069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * ====================================================================
7069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one
8069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * or more contributor license agreements.  See the NOTICE file
9069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * distributed with this work for additional information
10069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * regarding copyright ownership.  The ASF licenses this file
11069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * to you under the Apache License, Version 2.0 (the
12069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * "License"); you may not use this file except in compliance
13069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * with the License.  You may obtain a copy of the License at
14069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
15069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *   http://www.apache.org/licenses/LICENSE-2.0
16069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
17069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * Unless required by applicable law or agreed to in writing,
18069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * software distributed under the License is distributed on an
19069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
20069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * KIND, either express or implied.  See the License for the
21069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * specific language governing permissions and limitations
22069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * under the License.
23069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * ====================================================================
24069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
25069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * This software consists of voluntary contributions made by many
26069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * individuals on behalf of the Apache Software Foundation.  For more
27069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * information on the Apache Software Foundation, please see
28069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * <http://www.apache.org/>.
29069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
30069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */
31069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
32069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectpackage org.apache.http.message;
33069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
34069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.util.ArrayList;
35069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.util.List;
36069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport java.util.Locale;
37069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
38069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.http.Header;
39069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.http.HeaderIterator;
40069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectimport org.apache.http.util.CharArrayBuffer;
41069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
42069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project/**
43069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * A class for combining a set of headers.
44069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * This class allows for multiple headers with the same name and
45069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * keeps track of the order in which headers were added.
46069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
47069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @author Michael Becke
48069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project *
49069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project * @since 4.0
50069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project */
51069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Projectpublic class HeaderGroup implements Cloneable {
52069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
53069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /** The list of headers for this group, in the order in which they were added */
54069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    private List headers;
55069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
56069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
57069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Constructor for HeaderGroup.
58069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
59069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public HeaderGroup() {
60069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        this.headers = new ArrayList(16);
61069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
62069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
63069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
64069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Removes any contained headers.
65069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
66069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public void clear() {
67069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        headers.clear();
68069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
69069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
70069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
71069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Adds the given header to the group.  The order in which this header was
72069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * added is preserved.
73069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
74069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param header the header to add
75069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
76069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public void addHeader(Header header) {
77069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (header == null) {
78069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return;
79069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
80069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        headers.add(header);
81069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
82069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
83069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
84069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Removes the given header.
85069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
86069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param header the header to remove
87069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
88069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public void removeHeader(Header header) {
89069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (header == null) {
90069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return;
91069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
92069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        headers.remove(header);
93069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
94069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
95069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
96069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Replaces the first occurence of the header with the same name. If no header with
97069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * the same name is found the given header is added to the end of the list.
98069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
99069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param header the new header that should replace the first header with the same
100069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * name if present in the list.
101069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
102069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public void updateHeader(Header header) {
103069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (header == null) {
104069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return;
105069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
106069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        for (int i = 0; i < this.headers.size(); i++) {
107069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            Header current = (Header) this.headers.get(i);
108069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            if (current.getName().equalsIgnoreCase(header.getName())) {
109069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                this.headers.set(i, header);
110069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                return;
111069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            }
112069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
113069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        this.headers.add(header);
114069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
115069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
116069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
117069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Sets all of the headers contained within this group overriding any
118069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * existing headers. The headers are added in the order in which they appear
119069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * in the array.
120069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
121069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param headers the headers to set
122069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
123069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public void setHeaders(Header[] headers) {
124069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        clear();
125069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (headers == null) {
126069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return;
127069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
128069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        for (int i = 0; i < headers.length; i++) {
129069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            this.headers.add(headers[i]);
130069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
131069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
132069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
133069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
134069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Gets a header representing all of the header values with the given name.
135069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * If more that one header with the given name exists the values will be
136069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * combined with a "," as per RFC 2616.
137069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
138069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <p>Header name comparison is case insensitive.
139069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
140069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param name the name of the header(s) to get
141069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return a header with a condensed value or <code>null</code> if no
142069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * headers by the given name are present
143069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
144069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public Header getCondensedHeader(String name) {
145069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        Header[] headers = getHeaders(name);
146069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
147069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        if (headers.length == 0) {
148069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return null;
149069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else if (headers.length == 1) {
150069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return headers[0];
151069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        } else {
152069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            CharArrayBuffer valueBuffer = new CharArrayBuffer(128);
153069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            valueBuffer.append(headers[0].getValue());
154069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            for (int i = 1; i < headers.length; i++) {
155069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                valueBuffer.append(", ");
156069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                valueBuffer.append(headers[i].getValue());
157069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            }
158069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
159069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            return new BasicHeader(name.toLowerCase(Locale.ENGLISH), valueBuffer.toString());
160069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
161069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
162069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
163069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
164069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Gets all of the headers with the given name.  The returned array
165069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * maintains the relative order in which the headers were added.
166069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
167069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <p>Header name comparison is case insensitive.
168069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
169069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param name the name of the header(s) to get
170069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
171069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return an array of length >= 0
172069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
173069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public Header[] getHeaders(String name) {
174069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        ArrayList headersFound = new ArrayList();
175069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
176069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        for (int i = 0; i < headers.size(); i++) {
177069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            Header header = (Header) headers.get(i);
178069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            if (header.getName().equalsIgnoreCase(name)) {
179069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                headersFound.add(header);
180069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            }
181069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
182069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
183069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return (Header[]) headersFound.toArray(new Header[headersFound.size()]);
184069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
185069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
186069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
187069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Gets the first header with the given name.
188069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
189069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <p>Header name comparison is case insensitive.
190069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
191069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param name the name of the header to get
192069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return the first header or <code>null</code>
193069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
194069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public Header getFirstHeader(String name) {
195069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        for (int i = 0; i < headers.size(); i++) {
196069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            Header header = (Header) headers.get(i);
197069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            if (header.getName().equalsIgnoreCase(name)) {
198069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                return header;
199069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            }
200069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
201069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return null;
202069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
203069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
204069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
205069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Gets the last header with the given name.
206069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
207069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <p>Header name comparison is case insensitive.
208069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
209069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param name the name of the header to get
210069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return the last header or <code>null</code>
211069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
212069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public Header getLastHeader(String name) {
213069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        // start at the end of the list and work backwards
214069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        for (int i = headers.size() - 1; i >= 0; i--) {
215069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            Header header = (Header) headers.get(i);
216069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            if (header.getName().equalsIgnoreCase(name)) {
217069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                return header;
218069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            }
219069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
220069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
221069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return null;
222069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
223069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
224069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
225069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Gets all of the headers contained within this group.
226069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
227069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return an array of length >= 0
228069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
229069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public Header[] getAllHeaders() {
230069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return (Header[]) headers.toArray(new Header[headers.size()]);
231069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
232069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
233069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
234069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Tests if headers with the given name are contained within this group.
235069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
236069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * <p>Header name comparison is case insensitive.
237069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
238069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param name the header name to test for
239069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return <code>true</code> if at least one header with the name is
240069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * contained, <code>false</code> otherwise
241069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
242069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public boolean containsHeader(String name) {
243069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        for (int i = 0; i < headers.size(); i++) {
244069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            Header header = (Header) headers.get(i);
245069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            if (header.getName().equalsIgnoreCase(name)) {
246069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project                return true;
247069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project            }
248069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        }
249069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
250069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return false;
251069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
252069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
253069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
254069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Returns an iterator over this group of headers.
255069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
256069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return iterator over this group of headers.
257069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
258069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @since 4.0
259069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
260069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public HeaderIterator iterator() {
261069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return new BasicListHeaderIterator(this.headers, null);
262069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
263069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
264069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
265069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Returns an iterator over the headers with a given name in this group.
266069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
267069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @param name      the name of the headers over which to iterate, or
268069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *                  <code>null</code> for all headers
269069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
270069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return iterator over some headers in this group.
271069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
272069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @since 4.0
273069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
274069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public HeaderIterator iterator(final String name) {
275069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return new BasicListHeaderIterator(this.headers, name);
276069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
277069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
278069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    /**
279069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * Returns a copy of this object
280069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     *
281069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     * @return copy of this object
282069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project     */
283069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public HeaderGroup copy() {
284069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        HeaderGroup clone = new HeaderGroup();
285069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        clone.headers.addAll(this.headers);
286069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return clone;
287069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
288069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
289069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    public Object clone() throws CloneNotSupportedException {
290069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        HeaderGroup clone = (HeaderGroup) super.clone();
291069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        clone.headers = new ArrayList(this.headers);
292069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project        return clone;
293069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project    }
294069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project
295069490a5ca2fd1988d29daf45d892f47ad665115The Android Open Source Project}
296