package io.robe.test.request;
import okhttp3.*;
import java.io.IOException;
import java.util.Map;
/**
* Created by adem on 06/10/2016.
*/
public class HttpClient implements HttpRequest {
private final OkHttpClient okHttpClient;
private static HttpClient INSTANCE;
private HttpClient(Interceptor interceptor) {
okHttpClient = new OkHttpClient.Builder().addInterceptor(interceptor).build();
}
public static HttpClient getClient(Interceptor interceptor) {
if(INSTANCE == null) {
INSTANCE = new HttpClient(interceptor);
}
return INSTANCE;
}
public static HttpClient getClient() {
if(INSTANCE == null) {
INSTANCE = new HttpClient(new AuthenticationInterceptor());
}
return INSTANCE;
}
@Override
public TestResponse post(TestRequest testRequest) throws IOException {
Request.Builder requestBuilder = buildRequest(testRequest);
String entity = testRequest.hasBody() ? testRequest.getEntity() : "";
requestBuilder.post(RequestBody.create(MediaType.parse(testRequest.getContentType()), entity));
Response response = okHttpClient.newCall(requestBuilder.build()).execute();
return TestResponse.fromResponse(testRequest, response);
}
@Override
public TestResponse get(TestRequest testRequest) throws IOException {
Request.Builder requestBuilder = buildRequest(testRequest);
Response response = okHttpClient.newCall(requestBuilder.build()).execute();
return TestResponse.fromResponse(testRequest, response);
}
@Override
public TestResponse put(TestRequest testRequest) throws IOException {
Request.Builder requestBuilder = buildRequest(testRequest);
String entity = testRequest.hasBody() ? testRequest.getEntity() : "";
requestBuilder.put(RequestBody.create(MediaType.parse(testRequest.getContentType()), entity));
Response response = okHttpClient.newCall(requestBuilder.build()).execute();
return TestResponse.fromResponse(testRequest, response);
}
@Override
public TestResponse delete(TestRequest testRequest) throws IOException {
Request.Builder requestBuilder = buildRequest(testRequest);
String entity = testRequest.hasBody() ? testRequest.getEntity() : "";
requestBuilder.delete(RequestBody.create(MediaType.parse(testRequest.getContentType()), entity));
Response response = okHttpClient.newCall(requestBuilder.build()).execute();
return TestResponse.fromResponse(testRequest, response);
}
@Override
public TestResponse patch(TestRequest testRequest) throws IOException {
Request.Builder requestBuilder = buildRequest(testRequest);
String entity = testRequest.hasBody() ? testRequest.getEntity() : "";
requestBuilder.patch(RequestBody.create(MediaType.parse(testRequest.getContentType()), entity));
Response response = okHttpClient.newCall(requestBuilder.build()).execute();
return TestResponse.fromResponse(testRequest, response);
}
private Request.Builder buildRequest(TestRequest testRequest) {
Request.Builder requestBuilder = new Request.Builder();
requestBuilder.url(testRequest.getRequestUrl());
if(testRequest.hasCookie())
for(Map.Entry<String, String> cookie : testRequest.getCookies().entrySet())
requestBuilder.addHeader("Cookie", cookie.getKey() + "=" + cookie.getValue());
if(testRequest.hasHeader())
for(Map.Entry<String, String> header : testRequest.getHeaders().entrySet())
requestBuilder.addHeader(header.getKey(), header.getValue());
requestBuilder.header("Content-Type", testRequest.getContentType());
return requestBuilder;
}
}