001 002/* 003 * This file is originally coming from the Dasobert library. 004 * Author: Andreas Prlic 005 * 006 * BioJava development code 007 * 008 * This code may be freely distributed and modified under the 009 * terms of the GNU Lesser General Public Licence. This should 010 * be distributed with the code. If you do not have a copy, 011 * see: 012 * 013 * http://www.gnu.org/copyleft/lesser.html 014 * 015 * Copyright for this code is held jointly by the individual 016 * authors. These should be listed in @author doc comments. 017 * 018 * For more information on the BioJava project and its aims, 019 * or to join the biojava-l mailing list, visit the home page 020 * at: 021 * 022 * http://www.biojava.org/ 023 * 024 * Created on Jul 25, 2006 025 * 026 */ 027 028package org.biojava.nbio.structure.align.util; 029 030import java.io.IOException; 031import java.io.InputStream; 032import java.io.OutputStreamWriter; 033import java.net.URL; 034import java.net.URLConnection; 035import java.util.zip.GZIPInputStream; 036 037 038 039/** 040 * A class that takes care about opening URLConnections and sets the proper timeouts 041 * @author Andreas Prlic 042 * @author Anthony Bradley 043 * @since 5.0 044 */ 045public class URLConnectionTools { 046 047 /** The default connection timeout in ms - 15 seconds*/ 048 public static final int DEFAULT_CONNECTION_TIMEOUT = 30000; 049 050 /** 051 * Open HttpURLConnection. Recommended way to open URL connections in Java 1.7 and 1.8. 052 * https://eventuallyconsistent.net/2011/08/02/working-with-urlconnection-and-timeouts/ 053 * @param url URL to open 054 * @param timeout timeout in milli seconds 055 * @throws IOException an error in opening the URL 056 */ 057 public static URLConnection openURLConnection(URL url, int timeout) throws IOException { 058 URLConnection huc = url.openConnection(); 059 huc.setReadTimeout(timeout); 060 huc.setConnectTimeout(timeout); 061 return huc; 062 } 063 064 065 /** 066 * Open HttpURLConnection. Recommended way to open 067 * HttpURLConnections, since this take care of setting timeouts 068 * properly for java 1.4 and 1.5 069 * uses the DEFAULT_CONNECTION_TIMEOUT (= 15 seconds) 070 * @param url a URL to open a http connection to 071 * @return HttpURLConnect the opened connection 072 * @throws IOException an error in opening the URL 073 * 074 */ 075 public static URLConnection openURLConnection(URL url) throws IOException { 076 return openURLConnection(url,DEFAULT_CONNECTION_TIMEOUT); 077 } 078 079 /** 080 * Connect to server and return result as an InputStream. 081 * always asks for response to be in GZIP encoded 082 * <p> 083 * The caller is responsible to close the returned InputStream not to cause 084 * resource leaks. 085 * @param url the URL to connect to 086 * @param timeout the timeout for the connection 087 * @return an {@link InputStream} of response 088 * @throws IOException due to an error opening the URL 089 * 090 */ 091 public static InputStream getInputStream(URL url, int timeout) throws IOException 092 { 093 return getInputStream(url,true, timeout); 094 } 095 096 097 /** 098 * Connect to a URL and return result as an InputStream. 099 * always asks for response to be in GZIP encoded 100 * <p> 101 * The caller is responsible to close the returned InputStream not to cause 102 * resource leaks. 103 * @param url the input URL to be read 104 * @return an {@link InputStream} of response 105 * @throws IOException due to an error opening the URL 106 */ 107 public static InputStream getInputStream(URL url) throws IOException 108 { 109 return getInputStream(url,true, DEFAULT_CONNECTION_TIMEOUT); 110 } 111 112 /** 113 * Open a URL and return an InputStream to it 114 * if acceptGzipEncoding == true, use GZIPEncoding to 115 * compress communication. 116 * <p> 117 * The caller is responsible to close the returned InputStream not to cause 118 * resource leaks. 119 * @param url the input URL to be read 120 * @param acceptGzipEncoding whether to accept Gzip encoding 121 * @param timeout 122 * @return an {@link InputStream} of response 123 * @throws IOException due to an error opening the URL 124 */ 125 public static InputStream getInputStream(URL url, boolean acceptGzipEncoding, int timeout) throws IOException { 126 InputStream inStream = null ; 127 URLConnection huc = URLConnectionTools.openURLConnection(url,timeout); 128 129 if ( acceptGzipEncoding) huc.setRequestProperty("Accept-Encoding", "gzip"); 130 131 String contentEncoding = huc.getContentEncoding(); 132 133 inStream = huc.getInputStream(); 134 135 if (contentEncoding != null) { 136 if (contentEncoding.contains("gzip")) { 137 inStream = new GZIPInputStream(inStream); 138 } 139 } 140 141 return inStream; 142 143 } 144 145 /** 146 * Do a POST to a URL and return the response stream for further processing elsewhere. 147 * <p> 148 * The caller is responsible to close the returned InputStream not to cause 149 * resource leaks. 150 * @param url the input URL to be read 151 * @param data the post data 152 * @return an {@link InputStream} of response 153 * @throws IOException due to an error opening the URL 154 */ 155 public static InputStream doPOST(URL url, String data) throws IOException 156 { 157 return doPOST(url,data,DEFAULT_CONNECTION_TIMEOUT); 158 } 159 160 /** 161 * Do a POST to a URL and return the response stream for further processing elsewhere. 162 * <p> 163 * The caller is responsible to close the returned InputStream not to cause 164 * resource leaks. 165 * @param url the input URL to be read 166 * @param data the post data 167 * @param timeout 168 * @return an {@link InputStream} of response 169 * @throws IOException due to an error opening the URL 170 */ 171 public static InputStream doPOST(URL url, String data, int timeout) throws IOException 172 { 173 URLConnection conn = openURLConnection(url, timeout); 174 conn.setDoOutput(true); 175 OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); 176 wr.write(data); 177 wr.flush(); 178 return conn.getInputStream(); 179 } 180 181 182}