2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
23 import java.io.IOException;
24 import java.io.InputStream;
25 import java.net.HttpURLConnection;
26 import java.net.ProtocolException;
29 import javax.ws.rs.HttpMethod;
31 import jalview.bin.Cache;
33 public class HttpUtils
37 * Returns true if it is possible to open an input stream at the given URL,
38 * else false. The input stream is closed.
43 public static boolean isValidUrl(String url)
45 InputStream is = null;
48 is = HttpUtils.openStream(new URL(url));
53 } catch (IOException x)
55 // MalformedURLException, FileNotFoundException
64 } catch (IOException e)
73 public static boolean startsWithHttpOrHttps(String file)
75 return file.startsWith("http://") || file.startsWith("https://");
79 * wrapper to get/post to a URL or check headers
86 * @throws ProtocolException
88 public static boolean checkUrlAvailable(URL url, int readTimeout)
89 throws IOException, ProtocolException
91 // jalview.bin.Console.outPrintln(System.currentTimeMillis() + " " + url);
93 HttpURLConnection connection = (HttpURLConnection) url.openConnection();
94 connection.setRequestMethod(HttpMethod.HEAD);
95 connection.setDoInput(true);
96 connection.setUseCaches(false);
97 connection.setConnectTimeout(300);
98 connection.setReadTimeout(readTimeout);
100 // HttpURLConnection doesn't follow redirects from http to https. It should!
101 HttpURLConnection conn = followConnection(connection);
102 return conn.getResponseCode() == 200;
106 * wrapper to follow a URL connection ALLOWING redirects from http to https
110 * @return HttpUrlConnection conn
112 public static HttpURLConnection openConnection(URL url) throws IOException
118 HttpURLConnection conn = null;
119 if (url != null && url.getProtocol().startsWith("http"))
121 HttpURLConnection conn0 = (HttpURLConnection) url.openConnection();
124 conn = HttpUtils.followConnection(conn0);
135 * wrapper to follow a URL connection ALLOWING redirects from http to https
137 * @param HttpURLConnection
139 * @return HttpUrlConnection conn
141 public static HttpURLConnection followConnection(HttpURLConnection conn0)
144 HttpURLConnection newConn = null;
145 URL url = conn0.getURL();
150 int response = conn0.getResponseCode();
151 boolean followed = false;
152 if (response >= 300 && response < 400 && conn0.getFollowRedirects())
154 // we are only checking for a redirect from http to https
155 if ("http".equals(url.getProtocol()))
157 URL loc = new URL(conn0.getHeaderField("Location"));
158 if (loc != null && "https".equals(loc.getProtocol()))
160 newConn = (HttpURLConnection) loc.openConnection();
161 newConn.setRequestMethod(conn0.getRequestMethod());
162 newConn.setDoInput(conn0.getDoInput());
163 newConn.setUseCaches(conn0.getUseCaches());
164 newConn.setConnectTimeout(conn0.getConnectTimeout());
165 newConn.setReadTimeout(conn0.getReadTimeout());
166 newConn.setInstanceFollowRedirects(
167 conn0.getInstanceFollowRedirects());
172 return followed ? newConn : conn0;
176 * wrapper to follow a URL connection ALLOWING redirects from http to https
177 * and return the followed InputStream
181 * @return HttpUrlConnection conn
183 public static InputStream openStream(URL url) throws IOException
185 InputStream is = null;
186 if (url != null && url.getProtocol().startsWith("http"))
188 HttpURLConnection conn = HttpUtils
189 .followConnection((HttpURLConnection) url.openConnection());
192 is = conn.getInputStream();
198 public static String getUserAgent()
200 return getUserAgent(null);
203 public static String getUserAgent(String className)
205 StringBuilder sb = new StringBuilder();
206 sb.append("Jalview");
208 sb.append(Cache.getDefault("VERSION", "Unknown"));
210 sb.append(System.getProperty("os.name"));
212 sb.append(System.getProperty("os.arch"));
214 sb.append(System.getProperty("os.name"));
216 sb.append(System.getProperty("os.version"));
219 sb.append(System.getProperty("java.version"));
221 sb.append("jalview/");
222 sb.append(ChannelProperties.getProperty("channel"));
223 if (className != null)
226 sb.append(className);
228 String installation = Cache.applicationProperties
229 .getProperty("INSTALLATION");
230 if (installation != null)
233 sb.append(installation);
236 sb.append(" help@jalview.org");
237 return sb.toString();