diff --git a/src/main/java/it/geosolutions/geoserver/rest/HTTPUtils.java b/src/main/java/it/geosolutions/geoserver/rest/HTTPUtils.java index dd7d527..db91b89 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/HTTPUtils.java +++ b/src/main/java/it/geosolutions/geoserver/rest/HTTPUtils.java @@ -36,6 +36,7 @@ import java.net.URL; import org.apache.commons.httpclient.Credentials; import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpConnectionManager; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.UsernamePasswordCredentials; import org.apache.commons.httpclient.auth.AuthScope; @@ -59,68 +60,74 @@ public class HTTPUtils { /** * Performs an HTTP GET on the given URL. - * - * @param url The URL where to connect to. - * @return The HTTP response as a String if the HTTP response code was 200 (OK). + * + * @param url The URL where to connect to. + * @return The HTTP response as a String if the HTTP response code was 200 + * (OK). * @throws MalformedURLException */ - public static String get(String url) throws MalformedURLException { + public static String get(String url) throws MalformedURLException { return get(url, null, null); } /** - * Performs an HTTP GET on the given URL. - *
Basic auth is used if both username and pw are not null. - * - * @param url The URL where to connect to. - * @param username Basic auth credential. No basic auth if null. - * @param pw Basic auth credential. No basic auth if null. - * @return The HTTP response as a String if the HTTP response code was 200 (OK). + * Performs an HTTP GET on the given URL.
+ * Basic auth is used if both username and pw are not null. + * + * @param url The URL where to connect to. + * @param username Basic auth credential. No basic auth if null. + * @param pw Basic auth credential. No basic auth if null. + * @return The HTTP response as a String if the HTTP response code was 200 + * (OK). * @throws MalformedURLException */ - public static String get(String url, String username, String pw) throws MalformedURLException { + public static String get(String url, String username, String pw) throws MalformedURLException { GetMethod httpMethod = null; - try { - HttpClient client = new HttpClient(); + HttpClient client = new HttpClient(); + HttpConnectionManager connectionManager = client.getHttpConnectionManager(); + try { setAuth(client, url, username, pw); - httpMethod = new GetMethod(url); - client.getHttpConnectionManager().getParams().setConnectionTimeout(5000); - int status = client.executeMethod(httpMethod); - if(status == HttpStatus.SC_OK) { + httpMethod = new GetMethod(url); + connectionManager.getParams().setConnectionTimeout(5000); + int status = client.executeMethod(httpMethod); + if (status == HttpStatus.SC_OK) { InputStream is = httpMethod.getResponseBodyAsStream(); - String response = IOUtils.toString(is); - if(response.trim().length()==0) { // sometime gs rest fails - LOGGER.warn("ResponseBody is empty"); - return null; - } else { + String response = IOUtils.toString(is); + IOUtils.closeQuietly(is); + if (response.trim().length() == 0) { // sometime gs rest fails + LOGGER.warn("ResponseBody is empty"); + return null; + } else { return response; } - } else { - LOGGER.info("("+status+") " + HttpStatus.getStatusText(status) + " -- " + url ); - } - } catch (ConnectException e) { - LOGGER.info("Couldn't connect to ["+url+"]"); - } catch (IOException e) { - LOGGER.info("Error talking to ["+url+"]", e); - } finally { - if(httpMethod != null) + } else { + LOGGER.info("(" + status + ") " + HttpStatus.getStatusText(status) + " -- " + url); + } + } catch (ConnectException e) { + LOGGER.info("Couldn't connect to [" + url + "]"); + } catch (IOException e) { + LOGGER.info("Error talking to [" + url + "]", e); + } finally { + if (httpMethod != null) httpMethod.releaseConnection(); + connectionManager.closeIdleConnections(0); } - return null; - } + return null; + } /** - * PUTs a File to the given URL. - *
Basic auth is used if both username and pw are not null. - * - * @param url The URL where to connect to. - * @param file The File to be sent. + * PUTs a File to the given URL.
+ * Basic auth is used if both username and pw are not null. + * + * @param url The URL where to connect to. + * @param file The File to be sent. * @param contentType The content-type to advert in the PUT. - * @param username Basic auth credential. No basic auth if null. - * @param pw Basic auth credential. No basic auth if null. - * @return The HTTP response as a String if the HTTP response code was 200 (OK). + * @param username Basic auth credential. No basic auth if null. + * @param pw Basic auth credential. No basic auth if null. + * @return The HTTP response as a String if the HTTP response code was 200 + * (OK). * @throws MalformedURLException * @return the HTTP response or null on errors. */ @@ -129,15 +136,16 @@ public class HTTPUtils { } /** - * PUTs a String to the given URL. - *
Basic auth is used if both username and pw are not null. - * - * @param url The URL where to connect to. - * @param content The content to be sent as a String. + * PUTs a String to the given URL.
+ * Basic auth is used if both username and pw are not null. + * + * @param url The URL where to connect to. + * @param content The content to be sent as a String. * @param contentType The content-type to advert in the PUT. - * @param username Basic auth credential. No basic auth if null. - * @param pw Basic auth credential. No basic auth if null. - * @return The HTTP response as a String if the HTTP response code was 200 (OK). + * @param username Basic auth credential. No basic auth if null. + * @param pw Basic auth credential. No basic auth if null. + * @return The HTTP response as a String if the HTTP response code was 200 + * (OK). * @throws MalformedURLException * @return the HTTP response or null on errors. */ @@ -151,14 +159,15 @@ public class HTTPUtils { } /** - * PUTs a String representing an XML document to the given URL. - *
Basic auth is used if both username and pw are not null. - * - * @param url The URL where to connect to. - * @param content The XML content to be sent as a String. - * @param username Basic auth credential. No basic auth if null. - * @param pw Basic auth credential. No basic auth if null. - * @return The HTTP response as a String if the HTTP response code was 200 (OK). + * PUTs a String representing an XML document to the given URL.
+ * Basic auth is used if both username and pw are not null. + * + * @param url The URL where to connect to. + * @param content The XML content to be sent as a String. + * @param username Basic auth credential. No basic auth if null. + * @param pw Basic auth credential. No basic auth if null. + * @return The HTTP response as a String if the HTTP response code was 200 + * (OK). * @throws MalformedURLException * @return the HTTP response or null on errors. */ @@ -167,14 +176,15 @@ public class HTTPUtils { } /** - * Performs a PUT to the given URL. - *
Basic auth is used if both username and pw are not null. - * - * @param url The URL where to connect to. + * Performs a PUT to the given URL.
+ * Basic auth is used if both username and pw are not null. + * + * @param url The URL where to connect to. * @param requestEntity The request to be sent. - * @param username Basic auth credential. No basic auth if null. - * @param pw Basic auth credential. No basic auth if null. - * @return The HTTP response as a String if the HTTP response code was 200 (OK). + * @param username Basic auth credential. No basic auth if null. + * @param pw Basic auth credential. No basic auth if null. + * @return The HTTP response as a String if the HTTP response code was 200 + * (OK). * @throws MalformedURLException * @return the HTTP response or null on errors. */ @@ -183,15 +193,16 @@ public class HTTPUtils { } /** - * POSTs a File to the given URL. - *
Basic auth is used if both username and pw are not null. - * - * @param url The URL where to connect to. - * @param file The File to be sent. + * POSTs a File to the given URL.
+ * Basic auth is used if both username and pw are not null. + * + * @param url The URL where to connect to. + * @param file The File to be sent. * @param contentType The content-type to advert in the POST. - * @param username Basic auth credential. No basic auth if null. - * @param pw Basic auth credential. No basic auth if null. - * @return The HTTP response as a String if the HTTP response code was 200 (OK). + * @param username Basic auth credential. No basic auth if null. + * @param pw Basic auth credential. No basic auth if null. + * @return The HTTP response as a String if the HTTP response code was 200 + * (OK). * @throws MalformedURLException * @return the HTTP response or null on errors. */ @@ -200,15 +211,16 @@ public class HTTPUtils { } /** - * POSTs a String to the given URL. - *
Basic auth is used if both username and pw are not null. - * - * @param url The URL where to connect to. - * @param content The content to be sent as a String. + * POSTs a String to the given URL.
+ * Basic auth is used if both username and pw are not null. + * + * @param url The URL where to connect to. + * @param content The content to be sent as a String. * @param contentType The content-type to advert in the POST. - * @param username Basic auth credential. No basic auth if null. - * @param pw Basic auth credential. No basic auth if null. - * @return The HTTP response as a String if the HTTP response code was 200 (OK). + * @param username Basic auth credential. No basic auth if null. + * @param pw Basic auth credential. No basic auth if null. + * @return The HTTP response as a String if the HTTP response code was 200 + * (OK). * @throws MalformedURLException * @return the HTTP response or null on errors. */ @@ -222,14 +234,15 @@ public class HTTPUtils { } /** - * POSTs a String representing an XML document to the given URL. - *
Basic auth is used if both username and pw are not null. - * - * @param url The URL where to connect to. - * @param content The XML content to be sent as a String. - * @param username Basic auth credential. No basic auth if null. - * @param pw Basic auth credential. No basic auth if null. - * @return The HTTP response as a String if the HTTP response code was 200 (OK). + * POSTs a String representing an XML document to the given URL.
+ * Basic auth is used if both username and pw are not null. + * + * @param url The URL where to connect to. + * @param content The XML content to be sent as a String. + * @param username Basic auth credential. No basic auth if null. + * @param pw Basic auth credential. No basic auth if null. + * @return The HTTP response as a String if the HTTP response code was 200 + * (OK). * @throws MalformedURLException * @return the HTTP response or null on errors. */ @@ -238,14 +251,15 @@ public class HTTPUtils { } /** - * Performs a POST to the given URL. - *
Basic auth is used if both username and pw are not null. - * - * @param url The URL where to connect to. + * Performs a POST to the given URL.
+ * Basic auth is used if both username and pw are not null. + * + * @param url The URL where to connect to. * @param requestEntity The request to be sent. - * @param username Basic auth credential. No basic auth if null. - * @param pw Basic auth credential. No basic auth if null. - * @return The HTTP response as a String if the HTTP response code was 200 (OK). + * @param username Basic auth credential. No basic auth if null. + * @param pw Basic auth credential. No basic auth if null. + * @return The HTTP response as a String if the HTTP response code was 200 + * (OK). * @throws MalformedURLException * @return the HTTP response or null on errors. */ @@ -254,181 +268,192 @@ public class HTTPUtils { } /** - * Send an HTTP request (PUT or POST) to a server. - *
Basic auth is used if both username and pw are not null. + * Send an HTTP request (PUT or POST) to a server.
+ * Basic auth is used if both username and pw are not null. *

- * Only

are accepted as successful codes; in these cases the response string will be returned. - * + * Only + * + * are accepted as successful codes; in these cases the response string will + * be returned. + * * @return the HTTP response or null on errors. */ - private static String send(final EntityEnclosingMethod httpMethod, String url, RequestEntity requestEntity, String username, String pw) { - + private static String send(final EntityEnclosingMethod httpMethod, String url, + RequestEntity requestEntity, String username, String pw) { + HttpClient client = new HttpClient(); + HttpConnectionManager connectionManager = client.getHttpConnectionManager(); try { - HttpClient client = new HttpClient(); setAuth(client, url, username, pw); -// httpMethod = new PutMethod(url); - client.getHttpConnectionManager().getParams().setConnectionTimeout(5000); - if(requestEntity != null) + connectionManager.getParams().setConnectionTimeout(5000); + if (requestEntity != null) httpMethod.setRequestEntity(requestEntity); - int status = client.executeMethod(httpMethod); + int status = client.executeMethod(httpMethod); - switch(status) { - case HttpURLConnection.HTTP_OK: - case HttpURLConnection.HTTP_CREATED: - case HttpURLConnection.HTTP_ACCEPTED: - String response = IOUtils.toString(httpMethod.getResponseBodyAsStream()); -// LOGGER.info("================= POST " + url); - LOGGER.info("HTTP "+ httpMethod.getStatusText()+": " + response); - return response; - default: - LOGGER.warn("Bad response: code["+status+"]" + - " msg["+httpMethod.getStatusText()+"]" + - " url["+url+"]" + - " method["+httpMethod.getClass().getSimpleName()+"]: " + - IOUtils.toString(httpMethod.getResponseBodyAsStream()) - ); - return null; - } - } catch (ConnectException e) { - LOGGER.info("Couldn't connect to ["+url+"]"); - return null; + switch (status) { + case HttpURLConnection.HTTP_OK: + case HttpURLConnection.HTTP_CREATED: + case HttpURLConnection.HTTP_ACCEPTED: + String response = IOUtils.toString(httpMethod.getResponseBodyAsStream()); + // LOGGER.info("================= POST " + url); + if (LOGGER.isInfoEnabled()) + LOGGER.info("HTTP " + httpMethod.getStatusText() + ": " + response); + return response; + default: + LOGGER.warn("Bad response: code[" + status + "]" + " msg[" + httpMethod.getStatusText() + "]" + + " url[" + url + "]" + " method[" + httpMethod.getClass().getSimpleName() + + "]: " + IOUtils.toString(httpMethod.getResponseBodyAsStream())); + return null; + } + } catch (ConnectException e) { + LOGGER.info("Couldn't connect to [" + url + "]"); + return null; } catch (IOException e) { LOGGER.error("Error talking to " + url + " : " + e.getLocalizedMessage()); - return null; - } finally { - if(httpMethod != null) + return null; + } finally { + if (httpMethod != null) httpMethod.releaseConnection(); + connectionManager.closeIdleConnections(0); } } - public static boolean delete(String url, final String user, final String pw) { + public static boolean delete(String url, final String user, final String pw) { - DeleteMethod httpMethod = null; - - try { - HttpClient client = new HttpClient(); + DeleteMethod httpMethod = null; + HttpClient client = new HttpClient(); + HttpConnectionManager connectionManager = client.getHttpConnectionManager(); + try { setAuth(client, url, user, pw); httpMethod = new DeleteMethod(url); - client.getHttpConnectionManager().getParams().setConnectionTimeout(5000); - int status = client.executeMethod(httpMethod); - String response = ""; - if(status == HttpStatus.SC_OK) { + connectionManager.getParams().setConnectionTimeout(5000); + int status = client.executeMethod(httpMethod); + String response = ""; + if (status == HttpStatus.SC_OK) { InputStream is = httpMethod.getResponseBodyAsStream(); - response = IOUtils.toString(is); - if(response.trim().equals("")) { // sometimes gs rest fails - if(LOGGER.isDebugEnabled()) - LOGGER.debug("ResponseBody is empty (this may be not an error since we just performed a DELETE call)"); - return true; - } - if(LOGGER.isDebugEnabled()) - LOGGER.debug("("+status+") " + httpMethod.getStatusText() + " -- " + url ); - return true; - } else { - LOGGER.info("("+status+") " + httpMethod.getStatusText() + " -- " + url ); - LOGGER.info("Response: '"+response+"'" ); - } - } catch (ConnectException e) { - LOGGER.info("Couldn't connect to ["+url+"]"); - } catch (IOException e) { - LOGGER.info("Error talking to ["+url+"]", e); - } finally { - if(httpMethod != null) + response = IOUtils.toString(is); + IOUtils.closeQuietly(is); + if (response.trim().equals("")) { // sometimes gs rest fails + if (LOGGER.isDebugEnabled()) + LOGGER + .debug("ResponseBody is empty (this may be not an error since we just performed a DELETE call)"); + return true; + } + if (LOGGER.isDebugEnabled()) + LOGGER.debug("(" + status + ") " + httpMethod.getStatusText() + " -- " + url); + return true; + } else { + LOGGER.info("(" + status + ") " + httpMethod.getStatusText() + " -- " + url); + LOGGER.info("Response: '" + response + "'"); + } + } catch (ConnectException e) { + LOGGER.info("Couldn't connect to [" + url + "]"); + } catch (IOException e) { + LOGGER.info("Error talking to [" + url + "]", e); + } finally { + if (httpMethod != null) httpMethod.releaseConnection(); + connectionManager.closeIdleConnections(0); } - return false; - } + return false; + } /** * @return true if the server response was an HTTP_OK */ - public static boolean httpPing(String url) { + public static boolean httpPing(String url) { return httpPing(url, null, null); } - public static boolean httpPing(String url, String username, String pw) { + public static boolean httpPing(String url, String username, String pw) { GetMethod httpMethod = null; - - try { - HttpClient client = new HttpClient(); + HttpClient client = new HttpClient(); + HttpConnectionManager connectionManager = client.getHttpConnectionManager(); + try { setAuth(client, url, username, pw); - httpMethod = new GetMethod(url); - client.getHttpConnectionManager().getParams().setConnectionTimeout(2000); - int status = client.executeMethod(httpMethod); - if(status != HttpStatus.SC_OK) { - LOGGER.warn("PING failed at '"+url+"': ("+status+") " + httpMethod.getStatusText()); + httpMethod = new GetMethod(url); + connectionManager.getParams().setConnectionTimeout(2000); + int status = client.executeMethod(httpMethod); + if (status != HttpStatus.SC_OK) { + LOGGER.warn("PING failed at '" + url + "': (" + status + ") " + httpMethod.getStatusText()); return false; } else { return true; } - - } catch (ConnectException e) { - return false; - } catch (IOException e) { - e.printStackTrace(); - return false; - } finally { - if(httpMethod != null) + } catch (ConnectException e) { + return false; + } catch (IOException e) { + LOGGER.error(e.getLocalizedMessage(),e); + return false; + } finally { + if (httpMethod != null) httpMethod.releaseConnection(); + connectionManager.closeIdleConnections(0); } - } + } /** * Used to query for REST resources. - * + * * @param url The URL of the REST resource to query about. * @param username * @param pw * @return true on 200, false on 404. * @throws RuntimeException on unhandled status or exceptions. */ - public static boolean exists(String url, String username, String pw) { + public static boolean exists(String url, String username, String pw) { GetMethod httpMethod = null; - - try { - HttpClient client = new HttpClient(); + HttpClient client = new HttpClient(); + HttpConnectionManager connectionManager = client.getHttpConnectionManager(); + try { setAuth(client, url, username, pw); - httpMethod = new GetMethod(url); - client.getHttpConnectionManager().getParams().setConnectionTimeout(2000); - int status = client.executeMethod(httpMethod); - switch(status) { - case HttpStatus.SC_OK: - return true; - case HttpStatus.SC_NOT_FOUND: - return false; - default: - throw new RuntimeException("Unhandled response status at '"+url+"': ("+status+") " + httpMethod.getStatusText()); + httpMethod = new GetMethod(url); + connectionManager.getParams().setConnectionTimeout(2000); + int status = client.executeMethod(httpMethod); + switch (status) { + case HttpStatus.SC_OK: + return true; + case HttpStatus.SC_NOT_FOUND: + return false; + default: + throw new RuntimeException("Unhandled response status at '" + url + "': (" + status + ") " + + httpMethod.getStatusText()); } - } catch (ConnectException e) { + } catch (ConnectException e) { throw new RuntimeException(e); - } catch (IOException e) { + } catch (IOException e) { throw new RuntimeException(e); - } finally { - if(httpMethod != null) + } finally { + if (httpMethod != null) httpMethod.releaseConnection(); + connectionManager.closeIdleConnections(0); } - } + } - - private static void setAuth(HttpClient client, String url, String username, String pw) throws MalformedURLException { + private static void setAuth(HttpClient client, String url, String username, String pw) + throws MalformedURLException { URL u = new URL(url); - if(username != null && pw != null) { + if (username != null && pw != null) { Credentials defaultcreds = new UsernamePasswordCredentials(username, pw); client.getState().setCredentials(new AuthScope(u.getHost(), u.getPort()), defaultcreds); - client.getParams().setAuthenticationPreemptive(true); // GS2 by default always requires authentication + client.getParams().setAuthenticationPreemptive(true); // GS2 by + // default + // always + // requires + // authentication } else { - if(LOGGER.isDebugEnabled()) { + if (LOGGER.isDebugEnabled()) { LOGGER.debug("Not setting credentials to access to " + url); } } } - + /** * recursively remove ending slashes *