package com.mediafire.sdk;
import javax.net.ssl.HttpsURLConnection;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import java.util.Map;
public class MFHttpRequester implements MediaFireHttpRequester {
private final MediaFireHttpsAgent httpsAgent;
private final int connectionTimeout;
private final int readTimeout;
public MFHttpRequester(MediaFireHttpsAgent httpsAgent, int connectionTimeout, int readTimeout) {
this.httpsAgent = httpsAgent;
this.connectionTimeout = connectionTimeout;
this.readTimeout = readTimeout;
}
public MFHttpRequester(int connectionTimeout, int readTimeout) {
this(null, connectionTimeout, readTimeout);
}
@Override
public MediaFireHttpResponse get(MediaFireHttpRequest request) throws MediaFireException {
return makeRequest(request, false);
}
@Override
public MediaFireHttpResponse post(MediaFireHttpRequest request) throws MediaFireException {
return makeRequest(request, true);
}
@Override
public MediaFireHttpsAgent getHttpsAgent() {
return httpsAgent;
}
private MediaFireHttpResponse makeRequest(MediaFireHttpRequest request, boolean doOutput) throws MediaFireException {
try {
String urlString = request.getRequestUrl();
Map<String, Object> headers = request.getRequestHeaders();
byte[] payload = request.getRequestPayload();
HttpsURLConnection connection = createHttpsUrlConnection(urlString);
setupConnection(connection, headers, doOutput);
if (doOutput && payload != null) {
connection.getOutputStream().write(payload);
}
MediaFireHttpResponse response = getResponse(connection);
return response;
} catch (IOException e) {
throw new MediaFireException("IO exception: ", e);
}
}
private HttpsURLConnection createHttpsUrlConnection(String url) throws MediaFireException {
try {
return (HttpsURLConnection) new URL(url).openConnection();
} catch (MalformedURLException e) {
throw new MediaFireException("bad url: " + url, e);
} catch (IOException e) {
throw new MediaFireException("IO exception: ", e);
}
}
private void setupConnection(HttpsURLConnection connection, Map<String, Object> headers, boolean doOutput) {
connection.setConnectTimeout(connectionTimeout);
connection.setReadTimeout(readTimeout);
connection.setDoOutput(doOutput);
if (headers != null && !headers.isEmpty()) {
for (String key : headers.keySet()) {
if (headers.get(key) != null) {
connection.addRequestProperty(key, String.valueOf(headers.get(key)));
}
}
}
if (getHttpsAgent() != null) {
getHttpsAgent().configureHttpsUrlConnection(connection);
}
}
private MediaFireHttpResponse getResponse(HttpsURLConnection connection) throws IOException {
int responseCode = connection.getResponseCode();
InputStream inputStream;
inputStream = responseCode / 100 != 2 ? connection.getErrorStream() : connection.getInputStream();
byte[] response = readStream(inputStream);
if (inputStream != null) {
inputStream.close();
}
Map<String, List<String>> headerFields = connection.getHeaderFields();
return new MFHttpResponse(responseCode, response, headerFields);
}
private byte[] readStream(InputStream inputStream) throws IOException {
if (inputStream == null) {
return null;
}
byte[] buffer = new byte[1024];
int count;
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(1024);
while ((count = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, count);
}
byte[] bytes = outputStream.toByteArray();
outputStream.close();
return bytes;
}
}