Search in sources :

Example 1 with SdkHttpContentPublisher

use of software.amazon.awssdk.http.async.SdkHttpContentPublisher in project curiostack by curioswitch.

the class ArmeriaSdkHttpClientTest method converts_success.

@Test
void converts_success() {
    StreamMessage<ByteBuffer> requestStream = StreamMessage.of(ByteBuffer.wrap("meow".getBytes(StandardCharsets.UTF_8)), ByteBuffer.wrap("woof".getBytes(StandardCharsets.UTF_8)));
    AtomicReference<SdkHttpResponse> responseHeaders = new AtomicReference<>();
    AtomicReference<Throwable> responseError = new AtomicReference<>();
    AtomicReference<Throwable> responseSubscriberError = new AtomicReference<>();
    AtomicBoolean responseComplete = new AtomicBoolean();
    List<ByteBuffer> responsePayloads = new ArrayList<>();
    AsyncExecuteRequest request = AsyncExecuteRequest.builder().request(SdkHttpRequest.builder().protocol("https").method(SdkHttpMethod.POST).host("github.com").appendHeader("X-Animals", "cat").appendHeader("X-Animals", "dog").appendHeader("Content-Type", "application/json").encodedPath("/foo").appendRawQueryParameter("bar", "baz").build()).responseHandler(new SdkAsyncHttpResponseHandler() {

        @Override
        public void onHeaders(SdkHttpResponse headers) {
            responseHeaders.set(headers);
        }

        @Override
        public void onStream(Publisher<ByteBuffer> stream) {
            stream.subscribe(new Subscriber<ByteBuffer>() {

                @Override
                public void onSubscribe(Subscription s) {
                    s.request(Long.MAX_VALUE);
                }

                @Override
                public void onNext(ByteBuffer byteBuffer) {
                    responsePayloads.add(byteBuffer);
                }

                @Override
                public void onError(Throwable t) {
                    responseSubscriberError.set(t);
                }

                @Override
                public void onComplete() {
                    responseComplete.set(true);
                }
            });
        }

        @Override
        public void onError(Throwable error) {
            responseError.set(error);
        }
    }).requestContentPublisher(new SdkHttpContentPublisher() {

        @Override
        public Optional<Long> contentLength() {
            return Optional.of((long) ("body1" + "body2").length());
        }

        @Override
        public void subscribe(Subscriber<? super ByteBuffer> s) {
            requestStream.subscribe(s);
        }
    }).fullDuplex(false).build();
    AtomicReference<AggregatedHttpRequest> aggregatedRequest = new AtomicReference<>();
    when(webClient.execute(any(HttpRequest.class))).thenAnswer((Answer<HttpResponse>) invocation -> {
        HttpRequest httpRequest = invocation.getArgument(0);
        aggregatedRequest.set(httpRequest.aggregate().join());
        return HttpResponse.of(ResponseHeaders.of(HttpStatus.OK, HttpHeaderNames.CONTENT_TYPE, "application/json", HttpHeaderNames.of("X-Countries"), "Japan", HttpHeaderNames.of("X-Countries"), "US"), HttpData.ofUtf8("purr"), HttpData.ofUtf8("growl"));
    });
    CompletableFuture<Void> responseFuture = client.execute(request);
    assertThat(responseFuture.join()).isNull();
    assertThat(responseHeaders.get()).satisfies(headers -> {
        assertThat(headers.statusCode()).isEqualTo(HttpStatus.OK.code());
        assertThat(headers.statusText()).hasValue(HttpStatus.OK.reasonPhrase());
        assertThat(headers.headers()).containsEntry("content-type", ImmutableList.of("application/json")).containsEntry("x-countries", ImmutableList.of("Japan", "US"));
    });
    assertThat(responsePayloads).extracting(buf -> Unpooled.wrappedBuffer(buf).toString(StandardCharsets.UTF_8)).containsExactly("purr", "growl");
    assertThat(responseError.get()).isNull();
    assertThat(responseSubscriberError.get()).isNull();
}
Also used : ArgumentMatchers.any(org.mockito.ArgumentMatchers.any) BeforeEach(org.junit.jupiter.api.BeforeEach) AggregatedHttpRequest(com.linecorp.armeria.common.AggregatedHttpRequest) Mock(org.mockito.Mock) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) CompletableFuture(java.util.concurrent.CompletableFuture) AtomicReference(java.util.concurrent.atomic.AtomicReference) HttpHeaderNames(com.linecorp.armeria.common.HttpHeaderNames) ByteBuffer(java.nio.ByteBuffer) Unpooled(io.netty.buffer.Unpooled) ArrayList(java.util.ArrayList) Answer(org.mockito.stubbing.Answer) ImmutableList(com.google.common.collect.ImmutableList) CurioAssertions.assertThat(org.curioswitch.common.testing.assertj.CurioAssertions.assertThat) HttpStatus(com.linecorp.armeria.common.HttpStatus) WebClient(com.linecorp.armeria.client.WebClient) SdkHttpMethod(software.amazon.awssdk.http.SdkHttpMethod) SdkAsyncHttpResponseHandler(software.amazon.awssdk.http.async.SdkAsyncHttpResponseHandler) Subscriber(org.reactivestreams.Subscriber) HttpData(com.linecorp.armeria.common.HttpData) SdkHttpResponse(software.amazon.awssdk.http.SdkHttpResponse) HttpResponse(com.linecorp.armeria.common.HttpResponse) SdkHttpRequest(software.amazon.awssdk.http.SdkHttpRequest) Publisher(org.reactivestreams.Publisher) SdkHttpContentPublisher(software.amazon.awssdk.http.async.SdkHttpContentPublisher) Mockito.when(org.mockito.Mockito.when) StandardCharsets(java.nio.charset.StandardCharsets) AsyncExecuteRequest(software.amazon.awssdk.http.async.AsyncExecuteRequest) Test(org.junit.jupiter.api.Test) HttpRequest(com.linecorp.armeria.common.HttpRequest) List(java.util.List) StreamMessage(com.linecorp.armeria.common.stream.StreamMessage) ResponseHeaders(com.linecorp.armeria.common.ResponseHeaders) Subscription(org.reactivestreams.Subscription) Optional(java.util.Optional) ArrayList(java.util.ArrayList) SdkHttpResponse(software.amazon.awssdk.http.SdkHttpResponse) AggregatedHttpRequest(com.linecorp.armeria.common.AggregatedHttpRequest) AsyncExecuteRequest(software.amazon.awssdk.http.async.AsyncExecuteRequest) Subscription(org.reactivestreams.Subscription) SdkHttpContentPublisher(software.amazon.awssdk.http.async.SdkHttpContentPublisher) AggregatedHttpRequest(com.linecorp.armeria.common.AggregatedHttpRequest) SdkHttpRequest(software.amazon.awssdk.http.SdkHttpRequest) HttpRequest(com.linecorp.armeria.common.HttpRequest) Optional(java.util.Optional) SdkHttpResponse(software.amazon.awssdk.http.SdkHttpResponse) HttpResponse(com.linecorp.armeria.common.HttpResponse) AtomicReference(java.util.concurrent.atomic.AtomicReference) Publisher(org.reactivestreams.Publisher) SdkHttpContentPublisher(software.amazon.awssdk.http.async.SdkHttpContentPublisher) ByteBuffer(java.nio.ByteBuffer) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) SdkAsyncHttpResponseHandler(software.amazon.awssdk.http.async.SdkAsyncHttpResponseHandler) Test(org.junit.jupiter.api.Test)

