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