Add original headers into new client

 avatar
unknown
java
2 years ago
2.6 kB
5
Indexable
public class MyRequestFilter implements ClientRequestFilter {
    private MultivaluedMap<String, Object> originalHeaders;

    public MyRequestFilter(MultivaluedMap<String, Object> originalHeaders) {
        this.originalHeaders = originalHeaders;
    }

    @Override
    public void filter(ClientRequestContext requestContext) throws IOException {
        // Add the original headers to the new request
        for (Map.Entry<String, List<Object>> entry : originalHeaders.entrySet()) {
            requestContext.getHeaders().addAll(entry.getKey(), entry.getValue());
        }
    }
}

public interface MyEndpoint {
    @GET
    @Path("/my-resource")
    CompletionStage<Response> getMyResource(@QueryParam("param1") String param1,
                                            @QueryParam("param2") String param2);
}

MyEndpoint endpointWithHeader = RestClientBuilder.newBuilder()
        .baseUri("http://example.com")
        .build(MyEndpoint.class);

MyEndpoint endpointWithoutHeader = RestClientBuilder.newBuilder()
        .baseUri("http://example.com")
        .registerProvider(new MyRequestFilter(Collections.emptyMap()))
        .build(MyEndpoint.class);

String missingHeader = "value-from-mobile-app";

BiFunction<Response, Throwable, CompletionStage<Response>> handleStatus = (response, throwable) -> {
    if (response != null && response.getStatus() == 409) {
        MultivaluedMap<String, Object> headers = response.getHeaders();
        if (headers.containsKey("Missing-Header")) {
            headers.add("pin", missingHeader);

            // Register a new request filter with the original headers
            endpointWithoutHeader = RestClientBuilder.newBuilder()
                    .baseUri("http://example.com")
                    .registerProvider(new MyRequestFilter(headers))
                    .build(MyEndpoint.class);

            // Call the endpoint again with the missing header and original headers using the endpointWithHeader client
            return endpointWithHeader.getMyResource("value1", "value2", missingHeader);
        }
    }
    // Handle other response codes here using the endpointWithoutHeader client
    return CompletableFuture.completedFuture(response);
};

CompletionStage<Response> responseStage = endpointWithoutHeader.getMyResource("value1", "value2");
responseStage.thenCompose(handleStatus)
        .thenApply(response -> {
            if (response.getStatus() == 200) {
                return response.readEntity(MyResource.class);
            } else {
                throw new MyException("Failed to get resource");
            }
        });
Editor is loading...