19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.net.http;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.HeaderElement;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.entity.ContentLengthStrategy;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.message.BasicHeaderValueParser;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.message.ParserCursor;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.protocol.HTTP;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.http.util.CharArrayBuffer;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Manages received headers
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide}
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class Headers {
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String LOGTAG = "Http";
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // header parsing constant
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * indicate HTTP 1.0 connection close after the response
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int CONN_CLOSE = 1;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * indicate HTTP 1.1 connection keep alive
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int CONN_KEEP_ALIVE = 2;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // initial values.
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static int NO_CONN_TYPE = 0;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static long NO_TRANSFER_ENCODING = 0;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static long NO_CONTENT_LENGTH = -1;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // header strings
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String TRANSFER_ENCODING = "transfer-encoding";
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String CONTENT_LEN = "content-length";
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String CONTENT_TYPE = "content-type";
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String CONTENT_ENCODING = "content-encoding";
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String CONN_DIRECTIVE = "connection";
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String LOCATION = "location";
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String PROXY_CONNECTION = "proxy-connection";
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String WWW_AUTHENTICATE = "www-authenticate";
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String PROXY_AUTHENTICATE = "proxy-authenticate";
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String CONTENT_DISPOSITION = "content-disposition";
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String ACCEPT_RANGES = "accept-ranges";
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String EXPIRES = "expires";
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String CACHE_CONTROL = "cache-control";
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String LAST_MODIFIED = "last-modified";
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String ETAG = "etag";
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String SET_COOKIE = "set-cookie";
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String PRAGMA = "pragma";
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String REFRESH = "refresh";
7460708a75120c4469dc2683485301ff9ee3b022e0Leon Clarke    public final static String X_PERMITTED_CROSS_DOMAIN_POLICIES = "x-permitted-cross-domain-policies";
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // following hash are generated by String.hashCode()
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int HASH_TRANSFER_ENCODING = 1274458357;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int HASH_CONTENT_LEN = -1132779846;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int HASH_CONTENT_TYPE = 785670158;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int HASH_CONTENT_ENCODING = 2095084583;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int HASH_CONN_DIRECTIVE = -775651618;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int HASH_LOCATION = 1901043637;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int HASH_PROXY_CONNECTION = 285929373;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int HASH_WWW_AUTHENTICATE = -243037365;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int HASH_PROXY_AUTHENTICATE = -301767724;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int HASH_CONTENT_DISPOSITION = -1267267485;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int HASH_ACCEPT_RANGES = 1397189435;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int HASH_EXPIRES = -1309235404;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int HASH_CACHE_CONTROL = -208775662;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int HASH_LAST_MODIFIED = 150043680;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int HASH_ETAG = 3123477;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int HASH_SET_COOKIE = 1237214767;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int HASH_PRAGMA = -980228804;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int HASH_REFRESH = 1085444827;
9560708a75120c4469dc2683485301ff9ee3b022e0Leon Clarke    private final static int HASH_X_PERMITTED_CROSS_DOMAIN_POLICIES = -1345594014;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // keep any headers that require direct access in a presized
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // string array
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int IDX_TRANSFER_ENCODING = 0;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int IDX_CONTENT_LEN = 1;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int IDX_CONTENT_TYPE = 2;
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int IDX_CONTENT_ENCODING = 3;
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int IDX_CONN_DIRECTIVE = 4;
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int IDX_LOCATION = 5;
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int IDX_PROXY_CONNECTION = 6;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int IDX_WWW_AUTHENTICATE = 7;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int IDX_PROXY_AUTHENTICATE = 8;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int IDX_CONTENT_DISPOSITION = 9;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int IDX_ACCEPT_RANGES = 10;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int IDX_EXPIRES = 11;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int IDX_CACHE_CONTROL = 12;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int IDX_LAST_MODIFIED = 13;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int IDX_ETAG = 14;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int IDX_SET_COOKIE = 15;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int IDX_PRAGMA = 16;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static int IDX_REFRESH = 17;
11760708a75120c4469dc2683485301ff9ee3b022e0Leon Clarke    private final static int IDX_X_PERMITTED_CROSS_DOMAIN_POLICIES = 18;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11960708a75120c4469dc2683485301ff9ee3b022e0Leon Clarke    private final static int HEADER_COUNT = 19;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* parsed values */
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long transferEncoding;
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private long contentLength; // Content length of the incoming data
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int connectionType;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ArrayList<String> cookies = new ArrayList<String>(2);
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String[] mHeaders = new String[HEADER_COUNT];
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String[] sHeaderNames = {
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TRANSFER_ENCODING,
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CONTENT_LEN,
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CONTENT_TYPE,
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CONTENT_ENCODING,
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CONN_DIRECTIVE,
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOCATION,
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROXY_CONNECTION,
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        WWW_AUTHENTICATE,
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PROXY_AUTHENTICATE,
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CONTENT_DISPOSITION,
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ACCEPT_RANGES,
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        EXPIRES,
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        CACHE_CONTROL,
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LAST_MODIFIED,
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ETAG,
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        SET_COOKIE,
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        PRAGMA,
14660708a75120c4469dc2683485301ff9ee3b022e0Leon Clarke        REFRESH,
14760708a75120c4469dc2683485301ff9ee3b022e0Leon Clarke        X_PERMITTED_CROSS_DOMAIN_POLICIES
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Catch-all for headers not explicitly handled
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ArrayList<String> mExtraHeaderNames = new ArrayList<String>(4);
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private ArrayList<String> mExtraHeaderValues = new ArrayList<String>(4);
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Headers() {
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        transferEncoding = NO_TRANSFER_ENCODING;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        contentLength = NO_CONTENT_LENGTH;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        connectionType = NO_CONN_TYPE;
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void parseHeader(CharArrayBuffer buffer) {
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = CharArrayBuffers.setLowercaseIndexOf(buffer, ':');
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pos == -1) {
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String name = buffer.substringTrimmed(0, pos);
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (name.length() == 0) {
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        pos++;
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String val = buffer.substringTrimmed(pos, buffer.length());
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (HttpLog.LOGV) {
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            HttpLog.v("hdr " + buffer.length() + " " + buffer);
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (name.hashCode()) {
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case HASH_TRANSFER_ENCODING:
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (name.equals(TRANSFER_ENCODING)) {
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHeaders[IDX_TRANSFER_ENCODING] = val;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                HeaderElement[] encodings = BasicHeaderValueParser.DEFAULT
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        .parseElements(buffer, new ParserCursor(pos,
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                buffer.length()));
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // The chunked encoding must be the last one applied RFC2616,
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // 14.41
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int len = encodings.length;
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (HTTP.IDENTITY_CODING.equalsIgnoreCase(val)) {
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    transferEncoding = ContentLengthStrategy.IDENTITY;
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if ((len > 0)
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        && (HTTP.CHUNK_CODING
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                .equalsIgnoreCase(encodings[len - 1].getName()))) {
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    transferEncoding = ContentLengthStrategy.CHUNKED;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    transferEncoding = ContentLengthStrategy.IDENTITY;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case HASH_CONTENT_LEN:
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (name.equals(CONTENT_LEN)) {
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHeaders[IDX_CONTENT_LEN] = val;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    contentLength = Long.parseLong(val);
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (NumberFormatException e) {
20343a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato                    if (false) {
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.v(LOGTAG, "Headers.headers(): error parsing"
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + " content length: " + buffer.toString());
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case HASH_CONTENT_TYPE:
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (name.equals(CONTENT_TYPE)) {
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHeaders[IDX_CONTENT_TYPE] = val;
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case HASH_CONTENT_ENCODING:
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (name.equals(CONTENT_ENCODING)) {
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHeaders[IDX_CONTENT_ENCODING] = val;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case HASH_CONN_DIRECTIVE:
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (name.equals(CONN_DIRECTIVE)) {
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHeaders[IDX_CONN_DIRECTIVE] = val;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                setConnectionType(buffer, pos);
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case HASH_LOCATION:
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (name.equals(LOCATION)) {
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHeaders[IDX_LOCATION] = val;
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case HASH_PROXY_CONNECTION:
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (name.equals(PROXY_CONNECTION)) {
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHeaders[IDX_PROXY_CONNECTION] = val;
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                setConnectionType(buffer, pos);
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case HASH_WWW_AUTHENTICATE:
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (name.equals(WWW_AUTHENTICATE)) {
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHeaders[IDX_WWW_AUTHENTICATE] = val;
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case HASH_PROXY_AUTHENTICATE:
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (name.equals(PROXY_AUTHENTICATE)) {
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHeaders[IDX_PROXY_AUTHENTICATE] = val;
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case HASH_CONTENT_DISPOSITION:
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (name.equals(CONTENT_DISPOSITION)) {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHeaders[IDX_CONTENT_DISPOSITION] = val;
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case HASH_ACCEPT_RANGES:
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (name.equals(ACCEPT_RANGES)) {
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHeaders[IDX_ACCEPT_RANGES] = val;
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case HASH_EXPIRES:
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (name.equals(EXPIRES)) {
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHeaders[IDX_EXPIRES] = val;
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case HASH_CACHE_CONTROL:
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (name.equals(CACHE_CONTROL)) {
264c692e8c4da1c5e481ec8564839d47576e643f50cHenrik Baard                // In case where we receive more than one header, create a ',' separated list.
265c692e8c4da1c5e481ec8564839d47576e643f50cHenrik Baard                // This should be ok, according to RFC 2616 chapter 4.2
266c692e8c4da1c5e481ec8564839d47576e643f50cHenrik Baard                if (mHeaders[IDX_CACHE_CONTROL] != null &&
267c692e8c4da1c5e481ec8564839d47576e643f50cHenrik Baard                    mHeaders[IDX_CACHE_CONTROL].length() > 0) {
268c692e8c4da1c5e481ec8564839d47576e643f50cHenrik Baard                    mHeaders[IDX_CACHE_CONTROL] += (',' + val);
269c692e8c4da1c5e481ec8564839d47576e643f50cHenrik Baard                } else {
270c692e8c4da1c5e481ec8564839d47576e643f50cHenrik Baard                    mHeaders[IDX_CACHE_CONTROL] = val;
271c692e8c4da1c5e481ec8564839d47576e643f50cHenrik Baard                }
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case HASH_LAST_MODIFIED:
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (name.equals(LAST_MODIFIED)) {
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHeaders[IDX_LAST_MODIFIED] = val;
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case HASH_ETAG:
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (name.equals(ETAG)) {
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHeaders[IDX_ETAG] = val;
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case HASH_SET_COOKIE:
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (name.equals(SET_COOKIE)) {
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHeaders[IDX_SET_COOKIE] = val;
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                cookies.add(val);
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case HASH_PRAGMA:
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (name.equals(PRAGMA)) {
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHeaders[IDX_PRAGMA] = val;
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case HASH_REFRESH:
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (name.equals(REFRESH)) {
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHeaders[IDX_REFRESH] = val;
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
30060708a75120c4469dc2683485301ff9ee3b022e0Leon Clarke        case HASH_X_PERMITTED_CROSS_DOMAIN_POLICIES:
30160708a75120c4469dc2683485301ff9ee3b022e0Leon Clarke            if (name.equals(X_PERMITTED_CROSS_DOMAIN_POLICIES)) {
30260708a75120c4469dc2683485301ff9ee3b022e0Leon Clarke                mHeaders[IDX_X_PERMITTED_CROSS_DOMAIN_POLICIES] = val;
30360708a75120c4469dc2683485301ff9ee3b022e0Leon Clarke            }
30460708a75120c4469dc2683485301ff9ee3b022e0Leon Clarke            break;
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mExtraHeaderNames.add(name);
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mExtraHeaderValues.add(val);
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getTransferEncoding() {
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return transferEncoding;
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getContentLength() {
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return contentLength;
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getConnectionType() {
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return connectionType;
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getContentType() {
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mHeaders[IDX_CONTENT_TYPE];
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getContentEncoding() {
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mHeaders[IDX_CONTENT_ENCODING];
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getLocation() {
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mHeaders[IDX_LOCATION];
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getWwwAuthenticate() {
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mHeaders[IDX_WWW_AUTHENTICATE];
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getProxyAuthenticate() {
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mHeaders[IDX_PROXY_AUTHENTICATE];
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getContentDisposition() {
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mHeaders[IDX_CONTENT_DISPOSITION];
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getAcceptRanges() {
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mHeaders[IDX_ACCEPT_RANGES];
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getExpires() {
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mHeaders[IDX_EXPIRES];
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getCacheControl() {
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mHeaders[IDX_CACHE_CONTROL];
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getLastModified() {
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mHeaders[IDX_LAST_MODIFIED];
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getEtag() {
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mHeaders[IDX_ETAG];
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ArrayList<String> getSetCookie() {
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return this.cookies;
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getPragma() {
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mHeaders[IDX_PRAGMA];
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getRefresh() {
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mHeaders[IDX_REFRESH];
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
37960708a75120c4469dc2683485301ff9ee3b022e0Leon Clarke    public String getXPermittedCrossDomainPolicies() {
38060708a75120c4469dc2683485301ff9ee3b022e0Leon Clarke        return mHeaders[IDX_X_PERMITTED_CROSS_DOMAIN_POLICIES];
38160708a75120c4469dc2683485301ff9ee3b022e0Leon Clarke    }
38260708a75120c4469dc2683485301ff9ee3b022e0Leon Clarke
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setContentLength(long value) {
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this.contentLength = value;
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setContentType(String value) {
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHeaders[IDX_CONTENT_TYPE] = value;
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setContentEncoding(String value) {
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHeaders[IDX_CONTENT_ENCODING] = value;
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setLocation(String value) {
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHeaders[IDX_LOCATION] = value;
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setWwwAuthenticate(String value) {
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHeaders[IDX_WWW_AUTHENTICATE] = value;
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setProxyAuthenticate(String value) {
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHeaders[IDX_PROXY_AUTHENTICATE] = value;
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setContentDisposition(String value) {
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHeaders[IDX_CONTENT_DISPOSITION] = value;
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setAcceptRanges(String value) {
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHeaders[IDX_ACCEPT_RANGES] = value;
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setExpires(String value) {
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHeaders[IDX_EXPIRES] = value;
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setCacheControl(String value) {
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHeaders[IDX_CACHE_CONTROL] = value;
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setLastModified(String value) {
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHeaders[IDX_LAST_MODIFIED] = value;
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setEtag(String value) {
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mHeaders[IDX_ETAG] = value;
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
43160708a75120c4469dc2683485301ff9ee3b022e0Leon Clarke    public void setXPermittedCrossDomainPolicies(String value) {
43260708a75120c4469dc2683485301ff9ee3b022e0Leon Clarke        mHeaders[IDX_X_PERMITTED_CROSS_DOMAIN_POLICIES] = value;
43360708a75120c4469dc2683485301ff9ee3b022e0Leon Clarke    }
43460708a75120c4469dc2683485301ff9ee3b022e0Leon Clarke
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public interface HeaderCallback {
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void header(String name, String value);
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Reports all non-null headers to the callback
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void getHeaders(HeaderCallback hcb) {
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < HEADER_COUNT; i++) {
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String h = mHeaders[i];
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (h != null) {
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                hcb.header(sHeaderNames[i], h);
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int extraLen = mExtraHeaderNames.size();
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < extraLen; i++) {
45143a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato            if (false) {
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                HttpLog.v("Headers.getHeaders() extra: " + i + " " +
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                          mExtraHeaderNames.get(i) + " " + mExtraHeaderValues.get(i));
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            hcb.header(mExtraHeaderNames.get(i),
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       mExtraHeaderValues.get(i));
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void setConnectionType(CharArrayBuffer buffer, int pos) {
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (CharArrayBuffers.containsIgnoreCaseTrimmed(
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                buffer, pos, HTTP.CONN_CLOSE)) {
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            connectionType = CONN_CLOSE;
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if (CharArrayBuffers.containsIgnoreCaseTrimmed(
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                buffer, pos, HTTP.CONN_KEEP_ALIVE)) {
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            connectionType = CONN_KEEP_ALIVE;
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
471