/*
* Copyright 2012 Eric F. Savage, code@efsavage.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.ajah.http;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.logging.Level;
import lombok.extern.java.Log;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import com.ajah.http.err.BadRequestException;
import com.ajah.http.err.HttpException;
import com.ajah.http.err.InternalServerError;
import com.ajah.http.err.NotFoundException;
import com.ajah.http.err.UnexpectedResponseCode;
/**
* Offers a simple interface to HTTP client operations with sensible default
* behaviors.
*
* @author <a href="http://efsavage.com">Eric F. Savage</a>, <a
* href="mailto:code@efsavage.com">code@efsavage.com</a>.
*
*/
@Log
public class Http {
private static String get(final String url) throws IOException, HttpException {
URI uri;
try {
uri = URI.create(url);
} catch (final IllegalArgumentException e) {
log.warning("Illegal URI [" + url + "] - " + e.getMessage());
throw new BadRequestException(e);
}
return get(uri);
}
/**
* Fetch a URI and return it's response as a String.
*
* @param uri
* The URI to fetch.
* @return The response body as a String.
* @throws IOException
* If the response could not be completed.
* @throws UnexpectedResponseCode
* If an unexpected/illegal response status is issued.
* @throws NotFoundException
* If the resource could not be found at the URI (404).
* @throws InternalServerError
* @throws ParseException
*/
public static String get(final URI uri) throws IOException, UnexpectedResponseCode, NotFoundException, ParseException, InternalServerError {
long start = System.currentTimeMillis();
String response = EntityUtils.toString(internalGet(uri));
log.finest((System.currentTimeMillis() - start) + "ms to fetch " + uri.toASCIIString());
return response;
}
/**
* Return the body of the response as a byte array (such as an image).
*
* @see #getBytes(URI)
* @param uri
* The URI to fetch.
* @return The response body as a String.
* @throws IOException
* If the response could not be completed.
* @throws UnexpectedResponseCode
* If an unexpected/illegal response status is issued.
* @throws NotFoundException
* If the resource could not be found at the URI (404).
* @throws URISyntaxException
* @throws InternalServerError
*/
public static byte[] getBytes(final String uri) throws IOException, NotFoundException, UnexpectedResponseCode, URISyntaxException, InternalServerError {
return EntityUtils.toByteArray(internalGet(new URI(uri)));
}
/**
* Return the body of the response as a byte array (such as an image).
*
* @param uri
* The URI to fetch.
* @return The response body as a String.
* @throws IOException
* If the response could not be completed.
* @throws UnexpectedResponseCode
* If an unexpected/illegal response status is issued.
* @throws NotFoundException
* If the resource could not be found at the URI (404).
* @throws InternalServerError
*/
public static byte[] getBytes(final URI uri) throws IOException, HttpException {
return EntityUtils.toByteArray(internalGet(uri));
}
/**
* Calls {@link #get(URI)} but returns null instead of throwing exceptions.
*
* @param uri
* The URL to fetch.
* @return The response as a String, or null.
*/
public static String getSafe(final String uri) {
try {
return get(uri);
} catch (final IOException e) {
log.log(Level.WARNING, e.getMessage(), e);
return null;
} catch (final HttpException e) {
log.log(Level.WARNING, e.getMessage(), e);
return null;
}
}
private static HttpEntity internalGet(final URI uri) throws IOException, ClientProtocolException, NotFoundException, UnexpectedResponseCode, InternalServerError {
CloseableHttpClient client = HttpClientBuilder.create().build();
final HttpGet httpget = new HttpGet(uri);
final HttpResponse response = client.execute(httpget);
if (response.getStatusLine().getStatusCode() == 200) {
final HttpEntity entity = response.getEntity();
return entity;
} else if (response.getStatusLine().getStatusCode() == 404) {
throw new NotFoundException(response.getStatusLine().getStatusCode() + " - " + response.getStatusLine().getReasonPhrase());
} else if (response.getStatusLine().getStatusCode() == 500) {
throw new InternalServerError(response.getStatusLine().getStatusCode() + " - " + response.getStatusLine().getReasonPhrase());
} else {
throw new UnexpectedResponseCode(response.getStatusLine().getStatusCode() + " - " + response.getStatusLine().getReasonPhrase());
}
}
}