URLConnection.java revision 2587ef91ba693d73e97704e8163c050b286e7330
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 Project 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 3155bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * A connection to a URL for reading or writing. For HTTP connections, see 3255bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * {@link HttpURLConnection} for documentation of HTTP-specific features. 3355bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * 3455bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * <p>For example, to retrieve {@code 3555bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * ftp://mirror.csclub.uwaterloo.ca/index.html}: <pre> {@code 3655bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * URL url = new URL("ftp://mirror.csclub.uwaterloo.ca/index.html"); 3755bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * URLConnection urlConnection = url.openConnection(); 3855bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * InputStream in = new BufferedInputStream(urlConnection.getInputStream()); 3955bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * try { 4055bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * readStream(in); 4155bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * } finally { 4255bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * in.close(); 4355bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * } 4455bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * }</pre> 4555bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * 4655bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * <p>{@code URLConnection} must be configured before it has connected to the 47ac277be6a146ade8f150236edf730431a7e12482Jesse Wilson * remote resource. Instances of {@code URLConnection} are not reusable: you 48ac277be6a146ade8f150236edf730431a7e12482Jesse Wilson * must use a different instance for each connection to a resource. 4955bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * 5055bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * <h3>Timeouts</h3> 5155bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * {@code URLConnection} supports two timeouts: a {@link #setConnectTimeout 5255bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * connect timeout} and a {@link #setReadTimeout read timeout}. By default, 5355bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * operations never time out. 5455bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * 5555bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * <h3>Built-in Protocols</h3> 5655bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * <ul> 5755bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * <li><strong>File</strong><br> 5855bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * Resources from the local file system can be loaded using {@code file:} 5955bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * URIs. File connections can only be used for input. 6055bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * <li><strong>FTP</strong><br> 61ae394a866dd86df8819b652dfe00b3d2c7ee204cElliott Hughes * File Transfer Protocol (<a href="http://www.ietf.org/rfc/rfc959.txt">RFC 959</a>) 62ae394a866dd86df8819b652dfe00b3d2c7ee204cElliott Hughes * is supported, but with no public subclass. FTP connections can 6355bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * be used for input or output but not both. 6455bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * <p>By default, FTP connections will be made using {@code anonymous} as 6555bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * the username and the empty string as the password. Specify alternate 6655bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * usernames and passwords in the URL: {@code 6755bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * ftp://username:password@host/path}. 6855bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * <li><strong>HTTP and HTTPS</strong><br> 6955bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * Refer to the {@link HttpURLConnection} and {@link 7055bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * javax.net.ssl.HttpsURLConnection HttpsURLConnection} subclasses. 7155bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * <li><strong>Jar</strong><br> 7255bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * Refer to the {@link JarURLConnection} subclass. 7355bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * </ul> 7455bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * 7555bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * <h3>Registering Additional Protocols</h3> 7655bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * Use {@link URL#setURLStreamHandlerFactory} to register handlers for other 7755bbb57dc76ab0231583460f5af4083f4f48f8f5Jesse Wilson * protocol types. 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class URLConnection { 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The URL which represents the remote target of this {@code URLConnection}. 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected URL url; 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private String contentType; 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static boolean defaultAllowUserInteraction; 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static boolean defaultUseCaches = true; 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ContentHandler defaultHandler = new DefaultContentHandler(); 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private long lastModified = -1; 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The data must be modified more recently than this time in milliseconds 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * since January 1, 1970, GMT to be transmitted. 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected long ifModifiedSince; 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Specifies whether the using of caches is enabled or the data has to be 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * recent for every request. 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected boolean useCaches = defaultUseCaches; 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Specifies whether this {@code URLConnection} is already connected to the 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * remote resource. If this field is set to {@code true} the flags for 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * setting up the connection are not changeable anymore. 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected boolean connected; 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Specifies whether this {@code URLConnection} allows sending data. 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected boolean doOutput; 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Specifies whether this {@code URLConnection} allows receiving data. 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected boolean doInput = true; 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1263827b65b1937acfbf3abbc449f8ba0ffc60f3cf3Elliott Hughes * Unused by Android. This field can be accessed via {@link #getAllowUserInteraction} 1273827b65b1937acfbf3abbc449f8ba0ffc60f3cf3Elliott Hughes * and {@link #setAllowUserInteraction}. 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected boolean allowUserInteraction = defaultAllowUserInteraction; 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static ContentHandlerFactory contentHandlerFactory; 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int readTimeout = 0; 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int connectTimeout = 0; 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Cache for storing content handler 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static Hashtable<String, Object> contentHandlers = new Hashtable<String, Object>(); 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A hashtable that maps the filename extension (key) to a MIME-type 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (element) 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static FileNameMap fileNameMap; 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new {@code URLConnection} instance pointing to the resource 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specified by the given URL. 151f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param url 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the URL which represents the resource this {@code 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * URLConnection} will point to. 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected URLConnection(URL url) { 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.url = url; 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 161ac277be6a146ade8f150236edf730431a7e12482Jesse Wilson * Opens a connection to the resource. This method will <strong>not</strong> 162ac277be6a146ade8f150236edf730431a7e12482Jesse Wilson * reconnect to a resource after the initial connection has been closed. 163f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while connecting to the resource. 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void connect() throws IOException; 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1703827b65b1937acfbf3abbc449f8ba0ffc60f3cf3Elliott Hughes * Returns {@code allowUserInteraction}. Unused by Android. 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean getAllowUserInteraction() { 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return allowUserInteraction; 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1776247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * Returns an object representing the content of the resource this {@code 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * URLConnection} is connected to. First, it attempts to get the content 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * type from the method {@code getContentType()} which looks at the response 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * header field "Content-Type". If none is found it will guess the content 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * type from the filename extension. If that fails the stream itself will be 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * used to guess the content type. 183f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the content representing object. 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs obtaining the content. 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Object getContent() throws java.io.IOException { 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!connected) { 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connect(); 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((contentType = getContentType()) == null) { 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((contentType = guessContentTypeFromName(url.getFile())) == null) { 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contentType = guessContentTypeFromStream(getInputStream()); 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (contentType != null) { 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return getContentHandler(contentType).getContent(this); 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2056247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * Returns an object representing the content of the resource this {@code 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * URLConnection} is connected to. First, it attempts to get the content 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * type from the method {@code getContentType()} which looks at the response 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * header field "Content-Type". If none is found it will guess the content 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * type from the filename extension. If that fails the stream itself will be 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * used to guess the content type. The content type must match with one of 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the list {@code types}. 212f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param types 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the list of acceptable content types. 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the content representing object or {@code null} if the content 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * type does not match with one of the specified types. 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs obtaining the content. 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Param is not generic in spec 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked") 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Object getContent(Class[] types) throws IOException { 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!connected) { 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project connect(); 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((contentType = getContentType()) == null) { 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((contentType = guessContentTypeFromName(url.getFile())) == null) { 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contentType = guessContentTypeFromStream(getInputStream()); 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (contentType != null) { 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return getContentHandler(contentType).getContent(this, types); 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2396247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * Returns the content encoding type specified by the response header field 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code content-encoding} or {@code null} if this field is not set. 241f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the value of the response header field {@code content-encoding}. 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getContentEncoding() { 245f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes return getHeaderField("Content-Encoding"); 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the specific ContentHandler that will handle the type {@code 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contentType}. 251f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param type 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The type that needs to be handled 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return An instance of the Content Handler 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private ContentHandler getContentHandler(String type) throws IOException { 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Replace all non-alphanumeric character by '_' 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final String typeString = parseTypeString(type.replace('/', '.')); 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // if there's a cached content handler, use it 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object cHandler = contentHandlers.get(type); 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (cHandler != null) { 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (ContentHandler) cHandler; 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (contentHandlerFactory != null) { 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project cHandler = contentHandlerFactory.createContentHandler(type); 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contentHandlers.put(type, cHandler); 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (ContentHandler) cHandler; 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 272118abc3050371812703e4fabf03f4399d01fb28cElliott Hughes // search through the package list for the right class for the Content Type 273ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes String packageList = System.getProperty("java.content.handler.pkgs"); 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (packageList != null) { 275118abc3050371812703e4fabf03f4399d01fb28cElliott Hughes for (String packageName : packageList.split("\\|")) { 276118abc3050371812703e4fabf03f4399d01fb28cElliott Hughes String className = packageName + "." + typeString; 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 278118abc3050371812703e4fabf03f4399d01fb28cElliott Hughes Class<?> klass = Class.forName(className, true, ClassLoader.getSystemClassLoader()); 279118abc3050371812703e4fabf03f4399d01fb28cElliott Hughes cHandler = klass.newInstance(); 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (ClassNotFoundException e) { 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalAccessException e) { 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (InstantiationException e) { 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (cHandler == null) { 288ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes try { 289ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes // Try looking up AWT image content handlers 290ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes String className = "org.apache.harmony.awt.www.content." + typeString; 291ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes cHandler = Class.forName(className).newInstance(); 292ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes } catch (ClassNotFoundException e) { 293ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes } catch (IllegalAccessException e) { 294ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes } catch (InstantiationException e) { 295ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes } 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (cHandler != null) { 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!(cHandler instanceof ContentHandler)) { 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnknownServiceException(); 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contentHandlers.put(type, cHandler); // if we got the handler, 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // cache it for next time 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (ContentHandler) cHandler; 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return defaultHandler; 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 3106247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * Returns the content length in bytes specified by the response header field 3112587ef91ba693d73e97704e8163c050b286e7330Neil Fuller * {@code content-length} or {@code -1} if this field is not set or cannot be represented as an 3122587ef91ba693d73e97704e8163c050b286e7330Neil Fuller * {@code int}. 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getContentLength() { 315f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes return getHeaderFieldInt("Content-Length", -1); 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 3192587ef91ba693d73e97704e8163c050b286e7330Neil Fuller * Returns the content length in bytes specified by the response header field 3202587ef91ba693d73e97704e8163c050b286e7330Neil Fuller * {@code content-length} or {@code -1} if this field is not set. 3212587ef91ba693d73e97704e8163c050b286e7330Neil Fuller * 3222587ef91ba693d73e97704e8163c050b286e7330Neil Fuller * @since 1.7 3232587ef91ba693d73e97704e8163c050b286e7330Neil Fuller * @hide Until ready for a public API change 3242587ef91ba693d73e97704e8163c050b286e7330Neil Fuller */ 3252587ef91ba693d73e97704e8163c050b286e7330Neil Fuller public long getContentLengthLong() { 3262587ef91ba693d73e97704e8163c050b286e7330Neil Fuller return getHeaderFieldLong("Content-Length", -1); 3272587ef91ba693d73e97704e8163c050b286e7330Neil Fuller } 3282587ef91ba693d73e97704e8163c050b286e7330Neil Fuller 3292587ef91ba693d73e97704e8163c050b286e7330Neil Fuller /** 3306247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * Returns the MIME-type of the content specified by the response header field 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code content-type} or {@code null} if type is unknown. 332f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the value of the response header field {@code content-type}. 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getContentType() { 336f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes return getHeaderField("Content-Type"); 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 3406247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * Returns the timestamp when this response has been sent as a date in 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * milliseconds since January 1, 1970 GMT or {@code 0} if this timestamp is 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * unknown. 343f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the sending timestamp of the current response. 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public long getDate() { 347f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes return getHeaderFieldDate("Date", 0); 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 3513827b65b1937acfbf3abbc449f8ba0ffc60f3cf3Elliott Hughes * Returns the default value of {@code allowUserInteraction}. Unused by Android. 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static boolean getDefaultAllowUserInteraction() { 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return defaultAllowUserInteraction; 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 358d742d7fc7f0593eb8c6e4ac9dd4c0f6a80374e46Jesse Wilson * Returns null. 359f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 36099b4489d0555c6e0e5df941cbfad4cf250c8f0b8Elliott Hughes * @deprecated Use {@link #getRequestProperty} instead. 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Deprecated 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static String getDefaultRequestProperty(String field) { 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 3686247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * Returns the default setting whether this connection allows using caches. 369f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the value of the default setting {@code defaultUseCaches}. 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #useCaches 372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean getDefaultUseCaches() { 374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return defaultUseCaches; 375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 3786247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * Returns the value of the option {@code doInput} which specifies whether this 379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connection allows to receive data. 380f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if this connection allows input, {@code false} 382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * otherwise. 383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #doInput 384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean getDoInput() { 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return doInput; 387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 3906247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * Returns the value of the option {@code doOutput} which specifies whether 391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this connection allows to send data. 392f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if this connection allows output, {@code false} 394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * otherwise. 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #doOutput 396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean getDoOutput() { 398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return doOutput; 399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 4026247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * Returns the timestamp when this response will be expired in milliseconds 403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * since January 1, 1970 GMT or {@code 0} if this timestamp is unknown. 404f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the value of the response header field {@code expires}. 406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public long getExpiration() { 408f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes return getHeaderFieldDate("Expires", 0); 409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 4126247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * Returns the table which is used by all {@code URLConnection} instances to 413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * determine the MIME-type according to a file extension. 414f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the file name map to determine the MIME-type. 416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static FileNameMap getFileNameMap() { 41855392539fea537abfb6581b474918f9d611fba27Jesse Wilson synchronized (URLConnection.class) { 41955392539fea537abfb6581b474918f9d611fba27Jesse Wilson if (fileNameMap == null) { 4207b3ebefcdf79a251cf2a5619dd2354952fc67665Elliott Hughes fileNameMap = new DefaultFileNameMap(); 42155392539fea537abfb6581b474918f9d611fba27Jesse Wilson } 42255392539fea537abfb6581b474918f9d611fba27Jesse Wilson return fileNameMap; 423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 4276247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * Returns the header value at the field position {@code pos} or {@code null} 4286247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * if the header has fewer than {@code pos} fields. The base 429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * implementation of this method returns always {@code null}. 430f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 4316247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * <p>Some implementations (notably {@code HttpURLConnection}) include a mapping 4326247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * for the null key; in HTTP's case, this maps to the HTTP status line and is 4336247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * treated as being at position 0 when indexing into the header fields. 4346247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * 435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param pos 436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the field position of the response header. 437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the value of the field at position {@code pos}. 438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getHeaderField(int pos) { 440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 4440c59055dd24e1659f85d9ff7e2148883f663bd62Jesse Wilson * Returns an unmodifiable map of the response-header fields and values. The 445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * response-header field names are the key values of the map. The map values 446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * are lists of header field values associated with a particular key name. 447f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 4486247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * <p>Some implementations (notably {@code HttpURLConnection}) include a mapping 4496247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * for the null key; in HTTP's case, this maps to the HTTP status line and is 4506247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * treated as being at position 0 when indexing into the header fields. 4516247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * 452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the response-header representing generic map. 453f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @since 1.4 454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Map<String, List<String>> getHeaderFields() { 456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return Collections.emptyMap(); 457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 4600c59055dd24e1659f85d9ff7e2148883f663bd62Jesse Wilson * Returns an unmodifiable map of general request properties used by this 461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connection. The request property names are the key values of the map. The 462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * map values are lists of property values of the corresponding key name. 463f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the request-property representing generic map. 465f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @since 1.4 466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Map<String, List<String>> getRequestProperties() { 468b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes checkNotConnected(); 469b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes return Collections.emptyMap(); 470b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes } 471b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes 472b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes private void checkNotConnected() { 473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (connected) { 474b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new IllegalStateException("Already connected"); 475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Adds the given property to the request header. Existing properties with 480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the same name will not be overwritten by this method. 481f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param field 483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the request property field name to add. 484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param newValue 485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the value of the property which is to add. 486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalStateException 487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the connection has been already established. 488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NullPointerException 489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the property name is {@code null}. 490f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @since 1.4 491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void addRequestProperty(String field, String newValue) { 493b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes checkNotConnected(); 494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (field == null) { 495b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new NullPointerException("field == null"); 496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 5006247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * Returns the value of the header field specified by {@code key} or {@code 5016247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * null} if there is no field with this name. The base implementation of 502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this method returns always {@code null}. 503f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 5046247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * <p>Some implementations (notably {@code HttpURLConnection}) include a mapping 5056247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * for the null key; in HTTP's case, this maps to the HTTP status line and is 5066247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * treated as being at position 0 when indexing into the header fields. 5076247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * 508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param key 509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of the header field. 510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the value of the header field. 511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getHeaderField(String key) { 513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 5176247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * Returns the specified header value as a date in milliseconds since January 518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 1, 1970 GMT. Returns the {@code defaultValue} if no such header field 519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * could be found. 520f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param field 522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the header field name whose value is needed. 523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param defaultValue 524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the default value if no field has been found. 525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the value of the specified header field as a date in 526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * milliseconds. 527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 528f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson @SuppressWarnings("deprecation") 529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public long getHeaderFieldDate(String field, long defaultValue) { 530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String date = getHeaderField(field); 531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (date == null) { 532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return defaultValue; 533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 534f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson try { 535953df613522e12a418cb7cb73248594d6c9f53d4Jesse Wilson return Date.parse(date); // TODO: use HttpDate.parse() 536f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } catch (Exception e) { 537f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson return defaultValue; 538f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 5426247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * Returns the specified header value as a number. Returns the {@code 543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * defaultValue} if no such header field could be found or the value could 5442587ef91ba693d73e97704e8163c050b286e7330Neil Fuller * not be parsed as an {@code int}. 545f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param field 547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the header field name whose value is needed. 548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param defaultValue 549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the default value if no field has been found. 550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the value of the specified header field as a number. 551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getHeaderFieldInt(String field, int defaultValue) { 553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return Integer.parseInt(getHeaderField(field)); 555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (NumberFormatException e) { 556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return defaultValue; 557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 5612587ef91ba693d73e97704e8163c050b286e7330Neil Fuller * Returns the specified header value as a number. Returns the {@code 5622587ef91ba693d73e97704e8163c050b286e7330Neil Fuller * defaultValue} if no such header field could be found or the value could 5632587ef91ba693d73e97704e8163c050b286e7330Neil Fuller * not be parsed as a {@code long}. 5642587ef91ba693d73e97704e8163c050b286e7330Neil Fuller * 5652587ef91ba693d73e97704e8163c050b286e7330Neil Fuller * @param field 5662587ef91ba693d73e97704e8163c050b286e7330Neil Fuller * the header field name whose value is needed. 5672587ef91ba693d73e97704e8163c050b286e7330Neil Fuller * @param defaultValue 5682587ef91ba693d73e97704e8163c050b286e7330Neil Fuller * the default value if no field has been found. 5692587ef91ba693d73e97704e8163c050b286e7330Neil Fuller * @return the value of the specified header field as a number. 5702587ef91ba693d73e97704e8163c050b286e7330Neil Fuller * @since 1.7 5712587ef91ba693d73e97704e8163c050b286e7330Neil Fuller * @hide Until ready for a public API change 5722587ef91ba693d73e97704e8163c050b286e7330Neil Fuller */ 5732587ef91ba693d73e97704e8163c050b286e7330Neil Fuller public long getHeaderFieldLong(String field, long defaultValue) { 5742587ef91ba693d73e97704e8163c050b286e7330Neil Fuller try { 5752587ef91ba693d73e97704e8163c050b286e7330Neil Fuller return Long.parseLong(getHeaderField(field)); 5762587ef91ba693d73e97704e8163c050b286e7330Neil Fuller } catch (NumberFormatException e) { 5772587ef91ba693d73e97704e8163c050b286e7330Neil Fuller return defaultValue; 5782587ef91ba693d73e97704e8163c050b286e7330Neil Fuller } 5792587ef91ba693d73e97704e8163c050b286e7330Neil Fuller } 5802587ef91ba693d73e97704e8163c050b286e7330Neil Fuller 5812587ef91ba693d73e97704e8163c050b286e7330Neil Fuller /** 5826247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * Returns the name of the header field at the given position {@code posn} or 5836247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * {@code null} if there are fewer than {@code posn} fields. The base 584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * implementation of this method returns always {@code null}. 585f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 5866247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * <p>Some implementations (notably {@code HttpURLConnection}) include a mapping 5876247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * for the null key; in HTTP's case, this maps to the HTTP status line and is 5886247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * treated as being at position 0 when indexing into the header fields. 5896247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * 590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param posn 591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the position of the header field which has to be returned. 592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the header field name at the given position. 593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getHeaderFieldKey(int posn) { 595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 5996247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * Returns the point of time since when the data must be modified to be 600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * transmitted. Some protocols transmit data only if it has been modified 601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * more recently than a particular time. 602f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the time in milliseconds since January 1, 1970 GMT. 604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #ifModifiedSince 605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public long getIfModifiedSince() { 607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return ifModifiedSince; 608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 6116247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * Returns an {@code InputStream} for reading data from the resource pointed by 612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this {@code URLConnection}. It throws an UnknownServiceException by 613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * default. This method must be overridden by its subclasses. 614f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the InputStream to read data from. 616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if no InputStream could be created. 618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public InputStream getInputStream() throws IOException { 620b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new UnknownServiceException("Does not support writing to the input stream"); 621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 6246247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * Returns the value of the response header field {@code last-modified} or 625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code 0} if this value is not set. 626f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the value of the {@code last-modified} header field. 628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public long getLastModified() { 630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (lastModified != -1) { 631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return lastModified; 632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 633f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes return lastModified = getHeaderFieldDate("Last-Modified", 0); 634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 6376247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * Returns an {@code OutputStream} for writing data to this {@code 638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * URLConnection}. It throws an {@code UnknownServiceException} by default. 639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This method must be overridden by its subclasses. 640f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the OutputStream to write data. 642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if no OutputStream could be created. 644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public OutputStream getOutputStream() throws IOException { 646b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new UnknownServiceException("Does not support writing to the output stream"); 647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 6506247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * Returns a {@code Permission} object representing all needed permissions to 651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * open this connection. The returned permission object depends on the state 652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of the connection and will be {@code null} if no permissions are 653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * necessary. By default, this method returns {@code AllPermission}. 654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Subclasses should overwrite this method to return an appropriate 655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * permission object. 656f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the permission object representing the needed permissions to open 658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this connection. 659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an I/O error occurs while creating the permission object. 661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public java.security.Permission getPermission() throws IOException { 663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new java.security.AllPermission(); 664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 6676247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * Returns the value of the request header property specified by {code field} 6686247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * or {@code null} if there is no field with this name. The base 669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * implementation of this method returns always {@code null}. 670f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param field 672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of the request header property. 673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the value of the property. 674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalStateException 675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the connection has been already established. 676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String getRequestProperty(String field) { 678b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes checkNotConnected(); 679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 6836247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * Returns the URL represented by this {@code URLConnection}. 684f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the URL of this connection. 686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public URL getURL() { 688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return url; 689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 6926247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes * Returns the value of the flag which specifies whether this {@code 693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * URLConnection} allows to use caches. 694f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if using caches is allowed, {@code false} otherwise. 696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean getUseCaches() { 698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return useCaches; 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 given resource {@code url} by resolving 703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the filename extension with the internal FileNameMap. Any fragment 704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * identifier is removed before processing. 705f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param url 707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the URL with the filename to get the MIME 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 */ 711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static String guessContentTypeFromName(String url) { 712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return getFileNameMap().getContentTypeFor(url); 713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Determines the MIME-type of the resource represented by the input stream 717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code is} by reading its first few characters. 718f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param is 720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the resource representing input stream to determine the 721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * content type. 722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the guessed content type or {@code null} if the type could not be 723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * determined. 724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an I/O error occurs while reading from the input stream. 726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 7271c4b8eb0aebfe7f99c10fb1d01716946e8e74ad7Elliott Hughes public static String guessContentTypeFromStream(InputStream is) throws IOException { 728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!is.markSupported()) { 729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 731f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // Look ahead up to 64 bytes for the longest encoded header 732f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson is.mark(64); 733f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson byte[] bytes = new byte[64]; 734f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson int length = is.read(bytes); 735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project is.reset(); 736f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 7370b2836e81d354e9bb7df9d43cda5ccfb9c199450Elliott Hughes // If there is no data from the input stream, we can't determine content type. 7380b2836e81d354e9bb7df9d43cda5ccfb9c199450Elliott Hughes if (length == -1) { 7390b2836e81d354e9bb7df9d43cda5ccfb9c199450Elliott Hughes return null; 7400b2836e81d354e9bb7df9d43cda5ccfb9c199450Elliott Hughes } 7410b2836e81d354e9bb7df9d43cda5ccfb9c199450Elliott Hughes 742f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // Check for Unicode BOM encoding indicators 743e810d3b49631329b11440aa5b7a54db181d42ed1Elliott Hughes String encoding = "US-ASCII"; 744f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson int start = 0; 745f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if (length > 1) { 746f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if ((bytes[0] == (byte) 0xFF) && (bytes[1] == (byte) 0xFE)) { 747f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson encoding = "UTF-16LE"; 748f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson start = 2; 749f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson length -= length & 1; 750f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 751f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if ((bytes[0] == (byte) 0xFE) && (bytes[1] == (byte) 0xFF)) { 752f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson encoding = "UTF-16BE"; 753f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson start = 2; 754f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson length -= length & 1; 755f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 756f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if (length > 2) { 757f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if ((bytes[0] == (byte) 0xEF) && (bytes[1] == (byte) 0xBB) 758f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson && (bytes[2] == (byte) 0xBF)) { 759f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson encoding = "UTF-8"; 760f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson start = 3; 761f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 762f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if (length > 3) { 763f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if ((bytes[0] == (byte) 0x00) && (bytes[1] == (byte) 0x00) 764f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson && (bytes[2] == (byte) 0xFE) 765f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson && (bytes[3] == (byte) 0xFF)) { 766f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson encoding = "UTF-32BE"; 767f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson start = 4; 768f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson length -= length & 3; 769f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 770f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if ((bytes[0] == (byte) 0xFF) && (bytes[1] == (byte) 0xFE) 771f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson && (bytes[2] == (byte) 0x00) 772f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson && (bytes[3] == (byte) 0x00)) { 773f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson encoding = "UTF-32LE"; 774f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson start = 4; 775f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson length -= length & 3; 776f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 777f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 778f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 780f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 781f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson String header = new String(bytes, start, length - start, encoding); 782f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 783f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // Check binary types 784f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if (header.startsWith("PK")) { 785f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson return "application/zip"; 786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 787f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if (header.startsWith("GI")) { 788f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson return "image/gif"; 789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 790f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 791f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // Check text types 79278e3320540c8bdcbefba5ae1222ee18f6679ab33Elliott Hughes String textHeader = header.trim().toUpperCase(Locale.US); 793f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if (textHeader.startsWith("<!DOCTYPE HTML") || 794f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson textHeader.startsWith("<HTML") || 795f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson textHeader.startsWith("<HEAD") || 796f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson textHeader.startsWith("<BODY") || 797f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson textHeader.startsWith("<HEAD")) { 798f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson return "text/html"; 799f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 800f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 801f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if (textHeader.startsWith("<?XML")) { 802f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson return "application/xml"; 803f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 804f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 805f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // Give up 806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Performs any necessary string parsing on the input string such as 811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * converting non-alphanumeric character into underscore. 812f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param typeString 814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the parsed string 815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the string to be parsed 816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private String parseTypeString(String typeString) { 8188216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes StringBuilder result = new StringBuilder(typeString); 8198216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes for (int i = 0; i < result.length(); i++) { 820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // if non-alphanumeric, replace it with '_' 8218216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes char c = result.charAt(i); 822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!(Character.isLetter(c) || Character.isDigit(c) || c == '.')) { 8238216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes result.setCharAt(i, '_'); 824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 8268216dc1fd9d31867770439985c3d66570330e4c7Elliott Hughes return result.toString(); 827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 8303827b65b1937acfbf3abbc449f8ba0ffc60f3cf3Elliott Hughes * Sets {@code allowUserInteraction}. Unused by Android. 831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setAllowUserInteraction(boolean newValue) { 833b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes checkNotConnected(); 834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.allowUserInteraction = newValue; 835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the internally used content handler factory. The content factory can 83987548e8585334658c3ee89050ec917a10ca35e5aElliott Hughes * only be set once during the lifetime of the application. 840f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param contentFactory 842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the content factory to be set. 843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws Error 844ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes * if the factory has been already set. 845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 846ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes public static synchronized void setContentHandlerFactory(ContentHandlerFactory contentFactory) { 847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (contentHandlerFactory != null) { 848b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new Error("Factory already set"); 849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project contentHandlerFactory = contentFactory; 851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 8543827b65b1937acfbf3abbc449f8ba0ffc60f3cf3Elliott Hughes * Sets the default value for {@code allowUserInteraction}. Unused by Android. 855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static void setDefaultAllowUserInteraction(boolean allows) { 857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project defaultAllowUserInteraction = allows; 858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 859adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 861d742d7fc7f0593eb8c6e4ac9dd4c0f6a80374e46Jesse Wilson * Does nothing. 862f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 86399b4489d0555c6e0e5df941cbfad4cf250c8f0b8Elliott Hughes * @deprecated Use {@link URLConnection#setRequestProperty(String, String)} instead. 864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 865adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Deprecated 866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static void setDefaultRequestProperty(String field, String value) { 867adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the default value for the flag indicating whether this connection 871adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * allows to use caches. Existing {@code URLConnection}s are unaffected. 872f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param newValue 874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the default value of the flag to be used for new connections. 875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #useCaches 876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 877adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setDefaultUseCaches(boolean newValue) { 878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project defaultUseCaches = newValue; 879adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 881adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 882adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the flag indicating whether this {@code URLConnection} allows input. 883adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * It cannot be set after the connection is established. 884f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 885adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param newValue 886adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the new value for the flag to be set. 887adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalAccessError 888adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this method attempts to change the value after the 889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connection has been already established. 890adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #doInput 891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 892adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setDoInput(boolean newValue) { 893b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes checkNotConnected(); 894adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.doInput = newValue; 895adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 896adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 897adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 898adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the flag indicating whether this {@code URLConnection} allows 899adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * output. It cannot be set after the connection is established. 900f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 901adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param newValue 902adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the new value for the flag to be set. 903adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalAccessError 904adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this method attempts to change the value after the 905adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connection has been already established. 906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #doOutput 907adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setDoOutput(boolean newValue) { 909b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes checkNotConnected(); 910adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.doOutput = newValue; 911adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 912adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 913adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 914adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the internal map which is used by all {@code URLConnection} 915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * instances to determine the MIME-type according to a filename extension. 916f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param map 918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the MIME table to be set. 919adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 920adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static void setFileNameMap(FileNameMap map) { 92155392539fea537abfb6581b474918f9d611fba27Jesse Wilson synchronized (URLConnection.class) { 92255392539fea537abfb6581b474918f9d611fba27Jesse Wilson fileNameMap = map; 92355392539fea537abfb6581b474918f9d611fba27Jesse Wilson } 924adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 926adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 927adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the point of time since when the data must be modified to be 928adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * transmitted. Some protocols transmit data only if it has been modified 929adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * more recently than a particular time. The data will be transmitted 930adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * regardless of its timestamp if this option is set to {@code 0}. 931f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 932adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param newValue 933adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the time in milliseconds since January 1, 1970 GMT. 934adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalStateException 935adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this {@code URLConnection} has already been connected. 936adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #ifModifiedSince 937adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 938adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setIfModifiedSince(long newValue) { 939b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes checkNotConnected(); 940adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.ifModifiedSince = newValue; 941adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 942adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 943adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 944adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the value of the specified request header field. The value will only 945adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be used by the current {@code URLConnection} instance. This method can 946adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * only be called before the connection is established. 947f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 948adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param field 949adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the request header field to be set. 950adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param newValue 951adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the new value of the specified property. 952adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalStateException 953adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the connection has been already established. 954adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NullPointerException 955adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the parameter {@code field} is {@code null}. 956adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 957adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setRequestProperty(String field, String newValue) { 958b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes checkNotConnected(); 959adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (field == null) { 960b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new NullPointerException("field == null"); 961adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 962adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 963adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 964adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 965adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the flag indicating whether this connection allows to use caches or 966adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not. This method can only be called prior to the connection 967adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * establishment. 968f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 969adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param newValue 970adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the value of the flag to be set. 971adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalStateException 972adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this method attempts to change the flag after the 973adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connection has been established. 974adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #useCaches 975adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 976adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void setUseCaches(boolean newValue) { 977b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes checkNotConnected(); 978adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.useCaches = newValue; 979adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 980adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 981adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 982699f565e8773f3aab263e7b33f6d089355814f19Elliott Hughes * Sets the maximum time in milliseconds to wait while connecting. 9832d9fa917aae6a6da38e9d1eda05841ffdf8855bbJesse Wilson * Connecting to a server will fail with a {@link SocketTimeoutException} if 9842d9fa917aae6a6da38e9d1eda05841ffdf8855bbJesse Wilson * the timeout elapses before a connection is established. The default value 985699f565e8773f3aab263e7b33f6d089355814f19Elliott Hughes * of {@code 0} causes us to do a blocking connect. This does not mean we 986699f565e8773f3aab263e7b33f6d089355814f19Elliott Hughes * will never time out, but it probably means you'll get a TCP timeout 987699f565e8773f3aab263e7b33f6d089355814f19Elliott Hughes * after several minutes. 988f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 98949bd35072553aaadfabbc3a09761632897169783Jesse Wilson * <p><strong>Warning:</strong> if the hostname resolves to multiple IP 99049bd35072553aaadfabbc3a09761632897169783Jesse Wilson * addresses, this client will try each in <a 99149bd35072553aaadfabbc3a09761632897169783Jesse Wilson * href="http://www.ietf.org/rfc/rfc3484.txt">RFC 3484</a> order. If 99249bd35072553aaadfabbc3a09761632897169783Jesse Wilson * connecting to each of these addresses fails, multiple timeouts will 99349bd35072553aaadfabbc3a09761632897169783Jesse Wilson * elapse before the connect attempt throws an exception. Host names that 99449bd35072553aaadfabbc3a09761632897169783Jesse Wilson * support both IPv6 and IPv4 always have at least 2 IP addresses. 9952d9fa917aae6a6da38e9d1eda05841ffdf8855bbJesse Wilson * 996699f565e8773f3aab263e7b33f6d089355814f19Elliott Hughes * @throws IllegalArgumentException if {@code timeoutMillis < 0}. 997adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 9982d9fa917aae6a6da38e9d1eda05841ffdf8855bbJesse Wilson public void setConnectTimeout(int timeoutMillis) { 9992d9fa917aae6a6da38e9d1eda05841ffdf8855bbJesse Wilson if (timeoutMillis < 0) { 10002d9fa917aae6a6da38e9d1eda05841ffdf8855bbJesse Wilson throw new IllegalArgumentException("timeoutMillis < 0"); 1001adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 10022d9fa917aae6a6da38e9d1eda05841ffdf8855bbJesse Wilson this.connectTimeout = timeoutMillis; 1003adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1004adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1005adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1006699f565e8773f3aab263e7b33f6d089355814f19Elliott Hughes * Returns the connect timeout in milliseconds. (See {#setConnectTimeout}.) 1007adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1008adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getConnectTimeout() { 1009adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return connectTimeout; 1010adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1011adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1012adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 10132d9fa917aae6a6da38e9d1eda05841ffdf8855bbJesse Wilson * Sets the maximum time to wait for an input stream read to complete before 10142d9fa917aae6a6da38e9d1eda05841ffdf8855bbJesse Wilson * giving up. Reading will fail with a {@link SocketTimeoutException} if the 10152d9fa917aae6a6da38e9d1eda05841ffdf8855bbJesse Wilson * timeout elapses before data becomes available. The default value of 10162d9fa917aae6a6da38e9d1eda05841ffdf8855bbJesse Wilson * {@code 0} disables read timeouts; read attempts will block indefinitely. 1017f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 10182d9fa917aae6a6da38e9d1eda05841ffdf8855bbJesse Wilson * @param timeoutMillis the read timeout in milliseconds. Non-negative. 1019adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 10202d9fa917aae6a6da38e9d1eda05841ffdf8855bbJesse Wilson public void setReadTimeout(int timeoutMillis) { 10212d9fa917aae6a6da38e9d1eda05841ffdf8855bbJesse Wilson if (timeoutMillis < 0) { 10222d9fa917aae6a6da38e9d1eda05841ffdf8855bbJesse Wilson throw new IllegalArgumentException("timeoutMillis < 0"); 1023adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 10242d9fa917aae6a6da38e9d1eda05841ffdf8855bbJesse Wilson this.readTimeout = timeoutMillis; 1025adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1026adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1027adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 10282d9fa917aae6a6da38e9d1eda05841ffdf8855bbJesse Wilson * Returns the read timeout in milliseconds, or {@code 0} if reads never 10292d9fa917aae6a6da38e9d1eda05841ffdf8855bbJesse Wilson * timeout. 1030adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1031adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int getReadTimeout() { 1032adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return readTimeout; 1033adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1034adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1035adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1036adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the string representation containing the name of this class and 1037adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the URL. 1038f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1039adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the string representation of this {@code URLConnection} instance. 1040adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1041adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 1042adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String toString() { 10436247987eb505a482a67f5f19678260d9e7240a5fElliott Hughes return getClass().getName() + ":" + url.toString(); 1044adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1045adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1046adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static class DefaultContentHandler extends java.net.ContentHandler { 1047adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 1048adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Object getContent(URLConnection u) throws IOException { 1049adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return u.getInputStream(); 1050adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1051adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1052adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 1053