URLConnection.java revision 78e3320540c8bdcbefba5ae1222ee18f6679ab33
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.util.Collections;
24f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilsonimport java.util.Date;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Hashtable;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.List;
2778e3320540c8bdcbefba5ae1222ee18f6679ab33Elliott Hughesimport java.util.Locale;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Map;
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.StringTokenizer;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
3255bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * A connection to a URL for reading or writing. For HTTP connections, see
3355bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * {@link HttpURLConnection} for documentation of HTTP-specific features.
3455bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *
3555bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * <p>For example, to retrieve {@code
3655bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * ftp://mirror.csclub.uwaterloo.ca/index.html}: <pre>   {@code
3755bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *   URL url = new URL("ftp://mirror.csclub.uwaterloo.ca/index.html");
3855bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *   URLConnection urlConnection = url.openConnection();
3955bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *   InputStream in = new BufferedInputStream(urlConnection.getInputStream());
4055bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *   try {
4155bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *     readStream(in);
4255bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *   } finally {
4355bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *     in.close();
4455bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *   }
4555bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * }</pre>
4655bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *
4755bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * <p>{@code URLConnection} must be configured before it has connected to the
48ac277be6a146ade8f150236edf730431a7e12482Jesse Wilson * remote resource. Instances of {@code URLConnection} are not reusable: you
49ac277be6a146ade8f150236edf730431a7e12482Jesse Wilson * must use a different instance for each connection to a resource.
5055bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *
5155bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * <h3>Timeouts</h3>
5255bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * {@code URLConnection} supports two timeouts: a {@link #setConnectTimeout
5355bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * connect timeout} and a {@link #setReadTimeout read timeout}. By default,
5455bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * operations never time out.
5555bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *
5655bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * <h3>Built-in Protocols</h3>
5755bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * <ul>
5855bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *   <li><strong>File</strong><br>
5955bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *      Resources from the local file system can be loaded using {@code file:}
6055bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *      URIs. File connections can only be used for input.
6155bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *   <li><strong>FTP</strong><br>
6255bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *      File Transfer Protocol (<a href="http://www.ietf.org/rfc/rfc959.txt">RFC
6355bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *      959</a>) is supported, but with no public subclass. FTP connections can
6455bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *      be used for input or output but not both.
6555bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *      <p>By default, FTP connections will be made using {@code anonymous} as
6655bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *      the username and the empty string as the password. Specify alternate
6755bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *      usernames and passwords in the URL: {@code
6855bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *      ftp://username:password@host/path}.
6955bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *   <li><strong>HTTP and HTTPS</strong><br>
7055bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *      Refer to the {@link HttpURLConnection} and {@link
7155bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *      javax.net.ssl.HttpsURLConnection HttpsURLConnection} subclasses.
7255bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *   <li><strong>Jar</strong><br>
7355bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *      Refer to the {@link JarURLConnection} subclass.
7455bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * </ul>
7555bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson *
7655bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * <h3>Registering Additional Protocols</h3>
7755bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * Use {@link URL#setURLStreamHandlerFactory} to register handlers for other
7855bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * protocol types.
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class URLConnection {
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The URL which represents the remote target of this {@code URLConnection}.
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected URL url;
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private String contentType;
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static boolean defaultAllowUserInteraction;
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static boolean defaultUseCaches = true;
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    ContentHandler defaultHandler = new DefaultContentHandler();
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private long lastModified = -1;
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The data must be modified more recently than this time in milliseconds
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * since January 1, 1970, GMT to be transmitted.
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected long ifModifiedSince;
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Specifies whether the using of caches is enabled or the data has to be
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * recent for every request.
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected boolean useCaches = defaultUseCaches;
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Specifies whether this {@code URLConnection} is already connected to the
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * remote resource. If this field is set to {@code true} the flags for
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * setting up the connection are not changeable anymore.
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected boolean connected;
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Specifies whether this {@code URLConnection} allows sending data.
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected boolean doOutput;
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Specifies whether this {@code URLConnection} allows receiving data.
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected boolean doInput = true;
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Specifies whether this {@code URLConnection} allows user interaction as
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * it is needed for authentication purposes.
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected boolean allowUserInteraction = defaultAllowUserInteraction;
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static ContentHandlerFactory contentHandlerFactory;
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int readTimeout = 0;
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private int connectTimeout = 0;
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Cache for storing content handler
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static Hashtable<String, Object> contentHandlers = new Hashtable<String, Object>();
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * A hashtable that maps the filename extension (key) to a MIME-type
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * (element)
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static FileNameMap fileNameMap;
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new {@code URLConnection} instance pointing to the resource
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified by the given URL.
152f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param url
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the URL which represents the resource this {@code
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            URLConnection} will point to.
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected URLConnection(URL url) {
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.url = url;
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
162ac277be6a146ade8f150236edf730431a7e12482Jesse Wilson     * Opens a connection to the resource. This method will <strong>not</strong>
163ac277be6a146ade8f150236edf730431a7e12482Jesse Wilson     * reconnect to a resource after the initial connection has been closed.
164f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while connecting to the resource.
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract void connect() throws IOException;
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1716247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the option value which indicates whether user interaction is allowed
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * on this {@code URLConnection}.
173f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the option {@code allowUserInteraction}.
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #allowUserInteraction
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean getAllowUserInteraction() {
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return allowUserInteraction;
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1826247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns an object representing the content of the resource this {@code
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * URLConnection} is connected to. First, it attempts to get the content
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * type from the method {@code getContentType()} which looks at the response
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * header field "Content-Type". If none is found it will guess the content
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * type from the filename extension. If that fails the stream itself will be
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * used to guess the content type.
188f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the content representing object.
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs obtaining the content.
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object getContent() throws java.io.IOException {
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!connected) {
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            connect();
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ((contentType = getContentType()) == null) {
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if ((contentType = guessContentTypeFromName(url.getFile())) == null) {
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                contentType = guessContentTypeFromStream(getInputStream());
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (contentType != null) {
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return getContentHandler(contentType).getContent(this);
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
2106247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns an object representing the content of the resource this {@code
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * URLConnection} is connected to. First, it attempts to get the content
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * type from the method {@code getContentType()} which looks at the response
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * header field "Content-Type". If none is found it will guess the content
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * type from the filename extension. If that fails the stream itself will be
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * used to guess the content type. The content type must match with one of
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the list {@code types}.
217f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param types
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the list of acceptable content types.
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the content representing object or {@code null} if the content
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         type does not match with one of the specified types.
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs obtaining the content.
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Param is not generic in spec
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object getContent(Class[] types) throws IOException {
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!connected) {
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            connect();
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ((contentType = getContentType()) == null) {
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if ((contentType = guessContentTypeFromName(url.getFile())) == null) {
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                contentType = guessContentTypeFromStream(getInputStream());
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (contentType != null) {
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return getContentHandler(contentType).getContent(this, types);
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
2446247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the content encoding type specified by the response header field
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code content-encoding} or {@code null} if this field is not set.
246f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the response header field {@code content-encoding}.
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getContentEncoding() {
250f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        return getHeaderField("Content-Encoding");
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the specific ContentHandler that will handle the type {@code
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * contentType}.
256f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param type
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            The type that needs to be handled
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return An instance of the Content Handler
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private ContentHandler getContentHandler(String type) throws IOException {
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Replace all non-alphanumeric character by '_'
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final String typeString = parseTypeString(type.replace('/', '.'));
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // if there's a cached content handler, use it
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Object cHandler = contentHandlers.get(type);
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (cHandler != null) {
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return (ContentHandler) cHandler;
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (contentHandlerFactory != null) {
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            cHandler = contentHandlerFactory.createContentHandler(type);
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            contentHandlers.put(type, cHandler);
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return (ContentHandler) cHandler;
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // search through the package list for the right class for the Content
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Type
279ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes        String packageList = System.getProperty("java.content.handler.pkgs");
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (packageList != null) {
281f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            final StringTokenizer st = new StringTokenizer(packageList, "|");
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (st.countTokens() > 0) {
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                try {
284f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                    Class<?> cl = Class.forName(st.nextToken() + "."
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            + typeString, true, ClassLoader
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            .getSystemClassLoader());
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    cHandler = cl.newInstance();
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch (ClassNotFoundException e) {
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch (IllegalAccessException e) {
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch (InstantiationException e) {
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (cHandler == null) {
296ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes            try {
297ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes                // Try looking up AWT image content handlers
298ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes                String className = "org.apache.harmony.awt.www.content." + typeString;
299ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes                cHandler = Class.forName(className).newInstance();
300ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes            } catch (ClassNotFoundException e) {
301ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes            } catch (IllegalAccessException e) {
302ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes            } catch (InstantiationException e) {
303ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes            }
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (cHandler != null) {
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!(cHandler instanceof ContentHandler)) {
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new UnknownServiceException();
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            contentHandlers.put(type, cHandler); // if we got the handler,
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // cache it for next time
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return (ContentHandler) cHandler;
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return defaultHandler;
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
3186247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the content length in bytes specified by the response header field
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code content-length} or {@code -1} if this field is not set.
320f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the response header field {@code content-length}.
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getContentLength() {
324f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        return getHeaderFieldInt("Content-Length", -1);
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
3286247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the MIME-type of the content specified by the response header field
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code content-type} or {@code null} if type is unknown.
330f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the response header field {@code content-type}.
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getContentType() {
334f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        return getHeaderField("Content-Type");
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
3386247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the timestamp when this response has been sent as a date in
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * milliseconds since January 1, 1970 GMT or {@code 0} if this timestamp is
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * unknown.
341f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the sending timestamp of the current response.
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long getDate() {
345f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        return getHeaderFieldDate("Date", 0);
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
3496247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the default setting whether this connection allows user interaction.
350f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the default setting {@code
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         defaultAllowUserInteraction}.
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #allowUserInteraction
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static boolean getDefaultAllowUserInteraction() {
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return defaultAllowUserInteraction;
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
3606247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the default value for the specified request {@code field} or {@code
3616247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * null} if the field could not be found. The base implementation of this
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method returns always {@code null}.
363f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param field
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the request field whose default value shall be returned.
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the default value for the given field.
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @deprecated Use {@link #getRequestProperty}
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Deprecated
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String getDefaultRequestProperty(String field) {
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
3756247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the default setting whether this connection allows using caches.
376f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the default setting {@code defaultUseCaches}.
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #useCaches
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean getDefaultUseCaches() {
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return defaultUseCaches;
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
3856247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the value of the option {@code doInput} which specifies whether this
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * connection allows to receive data.
387f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this connection allows input, {@code false}
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         otherwise.
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #doInput
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean getDoInput() {
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return doInput;
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
3976247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the value of the option {@code doOutput} which specifies whether
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * this connection allows to send data.
399f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this connection allows output, {@code false}
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         otherwise.
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #doOutput
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean getDoOutput() {
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return doOutput;
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
4096247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the timestamp when this response will be expired in milliseconds
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * since January 1, 1970 GMT or {@code 0} if this timestamp is unknown.
411f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the response header field {@code expires}.
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long getExpiration() {
415f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        return getHeaderFieldDate("Expires", 0);
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
4196247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the table which is used by all {@code URLConnection} instances to
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * determine the MIME-type according to a file extension.
421f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the file name map to determine the MIME-type.
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static FileNameMap getFileNameMap() {
42555392539fea537abfb6581b474918f9d611fba27Jesse Wilson        synchronized (URLConnection.class) {
42655392539fea537abfb6581b474918f9d611fba27Jesse Wilson            if (fileNameMap == null) {
4277b3ebefcdf79a251cf2a5619dd2354952fc67665Elliott Hughes                fileNameMap = new DefaultFileNameMap();
42855392539fea537abfb6581b474918f9d611fba27Jesse Wilson            }
42955392539fea537abfb6581b474918f9d611fba27Jesse Wilson            return fileNameMap;
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
4346247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the header value at the field position {@code pos} or {@code null}
4356247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * if the header has fewer than {@code pos} fields. The base
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * implementation of this method returns always {@code null}.
437f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
4386247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * <p>Some implementations (notably {@code HttpURLConnection}) include a mapping
4396247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * for the null key; in HTTP's case, this maps to the HTTP status line and is
4406247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * treated as being at position 0 when indexing into the header fields.
4416247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     *
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param pos
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the field position of the response header.
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the field at position {@code pos}.
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getHeaderField(int pos) {
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
4516247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns an unchangeable map of the response-header fields and values. The
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * response-header field names are the key values of the map. The map values
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * are lists of header field values associated with a particular key name.
454f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
4556247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * <p>Some implementations (notably {@code HttpURLConnection}) include a mapping
4566247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * for the null key; in HTTP's case, this maps to the HTTP status line and is
4576247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * treated as being at position 0 when indexing into the header fields.
4586247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     *
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the response-header representing generic map.
460f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.4
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Map<String, List<String>> getHeaderFields() {
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return Collections.emptyMap();
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
4676247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns an unchangeable map of general request properties used by this
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * connection. The request property names are the key values of the map. The
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * map values are lists of property values of the corresponding key name.
470f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the request-property representing generic map.
472f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.4
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Map<String, List<String>> getRequestProperties() {
475b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        checkNotConnected();
476b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        return Collections.emptyMap();
477b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes    }
478b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes
479b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes    private void checkNotConnected() {
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (connected) {
481b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            throw new IllegalStateException("Already connected");
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Adds the given property to the request header. Existing properties with
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the same name will not be overwritten by this method.
488f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param field
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the request property field name to add.
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newValue
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the value of the property which is to add.
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalStateException
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the connection has been already established.
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the property name is {@code null}.
497f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.4
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void addRequestProperty(String field, String newValue) {
500b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        checkNotConnected();
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (field == null) {
502b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            throw new NullPointerException("field == null");
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
5076247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the value of the header field specified by {@code key} or {@code
5086247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * null} if there is no field with this name. The base implementation of
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * this method returns always {@code null}.
510f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
5116247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * <p>Some implementations (notably {@code HttpURLConnection}) include a mapping
5126247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * for the null key; in HTTP's case, this maps to the HTTP status line and is
5136247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * treated as being at position 0 when indexing into the header fields.
5146247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     *
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the header field.
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the header field.
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getHeaderField(String key) {
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
5246247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the specified header value as a date in milliseconds since January
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 1, 1970 GMT. Returns the {@code defaultValue} if no such header field
526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * could be found.
527f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param field
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the header field name whose value is needed.
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param defaultValue
531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the default value if no field has been found.
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the specified header field as a date in
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         milliseconds.
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
535f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson    @SuppressWarnings("deprecation")
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long getHeaderFieldDate(String field, long defaultValue) {
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String date = getHeaderField(field);
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (date == null) {
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return defaultValue;
540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
541f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        try {
542f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return Date.parse(date);
543f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        } catch (Exception e) {
544f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return defaultValue;
545f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        }
546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
5496247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the specified header value as a number. Returns the {@code
550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * defaultValue} if no such header field could be found or the value could
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * not be parsed as an {@code Integer}.
552f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param field
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the header field name whose value is needed.
555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param defaultValue
556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the default value if no field has been found.
557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the specified header field as a number.
558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getHeaderFieldInt(String field, int defaultValue) {
560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return Integer.parseInt(getHeaderField(field));
562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (NumberFormatException e) {
563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return defaultValue;
564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
5686247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the name of the header field at the given position {@code posn} or
5696247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * {@code null} if there are fewer than {@code posn} fields. The base
570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * implementation of this method returns always {@code null}.
571f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
5726247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * <p>Some implementations (notably {@code HttpURLConnection}) include a mapping
5736247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * for the null key; in HTTP's case, this maps to the HTTP status line and is
5746247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * treated as being at position 0 when indexing into the header fields.
5756247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     *
576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param posn
577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the position of the header field which has to be returned.
578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the header field name at the given position.
579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getHeaderFieldKey(int posn) {
581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
5856247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the point of time since when the data must be modified to be
586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * transmitted. Some protocols transmit data only if it has been modified
587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * more recently than a particular time.
588f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the time in milliseconds since January 1, 1970 GMT.
590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #ifModifiedSince
591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long getIfModifiedSince() {
593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ifModifiedSince;
594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
5976247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns an {@code InputStream} for reading data from the resource pointed by
598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * this {@code URLConnection}. It throws an UnknownServiceException by
599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * default. This method must be overridden by its subclasses.
600f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the InputStream to read data from.
602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if no InputStream could be created.
604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public InputStream getInputStream() throws IOException {
606b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        throw new UnknownServiceException("Does not support writing to the input stream");
607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
6106247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the value of the response header field {@code last-modified} or
611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code 0} if this value is not set.
612f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the {@code last-modified} header field.
614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long getLastModified() {
616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (lastModified != -1) {
617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return lastModified;
618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
619f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        return lastModified = getHeaderFieldDate("Last-Modified", 0);
620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
6236247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns an {@code OutputStream} for writing data to this {@code
624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * URLConnection}. It throws an {@code UnknownServiceException} by default.
625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This method must be overridden by its subclasses.
626f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the OutputStream to write data.
628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if no OutputStream could be created.
630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public OutputStream getOutputStream() throws IOException {
632b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        throw new UnknownServiceException("Does not support writing to the output stream");
633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
6366247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns a {@code Permission} object representing all needed permissions to
637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * open this connection. The returned permission object depends on the state
638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of the connection and will be {@code null} if no permissions are
639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * necessary. By default, this method returns {@code AllPermission}.
640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Subclasses should overwrite this method to return an appropriate
641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * permission object.
642f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the permission object representing the needed permissions to open
644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         this connection.
645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an I/O error occurs while creating the permission object.
647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public java.security.Permission getPermission() throws IOException {
649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new java.security.AllPermission();
650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
6536247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the value of the request header property specified by {code field}
6546247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * or {@code null} if there is no field with this name. The base
655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * implementation of this method returns always {@code null}.
656f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param field
658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the request header property.
659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value of the property.
660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalStateException
661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the connection has been already established.
662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getRequestProperty(String field) {
664b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        checkNotConnected();
665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
6696247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the URL represented by this {@code URLConnection}.
670f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the URL of this connection.
672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public URL getURL() {
674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return url;
675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
6786247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the value of the flag which specifies whether this {@code
679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * URLConnection} allows to use caches.
680f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if using caches is allowed, {@code false} otherwise.
682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean getUseCaches() {
684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return useCaches;
685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines the MIME-type of the given resource {@code url} by resolving
689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the filename extension with the internal FileNameMap. Any fragment
690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * identifier is removed before processing.
691f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param url
693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the URL with the filename to get the MIME type.
694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the guessed content type or {@code null} if the type could not be
695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         determined.
696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String guessContentTypeFromName(String url) {
698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getFileNameMap().getContentTypeFor(url);
699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines the MIME-type of the resource represented by the input stream
703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code is} by reading its first few characters.
704f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param is
706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the resource representing input stream to determine the
707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            content type.
708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the guessed content type or {@code null} if the type could not be
709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         determined.
710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an I/O error occurs while reading from the input stream.
712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
7131c4b8eb0aebfe7f99c10fb1d01716946e8e74ad7Elliott Hughes    public static String guessContentTypeFromStream(InputStream is) throws IOException {
714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!is.markSupported()) {
715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
717f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // Look ahead up to 64 bytes for the longest encoded header
718f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        is.mark(64);
719f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        byte[] bytes = new byte[64];
720f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        int length = is.read(bytes);
721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        is.reset();
722f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
7230b2836e81d354e9bb7df9d43cda5ccfb9c199450Elliott Hughes        // If there is no data from the input stream, we can't determine content type.
7240b2836e81d354e9bb7df9d43cda5ccfb9c199450Elliott Hughes        if (length == -1) {
7250b2836e81d354e9bb7df9d43cda5ccfb9c199450Elliott Hughes            return null;
7260b2836e81d354e9bb7df9d43cda5ccfb9c199450Elliott Hughes        }
7270b2836e81d354e9bb7df9d43cda5ccfb9c199450Elliott Hughes
728f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // Check for Unicode BOM encoding indicators
729e810d3b49631329b11440aa5b7a54db181d42ed1Elliott Hughes        String encoding = "US-ASCII";
730f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        int start = 0;
731f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (length > 1) {
732f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            if ((bytes[0] == (byte) 0xFF) && (bytes[1] == (byte) 0xFE)) {
733f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                encoding = "UTF-16LE";
734f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                start = 2;
735f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                length -= length & 1;
736f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            }
737f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            if ((bytes[0] == (byte) 0xFE) && (bytes[1] == (byte) 0xFF)) {
738f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                encoding = "UTF-16BE";
739f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                start = 2;
740f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                length -= length & 1;
741f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            }
742f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            if (length > 2) {
743f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                if ((bytes[0] == (byte) 0xEF) && (bytes[1] == (byte) 0xBB)
744f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                        && (bytes[2] == (byte) 0xBF)) {
745f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                    encoding = "UTF-8";
746f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                    start = 3;
747f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                }
748f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                if (length > 3) {
749f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                    if ((bytes[0] == (byte) 0x00) && (bytes[1] == (byte) 0x00)
750f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                            && (bytes[2] == (byte) 0xFE)
751f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                            && (bytes[3] == (byte) 0xFF)) {
752f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                        encoding = "UTF-32BE";
753f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                        start = 4;
754f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                        length -= length & 3;
755f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                    }
756f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                    if ((bytes[0] == (byte) 0xFF) && (bytes[1] == (byte) 0xFE)
757f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                            && (bytes[2] == (byte) 0x00)
758f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                            && (bytes[3] == (byte) 0x00)) {
759f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                        encoding = "UTF-32LE";
760f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                        start = 4;
761f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                        length -= length & 3;
762f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                    }
763f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                }
764f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            }
765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
766f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
767f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        String header = new String(bytes, start, length - start, encoding);
768f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
769f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // Check binary types
770f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (header.startsWith("PK")) {
771f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return "application/zip";
772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
773f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (header.startsWith("GI")) {
774f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return "image/gif";
775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
776f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
777f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // Check text types
77878e3320540c8bdcbefba5ae1222ee18f6679ab33Elliott Hughes        String textHeader = header.trim().toUpperCase(Locale.US);
779f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (textHeader.startsWith("<!DOCTYPE HTML") ||
780f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                textHeader.startsWith("<HTML") ||
781f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                textHeader.startsWith("<HEAD") ||
782f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                textHeader.startsWith("<BODY") ||
783f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                textHeader.startsWith("<HEAD")) {
784f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return "text/html";
785f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        }
786f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
787f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        if (textHeader.startsWith("<?XML")) {
788f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            return "application/xml";
789f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        }
790f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
791f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson        // Give up
792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Performs any necessary string parsing on the input string such as
797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * converting non-alphanumeric character into underscore.
798f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param typeString
800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the parsed string
801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the string to be parsed
802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private String parseTypeString(String typeString) {
804a389b4a499f40379b0b204d7ba1c2057663d95c0Jesse Wilson        StringBuilder typeStringBuffer = new StringBuilder(typeString);
805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < typeStringBuffer.length(); i++) {
806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // if non-alphanumeric, replace it with '_'
807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            char c = typeStringBuffer.charAt(i);
808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!(Character.isLetter(c) || Character.isDigit(c) || c == '.')) {
809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                typeStringBuffer.setCharAt(i, '_');
810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return typeStringBuffer.toString();
813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the flag indicating whether this connection allows user interaction
817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * or not. This method can only be called prior to the connection
818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * establishment.
819f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newValue
821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the value of the flag to be set.
822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalStateException
823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this method attempts to change the flag after the
824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             connection has been established.
825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #allowUserInteraction
826adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setAllowUserInteraction(boolean newValue) {
828b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        checkNotConnected();
829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.allowUserInteraction = newValue;
830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the internally used content handler factory. The content factory can
83487548e8585334658c3ee89050ec917a10ca35e5aElliott Hughes     * only be set once during the lifetime of the application.
835f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param contentFactory
837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the content factory to be set.
838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws Error
839ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes     *             if the factory has been already set.
840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
841ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes    public static synchronized void setContentHandlerFactory(ContentHandlerFactory contentFactory) {
842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (contentHandlerFactory != null) {
843b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            throw new Error("Factory already set");
844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        contentHandlerFactory = contentFactory;
846adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the default value for the flag indicating whether this connection
850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * allows user interaction or not. Existing {@code URLConnection}s are
851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * unaffected.
852f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param allows
854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the default value of the flag to be used for new connections.
855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #defaultAllowUserInteraction
856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #allowUserInteraction
857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void setDefaultAllowUserInteraction(boolean allows) {
859adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        defaultAllowUserInteraction = allows;
860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
862adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
863adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the default value of the specified request header field. This value
864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * will be used for the specific field of every newly created connection.
8656247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * The base implementation of this method does nothing.
866f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
867adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param field
868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the request header field to be set.
869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the default value to be used.
871adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @deprecated Use {@link #setRequestProperty} of an existing {@code
872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             URLConnection} instance.
873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Deprecated
875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void setDefaultRequestProperty(String field, String value) {
876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
877adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
879adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the default value for the flag indicating whether this connection
880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * allows to use caches. Existing {@code URLConnection}s are unaffected.
881f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
882adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newValue
883adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the default value of the flag to be used for new connections.
884adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #defaultUseCaches
885adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #useCaches
886adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
887adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setDefaultUseCaches(boolean newValue) {
888adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        defaultUseCaches = newValue;
889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
890adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
892adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the flag indicating whether this {@code URLConnection} allows input.
893adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * It cannot be set after the connection is established.
894f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
895adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newValue
896adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new value for the flag to be set.
897adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalAccessError
898adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this method attempts to change the value after the
899adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             connection has been already established.
900adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #doInput
901adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
902adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setDoInput(boolean newValue) {
903b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        checkNotConnected();
904adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.doInput = newValue;
905adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
907adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the flag indicating whether this {@code URLConnection} allows
909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * output. It cannot be set after the connection is established.
910f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
911adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newValue
912adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new value for the flag to be set.
913adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalAccessError
914adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this method attempts to change the value after the
915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             connection has been already established.
916adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #doOutput
917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setDoOutput(boolean newValue) {
919b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        checkNotConnected();
920adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.doOutput = newValue;
921adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
922adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
923adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
924adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the internal map which is used by all {@code URLConnection}
925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * instances to determine the MIME-type according to a filename extension.
926f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
927adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param map
928adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the MIME table to be set.
929adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
930adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static void setFileNameMap(FileNameMap map) {
93155392539fea537abfb6581b474918f9d611fba27Jesse Wilson        synchronized (URLConnection.class) {
93255392539fea537abfb6581b474918f9d611fba27Jesse Wilson            fileNameMap = map;
93355392539fea537abfb6581b474918f9d611fba27Jesse Wilson        }
934adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
935adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
936adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
937adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the point of time since when the data must be modified to be
938adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * transmitted. Some protocols transmit data only if it has been modified
939adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * more recently than a particular time. The data will be transmitted
940adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * regardless of its timestamp if this option is set to {@code 0}.
941f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
942adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newValue
943adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the time in milliseconds since January 1, 1970 GMT.
944adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalStateException
945adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this {@code URLConnection} has already been connected.
946adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #ifModifiedSince
947adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
948adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setIfModifiedSince(long newValue) {
949b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        checkNotConnected();
950adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.ifModifiedSince = newValue;
951adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
952adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
953adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
954adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the value of the specified request header field. The value will only
955adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * be used by the current {@code URLConnection} instance. This method can
956adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * only be called before the connection is established.
957f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
958adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param field
959adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the request header field to be set.
960adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newValue
961adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the new value of the specified property.
962adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalStateException
963adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the connection has been already established.
964adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
965adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the parameter {@code field} is {@code null}.
966adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
967adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setRequestProperty(String field, String newValue) {
968b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        checkNotConnected();
969adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (field == null) {
970b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            throw new NullPointerException("field == null");
971adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
972adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
973adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
974adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
975adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the flag indicating whether this connection allows to use caches or
976adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * not. This method can only be called prior to the connection
977adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * establishment.
978f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
979adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newValue
980adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the value of the flag to be set.
981adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalStateException
982adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this method attempts to change the flag after the
983adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             connection has been established.
984adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #useCaches
985adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
986adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setUseCaches(boolean newValue) {
987b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        checkNotConnected();
988adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.useCaches = newValue;
989adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
990adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
991adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
992adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the timeout value in milliseconds for establishing the connection to
993adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the resource pointed by this {@code URLConnection} instance. A {@code
994adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * SocketTimeoutException} is thrown if the connection could not be
995adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * established in this time. Default is {@code 0} which stands for an
996adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * infinite timeout.
997f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
998adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param timeout
999adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the connecting timeout in milliseconds.
1000adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
1001adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the parameter {@code timeout} is less than zero.
1002adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1003adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setConnectTimeout(int timeout) {
1004b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        if (timeout < 0) {
1005b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            throw new IllegalArgumentException("timeout < 0");
1006adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1007adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.connectTimeout = timeout;
1008adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1009adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1010adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
10116247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the configured connecting timeout.
1012f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1013adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the connecting timeout value in milliseconds.
1014adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1015adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getConnectTimeout() {
1016adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return connectTimeout;
1017adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1018adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1019adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1020adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the timeout value in milliseconds for reading from the input stream
1021adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * of an established connection to the resource. A {@code
1022adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * SocketTimeoutException} is thrown if the connection could not be
1023adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * established in this time. Default is {@code 0} which stands for an
1024adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * infinite timeout.
1025f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1026adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param timeout
1027adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the reading timeout in milliseconds.
1028adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
1029adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the parameter {@code timeout} is less than zero.
1030adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1031adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setReadTimeout(int timeout) {
1032b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        if (timeout < 0) {
1033b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes            throw new IllegalArgumentException("timeout < 0");
1034adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1035adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.readTimeout = timeout;
1036adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1037adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1038adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
10396247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes     * Returns the configured timeout for reading from the input stream of an
1040adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * established connection to the resource.
1041f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1042adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the reading timeout value in milliseconds.
1043adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1044adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getReadTimeout() {
1045adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return readTimeout;
1046adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1047adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1048adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1049adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the string representation containing the name of this class and
1050adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the URL.
1051f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
1052adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the string representation of this {@code URLConnection} instance.
1053adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1054adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
1055adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
10566247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes        return getClass().getName() + ":" + url.toString();
1057adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1058adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1059adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static class DefaultContentHandler extends java.net.ContentHandler {
1060adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
1061adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public Object getContent(URLConnection u) throws IOException {
1062adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return u.getInputStream();
1063adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1064adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1065adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
1066