|
8 | 8 | import java.util.List; |
9 | 9 | import java.util.Map; |
10 | 10 |
|
11 | | -public class HttpClient { |
| 11 | +public abstract class HttpClient { |
12 | 12 |
|
13 | 13 | public static final String DEFAULT_USER_AGENT = "Java-Async-Http"; |
14 | | - public static final String DEFAULT_CHARSET = "UTF-8"; |
15 | 14 |
|
16 | 15 | private final Map<String, String> headers; |
17 | 16 |
|
18 | | - private String charset; |
19 | 17 | private int connectionTimeout = 20000; |
20 | 18 | private int dataRetrievalTimeout = 20000; |
21 | 19 |
|
22 | 20 | public HttpClient() { |
23 | 21 | headers = Collections.synchronizedMap(new LinkedHashMap<String, String>()); |
24 | 22 | setUserAgent(DEFAULT_USER_AGENT); |
25 | | - setCharset(DEFAULT_CHARSET); |
26 | 23 | } |
27 | 24 |
|
28 | 25 | /** |
29 | | - * Read the input stream and convert to a string |
| 26 | + * Reads an InputStream into a byte array. |
30 | 27 | * |
31 | 28 | * @param inputStream InputStream to read |
32 | | - * @return String representing entire input stream contents |
| 29 | + * @return byte array representing entire InputStream contents |
| 30 | + * @throws IOException if unable to read stream |
33 | 31 | */ |
34 | | - private static String readStream(InputStream inputStream) { |
35 | | - if (inputStream == null) return ""; |
36 | | - StringBuilder text = new StringBuilder(); |
37 | | - try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { |
38 | | - String line; |
39 | | - while ((line = reader.readLine()) != null) { |
40 | | - text.append(line); |
41 | | - } |
42 | | - } catch (IOException e) { |
43 | | - e.printStackTrace(); |
| 32 | + private static byte[] readStreamAsBytes(InputStream inputStream) throws IOException { |
| 33 | + if (inputStream == null) return new byte[0]; |
| 34 | + |
| 35 | + ByteArrayOutputStream os = new ByteArrayOutputStream(); |
| 36 | + byte[] buffer = new byte[1024 * 32]; |
| 37 | + int bytesRead; |
| 38 | + while ((bytesRead = inputStream.read(buffer, 0, buffer.length)) != -1) { |
| 39 | + os.write(buffer, 0, bytesRead); |
44 | 40 | } |
45 | | - return text.toString(); |
| 41 | + os.flush(); |
| 42 | + return os.toByteArray(); |
46 | 43 | } |
47 | 44 |
|
48 | 45 | protected void request(String url, HttpRequestMethod method, RequestParams params, HttpResponseHandler handler) { |
@@ -79,38 +76,26 @@ protected void request(String url, HttpRequestMethod method, RequestParams param |
79 | 76 | // POST and PUT expect an output body. |
80 | 77 | if (method == HttpRequestMethod.POST || method == HttpRequestMethod.PUT) { |
81 | 78 | urlConnection.setDoOutput(true); |
82 | | - // TODO: Allow user to set content-type |
83 | 79 | byte[] content = params.toEncodedString().getBytes(); |
84 | | - urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + charset); |
| 80 | + urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + "utf-8"); // TODO: Allow user to set content-type |
85 | 81 | urlConnection.setRequestProperty("Content-Length", Long.toString(content.length)); |
| 82 | + urlConnection.setFixedLengthStreamingMode(content.length); // Stream the data so we don't run out of memory |
86 | 83 | try (OutputStream os = urlConnection.getOutputStream()) { |
87 | 84 | os.write(content); |
88 | 85 | } |
89 | 86 | } |
90 | 87 |
|
91 | 88 | // Response |
92 | 89 | int responseCode = urlConnection.getResponseCode(); |
93 | | - String responseMessage = urlConnection.getResponseMessage(); |
94 | | - |
95 | | - // Response Headers |
96 | 90 | Map<String, List<String>> responseHeaders = urlConnection.getHeaderFields(); |
97 | 91 |
|
98 | | - // Build response object |
99 | | - HttpResponse response = new HttpResponse(); |
100 | | - response.setUrl(urlConnection.getURL().toString()); |
101 | | - response.setStatusCode(responseCode); |
102 | | - response.setStatusMessage(responseMessage); |
103 | | - response.setHeaders(responseHeaders); |
104 | | - |
105 | 92 | // 'Successful' response codes will be in interval [200,300) |
106 | 93 | if (responseCode >= 200 && responseCode < 300) { |
107 | | - String responseContent = readStream(urlConnection.getInputStream()); |
108 | | - response.setContent(responseContent); |
109 | | - handler.onSuccess(response); |
| 94 | + byte[] responseContent = readStreamAsBytes(urlConnection.getInputStream()); |
| 95 | + handler.onSuccess(responseCode, responseHeaders, responseContent); |
110 | 96 | } else { |
111 | | - String responseContent = readStream(urlConnection.getErrorStream()); |
112 | | - response.setContent(responseContent); |
113 | | - handler.onFailure(response); |
| 97 | + byte[] responseContent = readStreamAsBytes(urlConnection.getErrorStream()); |
| 98 | + handler.onFailure(responseCode, responseHeaders, responseContent); |
114 | 99 | } |
115 | 100 |
|
116 | 101 | } catch (IOException e) { |
@@ -178,10 +163,6 @@ public void setUserAgent(String userAgent) { |
178 | 163 | headers.put("User-Agent", userAgent); |
179 | 164 | } |
180 | 165 |
|
181 | | - public void setCharset(String charset) { |
182 | | - this.charset = charset; |
183 | | - } |
184 | | - |
185 | 166 | public int getConnectionTimeout() { |
186 | 167 | return connectionTimeout; |
187 | 168 | } |
|
0 commit comments