/* * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * * Jalview is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation, either version 3 * of the License, or (at your option) any later version. * * Jalview is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Jalview. If not, see . * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.util; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.ProtocolException; import java.net.URL; import javax.ws.rs.HttpMethod; import jalview.bin.Cache; public class HttpUtils { /** * Returns true if it is possible to open an input stream at the given URL, * else false. The input stream is closed. * * @param url * @return */ public static boolean isValidUrl(String url) { InputStream is = null; try { is = HttpUtils.openStream(new URL(url)); if (is != null) { return true; } } catch (IOException x) { // MalformedURLException, FileNotFoundException return false; } finally { if (is != null) { try { is.close(); } catch (IOException e) { // ignore } } } return false; } public static boolean startsWithHttpOrHttps(String file) { return file.startsWith("http://") || file.startsWith("https://"); } /** * wrapper to get/post to a URL or check headers * * @param url * @param ids * @param readTimeout * @return * @throws IOException * @throws ProtocolException */ public static boolean checkUrlAvailable(URL url, int readTimeout) throws IOException, ProtocolException { // jalview.bin.Console.outPrintln(System.currentTimeMillis() + " " + url); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod(HttpMethod.HEAD); connection.setDoInput(true); connection.setUseCaches(false); connection.setConnectTimeout(300); connection.setReadTimeout(readTimeout); // HttpURLConnection doesn't follow redirects from http to https. It should! HttpURLConnection conn = followConnection(connection); return conn.getResponseCode() == 200; } /** * wrapper to follow a URL connection ALLOWING redirects from http to https * * @param URL * url * @return HttpUrlConnection conn */ public static HttpURLConnection openConnection(URL url) throws IOException { if (url == null) { return null; } HttpURLConnection conn = null; if (url != null && url.getProtocol().startsWith("http")) { HttpURLConnection conn0 = (HttpURLConnection) url.openConnection(); if (conn0 != null) { conn = HttpUtils.followConnection(conn0); } else { conn = conn0; } } return conn; } /** * wrapper to follow a URL connection ALLOWING redirects from http to https * * @param HttpURLConnection * conn0 * @return HttpUrlConnection conn */ public static HttpURLConnection followConnection(HttpURLConnection conn0) throws IOException { HttpURLConnection newConn = null; URL url = conn0.getURL(); if (url == null) { return null; } int response = conn0.getResponseCode(); boolean followed = false; if (response >= 300 && response < 400 && conn0.getFollowRedirects()) { // we are only checking for a redirect from http to https if ("http".equals(url.getProtocol())) { URL loc = new URL(conn0.getHeaderField("Location")); if (loc != null && "https".equals(loc.getProtocol())) { newConn = (HttpURLConnection) loc.openConnection(); newConn.setRequestMethod(conn0.getRequestMethod()); newConn.setDoInput(conn0.getDoInput()); newConn.setUseCaches(conn0.getUseCaches()); newConn.setConnectTimeout(conn0.getConnectTimeout()); newConn.setReadTimeout(conn0.getReadTimeout()); newConn.setInstanceFollowRedirects( conn0.getInstanceFollowRedirects()); followed = true; } } } return followed ? newConn : conn0; } /** * wrapper to follow a URL connection ALLOWING redirects from http to https * and return the followed InputStream * * @param URL * url * @return HttpUrlConnection conn */ public static InputStream openStream(URL url) throws IOException { InputStream is = null; if (url != null && url.getProtocol().startsWith("http")) { HttpURLConnection conn = HttpUtils .followConnection((HttpURLConnection) url.openConnection()); if (conn != null) { is = conn.getInputStream(); } } return is; } public static String getUserAgent() { return getUserAgent(null); } public static String getUserAgent(String className) { StringBuilder sb = new StringBuilder(); sb.append("Jalview"); sb.append('/'); sb.append(Cache.getDefault("VERSION", "Unknown")); sb.append(" ("); sb.append(System.getProperty("os.name")); sb.append("; "); sb.append(System.getProperty("os.arch")); sb.append(' '); sb.append(System.getProperty("os.name")); sb.append(' '); sb.append(System.getProperty("os.version")); sb.append("; "); sb.append("java/"); sb.append(System.getProperty("java.version")); sb.append("; "); sb.append("jalview/"); sb.append(ChannelProperties.getProperty("channel")); if (className != null) { sb.append("; "); sb.append(className); } String installation = Cache.applicationProperties .getProperty("INSTALLATION"); if (installation != null) { sb.append("; "); sb.append(installation); } sb.append(')'); sb.append(" help@jalview.org"); return sb.toString(); } }