1 /* 2 * The contents of this file are subject to the terms of the Common Development and 3 * Distribution License (the License). You may not use this file except in compliance with the 4 * License. 5 * 6 * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the 7 * specific language governing permission and limitations under the License. 8 * 9 * When distributing Covered Software, include this CDDL Header Notice in each file and include 10 * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL 11 * Header, with the fields enclosed by brackets [] replaced by your own identifying 12 * information: "Portions copyright [year] [name of copyright owner]". 13 * 14 * Copyright 2014-2017 ForgeRock AS. 15 */ 16 17 package org.forgerock.util; 18 19 import java.io.BufferedReader; 20 import java.io.IOException; 21 import java.io.InputStreamReader; 22 import java.net.URL; 23 import java.net.URLConnection; 24 25 /** 26 * Simple helper client for connecting to URLs over HTTP 27 * and retrieving their contents via a GET request. 28 * 29 * Settable timeouts on read and connection. 30 */ 31 public class SimpleHTTPClient { 32 33 /** 34 * Default read timeout on HTTP requests from this client. 35 */ 36 public static final int DEFAULT_READ_TIMEOUT = 5_000; 37 38 /** 39 * Default connection timeout on HTTP requests from this client. 40 */ 41 public static final int DEFAULT_CONNECTION_TIMEOUT = 5_000; 42 43 private final int readTimeout; 44 private final int connTimeout; 45 46 /** 47 * Generates a new SimpleHTTPClient with the appropriate timeouts. 48 */ 49 public SimpleHTTPClient() { 50 this(DEFAULT_READ_TIMEOUT, DEFAULT_CONNECTION_TIMEOUT); 51 } 52 53 /** 54 * Generates a new SimpleHTTPClient with the appropriate timeouts. 55 * 56 * @param readTimeout read timeout value (greater than or equal to zero) 57 * @param connTimeout connection timeout value (greater than or equal to zero) 58 */ 59 public SimpleHTTPClient(final int readTimeout, final int connTimeout) { 60 61 if (readTimeout < 0 || connTimeout < 0) { 62 throw new IllegalArgumentException("Unable to set the read or connection timeouts " 63 + "to a value less than zero"); 64 } 65 66 this.readTimeout = readTimeout; 67 this.connTimeout = connTimeout; 68 } 69 70 /** 71 * Utility method for gathering the contents of an HTTP page. 72 * 73 * Should ideally be in an HTTP Client utils type package, rather than here. 74 * 75 * @param url from which to attempt to retrieve the contents 76 * @return The contents of the provided url 77 * @throws java.io.IOException If there are any problems connecting to or gathering the contents of the page 78 */ 79 public String get(final URL url) throws IOException { 80 final URLConnection conn = url.openConnection(); 81 82 if (readTimeout >= 0) { 83 conn.setReadTimeout(readTimeout); 84 } else { 85 conn.setReadTimeout(DEFAULT_READ_TIMEOUT); 86 } 87 88 if (connTimeout >= 0) { 89 conn.setConnectTimeout(connTimeout); 90 } else { 91 conn.setConnectTimeout(DEFAULT_CONNECTION_TIMEOUT); 92 } 93 94 final StringBuilder sb = new StringBuilder(); 95 96 try (final BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()))) { 97 String input; 98 while ((input = reader.readLine()) != null) { 99 sb.append(input); 100 } 101 } 102 103 return sb.toString(); 104 } 105 106 }