| |
| package com.turbomanage.httpclient; |
| |
| import java.io.ByteArrayOutputStream; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.OutputStream; |
| import java.net.HttpURLConnection; |
| import java.net.URL; |
| |
| /** |
| * Default {@link RequestHandler} used by {@link BasicHttpClient}. It is |
| * intended to be used for simple requests with small amounts of data only (a |
| * few kB), as it does no buffering, chunking, streaming, etc. Only character |
| * set supported is UTF-8. Only {@link String} content is supported. All |
| * responses are treated as {@link String}s. This class is abstract so that |
| * it can be easily extended in an anonymous inner class when constructing |
| * a client. |
| * |
| * @author David M. Chandler |
| */ |
| public abstract class BasicRequestHandler implements RequestHandler { |
| |
| private final RequestLogger logger; |
| |
| /** |
| * Constructs a handler with default logger. |
| */ |
| public BasicRequestHandler() { |
| this(new ConsoleRequestLogger()); |
| } |
| |
| /** |
| * Constructs a handler with supplied logger. |
| * |
| * @param logger |
| */ |
| public BasicRequestHandler(RequestLogger logger) { |
| this.logger = logger; |
| } |
| |
| @Override |
| public HttpURLConnection openConnection(String urlString) throws IOException { |
| URL url = new URL(urlString); |
| HttpURLConnection uc = (HttpURLConnection) url.openConnection(); |
| return uc; |
| } |
| |
| @Override |
| public void prepareConnection(HttpURLConnection urlConnection, HttpMethod httpMethod, |
| String contentType) throws IOException { |
| // Configure connection for request method |
| urlConnection.setRequestMethod(httpMethod.getMethodName()); |
| urlConnection.setDoOutput(httpMethod.getDoOutput()); |
| urlConnection.setDoInput(httpMethod.getDoInput()); |
| if (contentType != null) { |
| urlConnection.setRequestProperty("Content-Type", contentType); |
| } |
| // Set additional properties |
| urlConnection.setRequestProperty("Accept-Charset", UTF8); |
| } |
| |
| @Override |
| public OutputStream openOutput(HttpURLConnection urlConnection) |
| throws IOException { |
| return urlConnection.getOutputStream(); |
| } |
| |
| @Override |
| public void writeStream(OutputStream out, byte[] content) throws IOException { |
| out.write(content); |
| } |
| |
| @Override |
| public InputStream openInput(HttpURLConnection urlConnection) |
| throws IOException { |
| return urlConnection.getInputStream(); |
| } |
| |
| @Override |
| public byte[] readStream(InputStream in) throws IOException { |
| int nRead; |
| byte[] data = new byte[16384]; |
| ByteArrayOutputStream buffer = new ByteArrayOutputStream(); |
| |
| while ((nRead = in.read(data)) != -1) { |
| buffer.write(data, 0, nRead); |
| } |
| buffer.flush(); |
| return buffer.toByteArray(); |
| } |
| |
| @Override |
| public boolean onError(HttpRequestException e) { |
| HttpResponse res = e.getHttpResponse(); |
| if (logger.isLoggingEnabled()) { |
| logger.log("BasicRequestHandler.onError got"); |
| e.printStackTrace(); |
| } |
| if (res != null) { |
| int status = res.getStatus(); |
| if (status > 0) { |
| // Perhaps a 404, 501, or something that will be fixed later |
| return true; |
| } |
| } |
| // Connection refused, host unreachable, etc. |
| return false; |
| } |
| |
| } |