URLConnection.java revision 6247987eb505a482a67f5f19678260d9e7240a5f
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.net;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStream;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.OutputStream;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.AccessController;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.PrivilegedAction;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Collections;
26f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilsonimport java.util.Date;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Hashtable;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.List;
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Map;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.StringTokenizer;
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.internal.net.www.MimeTable;
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.util.Msg;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.util.PriviAction;
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Concrete implementations of the abstract {@code URLConnection} class provide
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a communication link to a URL for exchanging data with a specific protocol
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * type. A {@code URLConnection} can only be set up after the instantiation but
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * before connecting to the remote resource.
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class URLConnection {
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The URL which represents the remote target of this {@code URLConnection}.
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected URL url;
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private String contentType;
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static boolean defaultAllowUserInteraction;
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static boolean defaultUseCaches = true;
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    ContentHandler defaultHandler = new DefaultContentHandler();
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private long lastModified = -1;
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The data must be modified more recently than this time in milliseconds
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * since January 1, 1970, GMT to be transmitted.
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected long ifModifiedSince;
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Specifies whether the using of caches is enabled or the data has to be
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * recent for every request.
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected boolean useCaches = defaultUseCaches;
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Specifies whether this {@code URLConnection} is already connected to the
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * remote resource. If this field is set to {@code true} the flags for
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * setting up the connection are not changeable anymore.
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected boolean connected;
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Specifies whether this {@code URLConnection} allows sending data.
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected boolean doOutput;
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Specifies whether this {@code URLConnection} allows receiving data.
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected boolean doInput = true;
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Specifies whether this {@code URLConnection} allows user interaction as
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * it is needed for authentication purposes.
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected boolean allowUserInteraction = defaultAllowUserInteraction;
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static ContentHandlerFactory contentHandlerFactory;
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int readTimeout = 0;
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int connectTimeout = 0;
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Cache for storing content handler
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static Hashtable<String, Object> contentHandlers = new Hashtable<String, Object>();
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * A hashtable that maps the filename extension (key) to a MIME-type
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * (element)
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static FileNameMap fileNameMap;
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new {@code URLConnection} instance pointing to the resource
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified by the given URL.
114f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param url
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the URL which represents the resource this {@code
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            URLConnection} will point to.
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected URLConnection(URL url) {
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.url = url;
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Establishes the connection to the earlier configured resource. The
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * connection can only be set up before this method has been called.
126f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while connecting to the resource.
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract void connect() throws IOException;
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1336247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the option value which indicates whether user interaction is allowed
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * on this {@code URLConnection}.
135f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the option {@code allowUserInteraction}.
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #allowUserInteraction
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean getAllowUserInteraction() {
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return allowUserInteraction;
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1446247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns an object representing the content of the resource this {@code
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * URLConnection} is connected to. First, it attempts to get the content
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * type from the method {@code getContentType()} which looks at the response
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * header field "Content-Type". If none is found it will guess the content
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * type from the filename extension. If that fails the stream itself will be
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * used to guess the content type.
150f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the content representing object.
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs obtaining the content.
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object getContent() throws java.io.IOException {
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!connected) {
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            connect();
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ((contentType = getContentType()) == null) {
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if ((contentType = guessContentTypeFromName(url.getFile())) == null) {
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                contentType = guessContentTypeFromStream(getInputStream());
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (contentType != null) {
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return getContentHandler(contentType).getContent(this);
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1726247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns an object representing the content of the resource this {@code
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * URLConnection} is connected to. First, it attempts to get the content
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * type from the method {@code getContentType()} which looks at the response
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * header field "Content-Type". If none is found it will guess the content
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * type from the filename extension. If that fails the stream itself will be
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * used to guess the content type. The content type must match with one of
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the list {@code types}.
179f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param types
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the list of acceptable content types.
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the content representing object or {@code null} if the content
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         type does not match with one of the specified types.
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs obtaining the content.
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Param is not generic in spec
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object getContent(Class[] types) throws IOException {
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!connected) {
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            connect();
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ((contentType = getContentType()) == null) {
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if ((contentType = guessContentTypeFromName(url.getFile())) == null) {
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                contentType = guessContentTypeFromStream(getInputStream());
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (contentType != null) {
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return getContentHandler(contentType).getContent(this, types);
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
2066247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the content encoding type specified by the response header field
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code content-encoding} or {@code null} if this field is not set.
208f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the response header field {@code content-encoding}.
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getContentEncoding() {
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getHeaderField("Content-Encoding"); //$NON-NLS-1$
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the specific ContentHandler that will handle the type {@code
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * contentType}.
218f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param type
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            The type that needs to be handled
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return An instance of the Content Handler
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private ContentHandler getContentHandler(String type) throws IOException {
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Replace all non-alphanumeric character by '_'
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final String typeString = parseTypeString(type.replace('/', '.'));
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // if there's a cached content handler, use it
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Object cHandler = contentHandlers.get(type);
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (cHandler != null) {
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return (ContentHandler) cHandler;
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (contentHandlerFactory != null) {
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            cHandler = contentHandlerFactory.createContentHandler(type);
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            contentHandlers.put(type, cHandler);
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return (ContentHandler) cHandler;
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // search through the package list for the right class for the Content
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Type
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String packageList = AccessController
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                .doPrivileged(new PriviAction<String>(
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        "java.content.handler.pkgs")); //$NON-NLS-1$
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (packageList != null) {
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            final StringTokenizer st = new StringTokenizer(packageList, "|"); //$NON-NLS-1$
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (st.countTokens() > 0) {
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                try {
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    Class<?> cl = Class.forName(st.nextToken() + "." //$NON-NLS-1$
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            + typeString, true, ClassLoader
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            .getSystemClassLoader());
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    cHandler = cl.newInstance();
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch (ClassNotFoundException e) {
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch (IllegalAccessException e) {
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch (InstantiationException e) {
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (cHandler == null) {
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            cHandler = AccessController
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    .doPrivileged(new PrivilegedAction<Object>() {
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        public Object run() {
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            try {
264f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                                // Try looking up AWT image content handlers
265f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                                String className = "org.apache.harmony.awt.www.content." //$NON-NLS-1$
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                        + typeString;
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                return Class.forName(className).newInstance();
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            } catch (ClassNotFoundException e) {
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            } catch (IllegalAccessException e) {
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            } catch (InstantiationException e) {
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            }
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            return null;
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        }
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    });
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (cHandler != null) {
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!(cHandler instanceof ContentHandler)) {
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new UnknownServiceException();
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            contentHandlers.put(type, cHandler); // if we got the handler,
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // cache it for next time
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return (ContentHandler) cHandler;
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return defaultHandler;
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
2896247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the content length in bytes specified by the response header field
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code content-length} or {@code -1} if this field is not set.
291f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the response header field {@code content-length}.
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getContentLength() {
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getHeaderFieldInt("Content-Length", -1); //$NON-NLS-1$
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
2996247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the MIME-type of the content specified by the response header field
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code content-type} or {@code null} if type is unknown.
301f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the response header field {@code content-type}.
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getContentType() {
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getHeaderField("Content-Type"); //$NON-NLS-1$
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
3096247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the timestamp when this response has been sent as a date in
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * milliseconds since January 1, 1970 GMT or {@code 0} if this timestamp is
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * unknown.
312f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the sending timestamp of the current response.
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long getDate() {
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getHeaderFieldDate("Date", 0); //$NON-NLS-1$
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
3206247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the default setting whether this connection allows user interaction.
321f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the default setting {@code
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         defaultAllowUserInteraction}.
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #allowUserInteraction
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static boolean getDefaultAllowUserInteraction() {
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return defaultAllowUserInteraction;
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
3316247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the default value for the specified request {@code field} or {@code
3326247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * null} if the field could not be found. The base implementation of this
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method returns always {@code null}.
334f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param field
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the request field whose default value shall be returned.
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the default value for the given field.
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @deprecated Use {@link #getRequestProperty}
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Deprecated
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String getDefaultRequestProperty(String field) {
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
3466247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the default setting whether this connection allows using caches.
347f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the default setting {@code defaultUseCaches}.
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #useCaches
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean getDefaultUseCaches() {
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return defaultUseCaches;
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
3566247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the value of the option {@code doInput} which specifies whether this
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * connection allows to receive data.
358f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this connection allows input, {@code false}
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         otherwise.
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #doInput
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean getDoInput() {
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return doInput;
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
3686247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the value of the option {@code doOutput} which specifies whether
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * this connection allows to send data.
370f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this connection allows output, {@code false}
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         otherwise.
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #doOutput
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean getDoOutput() {
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return doOutput;
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
3806247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the timestamp when this response will be expired in milliseconds
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * since January 1, 1970 GMT or {@code 0} if this timestamp is unknown.
382f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the response header field {@code expires}.
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long getExpiration() {
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getHeaderFieldDate("Expires", 0); //$NON-NLS-1$
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
3906247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the table which is used by all {@code URLConnection} instances to
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * determine the MIME-type according to a file extension.
392f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the file name map to determine the MIME-type.
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static FileNameMap getFileNameMap() {
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Must use lazy initialization or there is a bootstrap problem
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // trying to load the MimeTable resource from a .jar before
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // JarURLConnection has finished initialization.
39955392539fea537abfb6581b474918f9d611fba27Jesse Wilson        synchronized (URLConnection.class) {
40055392539fea537abfb6581b474918f9d611fba27Jesse Wilson            if (fileNameMap == null) {
40155392539fea537abfb6581b474918f9d611fba27Jesse Wilson                fileNameMap = new MimeTable();
40255392539fea537abfb6581b474918f9d611fba27Jesse Wilson            }
40355392539fea537abfb6581b474918f9d611fba27Jesse Wilson            return fileNameMap;
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
4086247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the header value at the field position {@code pos} or {@code null}
4096247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * if the header has fewer than {@code pos} fields. The base
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * implementation of this method returns always {@code null}.
411f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
4126247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * <p>Some implementations (notably {@code HttpURLConnection}) include a mapping
4136247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * for the null key; in HTTP's case, this maps to the HTTP status line and is
4146247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * treated as being at position 0 when indexing into the header fields.
4156247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     *
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param pos
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the field position of the response header.
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the field at position {@code pos}.
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getHeaderField(int pos) {
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
4256247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns an unchangeable map of the response-header fields and values. The
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * response-header field names are the key values of the map. The map values
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * are lists of header field values associated with a particular key name.
428f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
4296247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * <p>Some implementations (notably {@code HttpURLConnection}) include a mapping
4306247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * for the null key; in HTTP's case, this maps to the HTTP status line and is
4316247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * treated as being at position 0 when indexing into the header fields.
4326247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     *
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the response-header representing generic map.
434f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.4
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Map<String, List<String>> getHeaderFields() {
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return Collections.emptyMap();
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
4416247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns an unchangeable map of general request properties used by this
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * connection. The request property names are the key values of the map. The
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * map values are lists of property values of the corresponding key name.
444f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the request-property representing generic map.
446f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.4
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Map<String, List<String>> getRequestProperties() {
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (connected) {
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalStateException(Msg.getString("K0037")); //$NON-NLS-1$
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return Collections.emptyMap();
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Adds the given property to the request header. Existing properties with
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the same name will not be overwritten by this method.
458f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param field
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the request property field name to add.
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newValue
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the value of the property which is to add.
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalStateException
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the connection has been already established.
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the property name is {@code null}.
467f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.4
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void addRequestProperty(String field, String newValue) {
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (connected) {
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalStateException(Msg.getString("K0037")); //$NON-NLS-1$
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (field == null) {
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new NullPointerException(Msg.getString("KA007")); //$NON-NLS-1$
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
4796247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the value of the header field specified by {@code key} or {@code
4806247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * null} if there is no field with this name. The base implementation of
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * this method returns always {@code null}.
482f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
4836247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * <p>Some implementations (notably {@code HttpURLConnection}) include a mapping
4846247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * for the null key; in HTTP's case, this maps to the HTTP status line and is
4856247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * treated as being at position 0 when indexing into the header fields.
4866247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     *
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the header field.
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the header field.
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getHeaderField(String key) {
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
4966247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the specified header value as a date in milliseconds since January
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 1, 1970 GMT. Returns the {@code defaultValue} if no such header field
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * could be found.
499f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param field
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the header field name whose value is needed.
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param defaultValue
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the default value if no field has been found.
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the specified header field as a date in
505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         milliseconds.
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
507f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson    @SuppressWarnings("deprecation")
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long getHeaderFieldDate(String field, long defaultValue) {
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String date = getHeaderField(field);
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (date == null) {
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return defaultValue;
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
513f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        try {
514f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return Date.parse(date);
515f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        } catch (Exception e) {
516f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return defaultValue;
517f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        }
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
5216247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the specified header value as a number. Returns the {@code
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * defaultValue} if no such header field could be found or the value could
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * not be parsed as an {@code Integer}.
524f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param field
526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the header field name whose value is needed.
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param defaultValue
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the default value if no field has been found.
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the specified header field as a number.
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getHeaderFieldInt(String field, int defaultValue) {
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return Integer.parseInt(getHeaderField(field));
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (NumberFormatException e) {
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return defaultValue;
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
5406247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the name of the header field at the given position {@code posn} or
5416247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * {@code null} if there are fewer than {@code posn} fields. The base
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * implementation of this method returns always {@code null}.
543f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
5446247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * <p>Some implementations (notably {@code HttpURLConnection}) include a mapping
5456247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * for the null key; in HTTP's case, this maps to the HTTP status line and is
5466247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * treated as being at position 0 when indexing into the header fields.
5476247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     *
548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param posn
549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the position of the header field which has to be returned.
550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the header field name at the given position.
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getHeaderFieldKey(int posn) {
553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
5576247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the point of time since when the data must be modified to be
558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * transmitted. Some protocols transmit data only if it has been modified
559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * more recently than a particular time.
560f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the time in milliseconds since January 1, 1970 GMT.
562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #ifModifiedSince
563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long getIfModifiedSince() {
565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ifModifiedSince;
566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
5696247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns an {@code InputStream} for reading data from the resource pointed by
570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * this {@code URLConnection}. It throws an UnknownServiceException by
571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * default. This method must be overridden by its subclasses.
572f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the InputStream to read data from.
574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if no InputStream could be created.
576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public InputStream getInputStream() throws IOException {
578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new UnknownServiceException(Msg.getString("K004d")); //$NON-NLS-1$
579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
5826247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the value of the response header field {@code last-modified} or
583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code 0} if this value is not set.
584f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the {@code last-modified} header field.
586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long getLastModified() {
588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (lastModified != -1) {
589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return lastModified;
590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return lastModified = getHeaderFieldDate("Last-Modified", 0); //$NON-NLS-1$
592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
5956247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns an {@code OutputStream} for writing data to this {@code
596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * URLConnection}. It throws an {@code UnknownServiceException} by default.
597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This method must be overridden by its subclasses.
598f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the OutputStream to write data.
600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if no OutputStream could be created.
602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public OutputStream getOutputStream() throws IOException {
604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new UnknownServiceException(Msg.getString("K005f")); //$NON-NLS-1$
605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
6086247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns a {@code Permission} object representing all needed permissions to
609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * open this connection. The returned permission object depends on the state
610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of the connection and will be {@code null} if no permissions are
611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * necessary. By default, this method returns {@code AllPermission}.
612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Subclasses should overwrite this method to return an appropriate
613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * permission object.
614f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the permission object representing the needed permissions to open
616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         this connection.
617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an I/O error occurs while creating the permission object.
619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public java.security.Permission getPermission() throws IOException {
621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new java.security.AllPermission();
622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
6256247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the value of the request header property specified by {code field}
6266247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * or {@code null} if there is no field with this name. The base
627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * implementation of this method returns always {@code null}.
628f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param field
630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the request header property.
631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the property.
632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalStateException
633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the connection has been already established.
634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getRequestProperty(String field) {
636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (connected) {
637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalStateException(Msg.getString("K0037")); //$NON-NLS-1$
638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
6436247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the URL represented by this {@code URLConnection}.
644f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the URL of this connection.
646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public URL getURL() {
648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return url;
649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
6526247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the value of the flag which specifies whether this {@code
653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * URLConnection} allows to use caches.
654f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if using caches is allowed, {@code false} otherwise.
656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean getUseCaches() {
658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return useCaches;
659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines the MIME-type of the given resource {@code url} by resolving
663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the filename extension with the internal FileNameMap. Any fragment
664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * identifier is removed before processing.
665f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param url
667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the URL with the filename to get the MIME type.
668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the guessed content type or {@code null} if the type could not be
669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         determined.
670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String guessContentTypeFromName(String url) {
672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getFileNameMap().getContentTypeFor(url);
673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines the MIME-type of the resource represented by the input stream
677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code is} by reading its first few characters.
678f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param is
680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the resource representing input stream to determine the
681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            content type.
682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the guessed content type or {@code null} if the type could not be
683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         determined.
684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an I/O error occurs while reading from the input stream.
686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
687f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson    @SuppressWarnings("nls")
688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String guessContentTypeFromStream(InputStream is)
689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IOException {
690f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!is.markSupported()) {
692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
694f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // Look ahead up to 64 bytes for the longest encoded header
695f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        is.mark(64);
696f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        byte[] bytes = new byte[64];
697f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        int length = is.read(bytes);
698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        is.reset();
699f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
700f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // Check for Unicode BOM encoding indicators
701f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        String encoding = "ASCII";
702f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        int start = 0;
703f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (length > 1) {
704f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            if ((bytes[0] == (byte) 0xFF) && (bytes[1] == (byte) 0xFE)) {
705f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                encoding = "UTF-16LE";
706f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                start = 2;
707f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                length -= length & 1;
708f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            }
709f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            if ((bytes[0] == (byte) 0xFE) && (bytes[1] == (byte) 0xFF)) {
710f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                encoding = "UTF-16BE";
711f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                start = 2;
712f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                length -= length & 1;
713f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            }
714f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            if (length > 2) {
715f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                if ((bytes[0] == (byte) 0xEF) && (bytes[1] == (byte) 0xBB)
716f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                        && (bytes[2] == (byte) 0xBF)) {
717f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                    encoding = "UTF-8";
718f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                    start = 3;
719f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                }
720f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                if (length > 3) {
721f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                    if ((bytes[0] == (byte) 0x00) && (bytes[1] == (byte) 0x00)
722f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                            && (bytes[2] == (byte) 0xFE)
723f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                            && (bytes[3] == (byte) 0xFF)) {
724f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                        encoding = "UTF-32BE";
725f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                        start = 4;
726f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                        length -= length & 3;
727f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                    }
728f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                    if ((bytes[0] == (byte) 0xFF) && (bytes[1] == (byte) 0xFE)
729f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                            && (bytes[2] == (byte) 0x00)
730f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                            && (bytes[3] == (byte) 0x00)) {
731f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                        encoding = "UTF-32LE";
732f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                        start = 4;
733f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                        length -= length & 3;
734f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                    }
735f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                }
736f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            }
737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
738f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
739f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        String header = new String(bytes, start, length - start, encoding);
740f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
741f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // Check binary types
742f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (header.startsWith("PK")) {
743f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return "application/zip";
744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
745f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (header.startsWith("GI")) {
746f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return "image/gif";
747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
748f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
749f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // Check text types
750f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        String textHeader = header.trim().toUpperCase();
751f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (textHeader.startsWith("<!DOCTYPE HTML") ||
752f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                textHeader.startsWith("<HTML") ||
753f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                textHeader.startsWith("<HEAD") ||
754f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                textHeader.startsWith("<BODY") ||
755f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                textHeader.startsWith("<HEAD")) {
756f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return "text/html";
757f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        }
758f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
759f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (textHeader.startsWith("<?XML")) {
760f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return "application/xml";
761f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        }
762f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
763f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // Give up
764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Performs any necessary string parsing on the input string such as
769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * converting non-alphanumeric character into underscore.
770f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param typeString
772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the parsed string
773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the string to be parsed
774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private String parseTypeString(String typeString) {
776a389b4a499f40379b0b204d7ba1c2057663d95c0Jesse Wilson        StringBuilder typeStringBuffer = new StringBuilder(typeString);
777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < typeStringBuffer.length(); i++) {
778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // if non-alphanumeric, replace it with '_'
779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            char c = typeStringBuffer.charAt(i);
780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!(Character.isLetter(c) || Character.isDigit(c) || c == '.')) {
781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                typeStringBuffer.setCharAt(i, '_');
782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return typeStringBuffer.toString();
785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the flag indicating whether this connection allows user interaction
789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * or not. This method can only be called prior to the connection
790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * establishment.
791f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newValue
793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the value of the flag to be set.
794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalStateException
795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this method attempts to change the flag after the
796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             connection has been established.
797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #allowUserInteraction
798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setAllowUserInteraction(boolean newValue) {
800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (connected) {
801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalStateException(Msg.getString("K0037")); //$NON-NLS-1$
802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.allowUserInteraction = newValue;
804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the internally used content handler factory. The content factory can
808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * only be set if it is allowed by the security manager and only once during
809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the lifetime of the application.
810f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param contentFactory
812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the content factory to be set.
813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws Error
814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the security manager does not allow to set the content
815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             factory or it has been already set earlier ago.
816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static synchronized void setContentHandlerFactory(
818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ContentHandlerFactory contentFactory) {
819adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (contentHandlerFactory != null) {
820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new Error(Msg.getString("K004e")); //$NON-NLS-1$
821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        SecurityManager sManager = System.getSecurityManager();
823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (sManager != null) {
824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sManager.checkSetFactory();
825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
826adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        contentHandlerFactory = contentFactory;
827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the default value for the flag indicating whether this connection
831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * allows user interaction or not. Existing {@code URLConnection}s are
832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * unaffected.
833f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param allows
835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the default value of the flag to be used for new connections.
836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #defaultAllowUserInteraction
837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #allowUserInteraction
838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void setDefaultAllowUserInteraction(boolean allows) {
840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        defaultAllowUserInteraction = allows;
841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the default value of the specified request header field. This value
845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * will be used for the specific field of every newly created connection.
8466247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * The base implementation of this method does nothing.
847f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param field
849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the request header field to be set.
850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the default value to be used.
852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @deprecated Use {@link #setRequestProperty} of an existing {@code
853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             URLConnection} instance.
854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Deprecated
856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void setDefaultRequestProperty(String field, String value) {
857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
859adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the default value for the flag indicating whether this connection
861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * allows to use caches. Existing {@code URLConnection}s are unaffected.
862f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
863adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newValue
864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the default value of the flag to be used for new connections.
865adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #defaultUseCaches
866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #useCaches
867adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setDefaultUseCaches(boolean newValue) {
869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // BEGIN android-removed
870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Setting the default doesn't concern the current connection.
871adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // if (connected) {
872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //     throw new IllegalAccessError(Msg.getString("K0037")); //$NON-NLS-1$
873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // }
874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // END android-removed
875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        defaultUseCaches = newValue;
876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
877adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
879adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the flag indicating whether this {@code URLConnection} allows input.
880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * It cannot be set after the connection is established.
881f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
882adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newValue
883adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new value for the flag to be set.
884adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalAccessError
885adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this method attempts to change the value after the
886adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             connection has been already established.
887adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #doInput
888adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setDoInput(boolean newValue) {
890adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (connected) {
891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalStateException(Msg.getString("K0037")); //$NON-NLS-1$
892adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
893adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.doInput = newValue;
894adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
895adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
896adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
897adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the flag indicating whether this {@code URLConnection} allows
898adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * output. It cannot be set after the connection is established.
899f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
900adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newValue
901adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new value for the flag to be set.
902adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalAccessError
903adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this method attempts to change the value after the
904adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             connection has been already established.
905adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #doOutput
906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
907adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setDoOutput(boolean newValue) {
908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (connected) {
909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalStateException(Msg.getString("K0037")); //$NON-NLS-1$
910adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
911adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.doOutput = newValue;
912adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
913adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
914adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the internal map which is used by all {@code URLConnection}
916adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * instances to determine the MIME-type according to a filename extension.
917f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param map
919adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the MIME table to be set.
920adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
921adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void setFileNameMap(FileNameMap map) {
922adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        SecurityManager manager = System.getSecurityManager();
923adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (manager != null) {
924adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            manager.checkSetFactory();
925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
92655392539fea537abfb6581b474918f9d611fba27Jesse Wilson        synchronized (URLConnection.class) {
92755392539fea537abfb6581b474918f9d611fba27Jesse Wilson            fileNameMap = map;
92855392539fea537abfb6581b474918f9d611fba27Jesse Wilson        }
929adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
930adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
931adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
932adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the point of time since when the data must be modified to be
933adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * transmitted. Some protocols transmit data only if it has been modified
934adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * more recently than a particular time. The data will be transmitted
935adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * regardless of its timestamp if this option is set to {@code 0}.
936f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
937adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newValue
938adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the time in milliseconds since January 1, 1970 GMT.
939adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalStateException
940adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this {@code URLConnection} has already been connected.
941adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #ifModifiedSince
942adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
943adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setIfModifiedSince(long newValue) {
944adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (connected) {
945adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalStateException(Msg.getString("K0037")); //$NON-NLS-1$
946adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
947adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.ifModifiedSince = newValue;
948adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
949adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
950adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
951adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the value of the specified request header field. The value will only
952adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * be used by the current {@code URLConnection} instance. This method can
953adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * only be called before the connection is established.
954f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
955adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param field
956adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the request header field to be set.
957adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newValue
958adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new value of the specified property.
959adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalStateException
960adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the connection has been already established.
961adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
962adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the parameter {@code field} is {@code null}.
963adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
964adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setRequestProperty(String field, String newValue) {
965adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (connected) {
966adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalStateException(Msg.getString("K0037")); //$NON-NLS-1$
967adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
968adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (field == null) {
969adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new NullPointerException(Msg.getString("KA007")); //$NON-NLS-1$
970adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
971adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
972adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
973adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
974adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the flag indicating whether this connection allows to use caches or
975adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * not. This method can only be called prior to the connection
976adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * establishment.
977f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
978adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newValue
979adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the value of the flag to be set.
980adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalStateException
981adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this method attempts to change the flag after the
982adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             connection has been established.
983adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #useCaches
984adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
985adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setUseCaches(boolean newValue) {
986adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (connected) {
987adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalStateException(Msg.getString("K0037")); //$NON-NLS-1$
988adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
989adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.useCaches = newValue;
990adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
991adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
992adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
993adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the timeout value in milliseconds for establishing the connection to
994adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the resource pointed by this {@code URLConnection} instance. A {@code
995adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * SocketTimeoutException} is thrown if the connection could not be
996adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * established in this time. Default is {@code 0} which stands for an
997adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * infinite timeout.
998f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
999adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param timeout
1000adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the connecting timeout in milliseconds.
1001adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
1002adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the parameter {@code timeout} is less than zero.
1003adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1004adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setConnectTimeout(int timeout) {
1005adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (0 > timeout) {
1006adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException(Msg.getString("K0036")); //$NON-NLS-1$
1007adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1008adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.connectTimeout = timeout;
1009adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1010adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1011adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
10126247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the configured connecting timeout.
1013f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1014adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the connecting timeout value in milliseconds.
1015adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1016adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getConnectTimeout() {
1017adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return connectTimeout;
1018adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1019adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1020adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1021adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the timeout value in milliseconds for reading from the input stream
1022adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of an established connection to the resource. A {@code
1023adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * SocketTimeoutException} is thrown if the connection could not be
1024adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * established in this time. Default is {@code 0} which stands for an
1025adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * infinite timeout.
1026f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1027adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param timeout
1028adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the reading timeout in milliseconds.
1029adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
1030adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the parameter {@code timeout} is less than zero.
1031adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1032adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setReadTimeout(int timeout) {
1033adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (0 > timeout) {
1034adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException(Msg.getString("K0036")); //$NON-NLS-1$
1035adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1036adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.readTimeout = timeout;
1037adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1038adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1039adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
10406247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the configured timeout for reading from the input stream of an
1041adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * established connection to the resource.
1042f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1043adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the reading timeout value in milliseconds.
1044adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1045adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getReadTimeout() {
1046adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return readTimeout;
1047adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1048adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1049adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1050adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the string representation containing the name of this class and
1051adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the URL.
1052f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1053adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the string representation of this {@code URLConnection} instance.
1054adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1055adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
1056adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
10576247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes        return getClass().getName() + ":" + url.toString();
1058adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1059adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1060adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static class DefaultContentHandler extends java.net.ContentHandler {
1061adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
1062adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public Object getContent(URLConnection u) throws IOException {
1063adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return u.getInputStream();
1064adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1065adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1066adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
1067