Skip to content

Commit

Permalink
Refactor sending of requests for better extension.
Browse files Browse the repository at this point in the history
  • Loading branch information
Chavjoh committed Nov 29, 2023
1 parent 57b4593 commit 56e184d
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 23 deletions.
Expand Up @@ -13,7 +13,6 @@
import com.chavaillaz.client.common.security.Authentication;
import com.fasterxml.jackson.databind.JavaType;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.hc.client5.http.async.methods.SimpleHttpRequest;
import org.apache.hc.client5.http.async.methods.SimpleHttpResponse;
import org.apache.hc.client5.http.async.methods.SimpleRequestBuilder;
Expand All @@ -29,7 +28,6 @@
/**
* Abstract class implementing common parts for Apache HTTP.
*/
@Slf4j
public class AbstractApacheHttpClient extends AbstractHttpClient implements AutoCloseable {

protected final CloseableHttpAsyncClient client;
Expand Down Expand Up @@ -83,10 +81,8 @@ protected <T> CompletableFuture<T> sendAsync(SimpleRequestBuilder requestBuilder
* @return A {@link CompletableFuture} with the deserialized domain object
*/
protected <T> CompletableFuture<T> sendAsync(SimpleRequestBuilder requestBuilder, JavaType returnType) {
SimpleHttpRequest request = requestBuilder.build();
CompletableFuture<SimpleHttpResponse> completableFuture = new CompletableFuture<>();
client.execute(request, createContext(), new CompletableFutureCallback(this, request, completableFuture));
return completableFuture.thenApply(SimpleHttpResponse::getBodyText)
return sendAsyncBase(requestBuilder)
.thenApply(SimpleHttpResponse::getBodyText)
.thenApply(body -> deserialize(body, returnType));
}

Expand All @@ -97,11 +93,22 @@ protected <T> CompletableFuture<T> sendAsync(SimpleRequestBuilder requestBuilder
* @return A {@link CompletableFuture} with the input stream
*/
protected CompletableFuture<InputStream> sendAsync(SimpleRequestBuilder requestBuilder) {
return sendAsyncBase(requestBuilder)
.thenApply(SimpleHttpResponse::getBodyBytes)
.thenApply(ByteArrayInputStream::new);
}

/**
* Sends a request and returns the corresponding response.
*
* @param requestBuilder The request builder
* @return A {@link CompletableFuture} with the response
*/
protected CompletableFuture<SimpleHttpResponse> sendAsyncBase(SimpleRequestBuilder requestBuilder) {
SimpleHttpRequest request = requestBuilder.build();
CompletableFuture<SimpleHttpResponse> completableFuture = new CompletableFuture<>();
client.execute(request, createContext(), new CompletableFutureCallback(this, request, completableFuture));
return completableFuture.thenApply(SimpleHttpResponse::getBodyBytes)
.thenApply(ByteArrayInputStream::new);
return completableFuture;
}

/**
Expand Down
Expand Up @@ -10,7 +10,6 @@
import com.chavaillaz.client.common.security.Authentication;
import com.fasterxml.jackson.databind.JavaType;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
Expand All @@ -21,7 +20,6 @@
/**
* Abstract class implementing common parts for OkHttp.
*/
@Slf4j
public class AbstractOkHttpClient extends AbstractHttpClient implements AutoCloseable {

public static final MediaType MEDIA_TYPE_JSON = MediaType.parse(HEADER_CONTENT_JSON);
Expand Down Expand Up @@ -96,9 +94,8 @@ protected <T> CompletableFuture<T> sendAsync(Request.Builder requestBuilder, Cla
* @return A {@link CompletableFuture} with the deserialized domain object
*/
protected <T> CompletableFuture<T> sendAsync(Request.Builder requestBuilder, JavaType returnType) {
CompletableFuture<Response> completableFuture = new CompletableFuture<>();
client.newCall(requestBuilder.build()).enqueue(new CompletableFutureCallback(this, completableFuture));
return completableFuture.thenApply(response -> handleResponse(response, returnType));
return sendAsyncBase(requestBuilder)
.thenApply(response -> handleResponse(response, returnType));
}

/**
Expand All @@ -108,10 +105,21 @@ protected <T> CompletableFuture<T> sendAsync(Request.Builder requestBuilder, Jav
* @return A {@link CompletableFuture} with the input stream
*/
protected CompletableFuture<InputStream> sendAsync(Request.Builder requestBuilder) {
return sendAsyncBase(requestBuilder)
.thenApply(Response::body)
.thenApply(ResponseBody::byteStream);
}

/**
* Sends a request and returns the corresponding response.
*
* @param requestBuilder The request builder
* @return A {@link CompletableFuture} with the response
*/
protected CompletableFuture<Response> sendAsyncBase(Request.Builder requestBuilder) {
CompletableFuture<Response> completableFuture = new CompletableFuture<>();
client.newCall(requestBuilder.build()).enqueue(new CompletableFutureCallback(this, completableFuture));
return completableFuture.thenApply(Response::body)
.thenApply(ResponseBody::byteStream);
return completableFuture;
}

/**
Expand Down
Expand Up @@ -14,12 +14,10 @@
import io.vertx.ext.web.client.HttpRequest;
import io.vertx.ext.web.client.HttpResponse;
import io.vertx.ext.web.client.WebClient;
import lombok.extern.slf4j.Slf4j;

/**
* Abstract class implementing common parts for Vert.x HTTP.
*/
@Slf4j
public class AbstractVertxHttpClient extends AbstractHttpClient implements AutoCloseable {

protected WebClient client;
Expand Down Expand Up @@ -83,10 +81,8 @@ protected <T> CompletableFuture<T> handleAsync(Future<HttpResponse<Buffer>> futu
* @return A {@link CompletableFuture} with the deserialized domain object
*/
protected <T> CompletableFuture<T> handleAsync(Future<HttpResponse<Buffer>> future, JavaType returnType) {
CompletableFuture<HttpResponse<Buffer>> completableFuture = new CompletableFuture<>();
future.onSuccess(response -> handleResponse(response, completableFuture))
.onFailure(completableFuture::completeExceptionally);
return completableFuture.thenApply(HttpResponse::bodyAsString)
return handleAsyncBase(future)
.thenApply(HttpResponse::bodyAsString)
.thenApply(body -> deserialize(body, returnType));
}

Expand All @@ -97,11 +93,22 @@ protected <T> CompletableFuture<T> handleAsync(Future<HttpResponse<Buffer>> futu
* @return A {@link CompletableFuture} with the input stream
*/
protected CompletableFuture<InputStream> handleAsync(Future<HttpResponse<Buffer>> future) {
return handleAsyncBase(future)
.thenApply(HttpResponse::body)
.thenApply(VertxInputStream::new);
}

/**
* Handles the request sent and returns the corresponding response buffer.
*
* @param future The future response
* @return A {@link CompletableFuture} with the response buffer
*/
protected CompletableFuture<HttpResponse<Buffer>> handleAsyncBase(Future<HttpResponse<Buffer>> future) {
CompletableFuture<HttpResponse<Buffer>> completableFuture = new CompletableFuture<>();
future.onSuccess(response -> handleResponse(response, completableFuture))
.onFailure(completableFuture::completeExceptionally);
return completableFuture.thenApply(HttpResponse::body)
.thenApply(VertxInputStream::new);
return completableFuture;
}

/**
Expand Down

0 comments on commit 56e184d

Please sign in to comment.