Aggregations

ImmutableList (com.google.common.collect.ImmutableList)1 WebClient (com.linecorp.armeria.client.WebClient)1 AggregatedHttpRequest (com.linecorp.armeria.common.AggregatedHttpRequest)1 HttpData (com.linecorp.armeria.common.HttpData)1 HttpHeaderNames (com.linecorp.armeria.common.HttpHeaderNames)1 HttpRequest (com.linecorp.armeria.common.HttpRequest)1 HttpResponse (com.linecorp.armeria.common.HttpResponse)1 HttpStatus (com.linecorp.armeria.common.HttpStatus)1 ResponseHeaders (com.linecorp.armeria.common.ResponseHeaders)1 StreamMessage (com.linecorp.armeria.common.stream.StreamMessage)1 Unpooled (io.netty.buffer.Unpooled)1 ByteBuffer (java.nio.ByteBuffer)1 StandardCharsets (java.nio.charset.StandardCharsets)1 ArrayList (java.util.ArrayList)1 List (java.util.List)1 Optional (java.util.Optional)1 CompletableFuture (java.util.concurrent.CompletableFuture)1 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)1 AtomicReference (java.util.concurrent.atomic.AtomicReference)1 CurioAssertions.assertThat (org.curioswitch.common.testing.assertj.CurioAssertions.assertThat)1