Search in sources :

Example 1 with HeaderValue

use of software.amazon.eventstream.HeaderValue in project aws-sdk-java-v2 by aws.

the class Aws4EventStreamSignerTest method generateTestVector.

TestVector generateTestVector() {
    return new TestVector() {

        List<String> requestBody = Lists.newArrayList("A", "B", "C");

        @Override
        public List<String> requestBody() {
            return requestBody;
        }

        @Override
        public SdkHttpFullRequest.Builder httpFullRequest() {
            // Signing key: "29dc0a760fed568677d74136ad02d315a07d31b8f321f5c43350f284dac892c";
            return SdkHttpFullRequest.builder().method(SdkHttpMethod.POST).putHeader("Host", "demo.us-east-1.amazonaws.com").putHeader("content-encoding", "application/vnd.amazon.eventstream").putHeader("x-amz-content-sha256", "STREAMING-AWS4-HMAC-SHA256-EVENTS").encodedPath("/streaming").protocol("https").host("demo.us-east-1.amazonaws.com");
        }

        @Override
        public AsyncRequestBody requestBodyPublisher() {
            List<ByteBuffer> bodyBytes = requestBody.stream().map(s -> ByteBuffer.wrap(s.getBytes(StandardCharsets.UTF_8))).collect(Collectors.toList());
            Publisher<ByteBuffer> bodyPublisher = Flowable.fromIterable(bodyBytes);
            return AsyncRequestBody.fromPublisher(bodyPublisher);
        }

        @Override
        public Flowable<Message> expectedMessagePublisher() {
            Flowable<String> sigsHex = Flowable.just("7aabf85b765e6a4d0d500b6e968657b14726fa3e1eb7e839302728ffd77629a5", "f72aa9642f571d24a6e1ae42f10f073ad9448d8a028b6bcd82da081335adda02", "632af120435b57ec241d8bfbb12e496dfd5e2730a1a02ac0ab6eaa230ae02e9a", "c6f679ddb3af68f5e82f0cf6761244cb2338cf11e7d01a24130aea1b7c17e53e");
            // The Last data frame is empty
            Flowable<String> payloads = Flowable.fromIterable(requestBody).concatWith(Flowable.just(""));
            return sigsHex.zipWith(payloads, new BiFunction<String, String, Message>() {

                // The first Instant was used to sign the request
                private int idx = 1;

                @Override
                public Message apply(String sig, String payload) throws Exception {
                    Map<String, HeaderValue> headers = new HashMap<>();
                    headers.put(EVENT_STREAM_DATE, HeaderValue.fromTimestamp(SIGNING_INSTANTS.get(idx++)));
                    headers.put(EVENT_STREAM_SIGNATURE, HeaderValue.fromByteArray(BinaryUtils.fromHex(sig)));
                    return new Message(headers, payload.getBytes(StandardCharsets.UTF_8));
                }
            });
        }
    };
}
Also used : Assertions.fail(org.junit.jupiter.api.Assertions.fail) ArgumentMatchers.any(org.mockito.ArgumentMatchers.any) BiFunction(io.reactivex.functions.BiFunction) SignerTestUtils(software.amazon.awssdk.auth.signer.internal.SignerTestUtils) HashMap(java.util.HashMap) ByteBuffer(java.nio.ByteBuffer) Message(software.amazon.eventstream.Message) EVENT_STREAM_DATE(software.amazon.awssdk.auth.signer.internal.BaseEventStreamAsyncAws4Signer.EVENT_STREAM_DATE) ArrayList(java.util.ArrayList) Flowable(io.reactivex.Flowable) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Map(java.util.Map) BinaryUtils(software.amazon.awssdk.utils.BinaryUtils) TestSubscriber(io.reactivex.subscribers.TestSubscriber) SdkHttpMethod(software.amazon.awssdk.http.SdkHttpMethod) ZoneOffset(java.time.ZoneOffset) SdkHttpFullRequest(software.amazon.awssdk.http.SdkHttpFullRequest) LinkedList(java.util.LinkedList) Subscriber(org.reactivestreams.Subscriber) Publisher(org.reactivestreams.Publisher) Mockito.times(org.mockito.Mockito.times) EVENT_STREAM_SIGNATURE(software.amazon.awssdk.auth.signer.internal.BaseEventStreamAsyncAws4Signer.EVENT_STREAM_SIGNATURE) Instant(java.time.Instant) Collectors(java.util.stream.Collectors) StandardCharsets(java.nio.charset.StandardCharsets) ZoneId(java.time.ZoneId) Mockito.verify(org.mockito.Mockito.verify) Test(org.junit.jupiter.api.Test) Mockito(org.mockito.Mockito) MessageDecoder(software.amazon.eventstream.MessageDecoder) Mockito.never(org.mockito.Mockito.never) List(java.util.List) OffsetDateTime(java.time.OffsetDateTime) Stream(java.util.stream.Stream) Function(io.reactivex.functions.Function) Lists(org.assertj.core.util.Lists) AsyncRequestBody(software.amazon.awssdk.core.async.AsyncRequestBody) Subscription(org.reactivestreams.Subscription) Clock(java.time.Clock) Queue(java.util.Queue) AwsBasicCredentials(software.amazon.awssdk.auth.credentials.AwsBasicCredentials) HeaderValue(software.amazon.eventstream.HeaderValue) Message(software.amazon.eventstream.Message) ByteBuffer(java.nio.ByteBuffer) SdkHttpFullRequest(software.amazon.awssdk.http.SdkHttpFullRequest) ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList) List(java.util.List) HashMap(java.util.HashMap) Map(java.util.Map)

Example 2 with HeaderValue

use of software.amazon.eventstream.HeaderValue in project aws-sdk-java-v2 by aws.

the class AwsClientHandlerUtils method encodeEventStreamRequestToByteBuffer.

/**
 * Encodes the request into a flow message and then returns bytebuffer from the message.
 *
 * @param request The request to encode
 * @return A bytebuffer representing the given request
 */
public static ByteBuffer encodeEventStreamRequestToByteBuffer(SdkHttpFullRequest request) {
    Map<String, HeaderValue> headers = request.headers().entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, e -> HeaderValue.fromString(firstIfPresent(e.getValue()))));
    byte[] payload = null;
    if (request.contentStreamProvider().isPresent()) {
        try {
            payload = IoUtils.toByteArray(request.contentStreamProvider().get().newStream());
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    }
    return new Message(headers, payload).toByteBuffer();
}
Also used : UncheckedIOException(java.io.UncheckedIOException) SdkProtectedApi(software.amazon.awssdk.annotations.SdkProtectedApi) Map(java.util.Map) IOException(java.io.IOException) SdkHttpFullRequest(software.amazon.awssdk.http.SdkHttpFullRequest) Collectors(java.util.stream.Collectors) ByteBuffer(java.nio.ByteBuffer) IoUtils(software.amazon.awssdk.utils.IoUtils) Message(software.amazon.eventstream.Message) CollectionUtils.firstIfPresent(software.amazon.awssdk.utils.CollectionUtils.firstIfPresent) HeaderValue(software.amazon.eventstream.HeaderValue) HeaderValue(software.amazon.eventstream.HeaderValue) Message(software.amazon.eventstream.Message) UncheckedIOException(java.io.UncheckedIOException) UncheckedIOException(java.io.UncheckedIOException) IOException(java.io.IOException) Map(java.util.Map)

Example 3 with HeaderValue

use of software.amazon.eventstream.HeaderValue in project aws-sdk-java-v2 by aws.

the class EventStreamAsyncResponseTransformerTest method verifyExceptionThrown.

private void verifyExceptionThrown(Map<String, HeaderValue> headers) {
    SdkServiceException exception = SdkServiceException.builder().build();
    Message exceptionMessage = new Message(headers, new byte[0]);
    Flowable<ByteBuffer> bytePublisher = Flowable.just(exceptionMessage.toByteBuffer());
    SubscribingResponseHandler handler = new SubscribingResponseHandler();
    AsyncResponseTransformer<SdkResponse, Void> transformer = EventStreamAsyncResponseTransformer.builder().eventStreamResponseHandler(handler).exceptionResponseHandler((response, executionAttributes) -> exception).executor(Executors.newSingleThreadExecutor()).future(new CompletableFuture<>()).build();
    CompletableFuture<Void> cf = transformer.prepare();
    transformer.onResponse(null);
    transformer.onStream(SdkPublisher.adapt(bytePublisher));
    assertThatThrownBy(() -> {
        try {
            cf.join();
        } catch (CompletionException e) {
            if (e.getCause() instanceof SdkServiceException) {
                throw e.getCause();
            }
        }
    }).isSameAs(exception);
    assertThat(handler.exceptionOccurredCalled).isTrue();
}
Also used : ImmutableMap(software.amazon.awssdk.utils.ImmutableMap) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) CompletionException(java.util.concurrent.CompletionException) Test(org.junit.Test) SdkPublisher(software.amazon.awssdk.core.async.SdkPublisher) ByteBuffer(java.nio.ByteBuffer) Executors(java.util.concurrent.Executors) Message(software.amazon.eventstream.Message) Consumer(java.util.function.Consumer) CountDownLatch(java.util.concurrent.CountDownLatch) AtomicLong(java.util.concurrent.atomic.AtomicLong) Assertions.assertThatThrownBy(org.assertj.core.api.Assertions.assertThatThrownBy) Flowable(io.reactivex.Flowable) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Map(java.util.Map) Subscription(org.reactivestreams.Subscription) SdkResponse(software.amazon.awssdk.core.SdkResponse) AsyncResponseTransformer(software.amazon.awssdk.core.async.AsyncResponseTransformer) SdkServiceException(software.amazon.awssdk.core.exception.SdkServiceException) Subscriber(org.reactivestreams.Subscriber) HeaderValue(software.amazon.eventstream.HeaderValue) CompletableFuture(java.util.concurrent.CompletableFuture) SdkServiceException(software.amazon.awssdk.core.exception.SdkServiceException) Message(software.amazon.eventstream.Message) CompletionException(java.util.concurrent.CompletionException) SdkResponse(software.amazon.awssdk.core.SdkResponse) ByteBuffer(java.nio.ByteBuffer)

Example 4 with HeaderValue

use of software.amazon.eventstream.HeaderValue in project aws-sdk-java-v2 by aws.

the class EventStreamInitialRequestInterceptor method modifyAsyncHttpContent.

@Override
public Optional<AsyncRequestBody> modifyAsyncHttpContent(ModifyHttpRequest context, ExecutionAttributes executionAttributes) {
    if (!Boolean.TRUE.equals(executionAttributes.getAttribute(HAS_INITIAL_REQUEST_EVENT))) {
        return context.asyncRequestBody();
    }
    /*
         * At this point in the request execution, the requestBody contains the serialized initial request,
         * and the asyncRequestBody contains the event stream proper. We will prepend the former to the
         * latter.
         */
    byte[] payload = getInitialRequestPayload(context);
    String contentType = context.httpRequest().headers().get(CONTENT_TYPE).get(0);
    Map<String, HeaderValue> initialRequestEventHeaders = new HashMap<>();
    initialRequestEventHeaders.put(":message-type", HeaderValue.fromString("event"));
    initialRequestEventHeaders.put(":event-type", HeaderValue.fromString("initial-request"));
    initialRequestEventHeaders.put(":content-type", HeaderValue.fromString(contentType));
    ByteBuffer initialRequest = new Message(initialRequestEventHeaders, payload).toByteBuffer();
    Publisher<ByteBuffer> asyncRequestBody = context.asyncRequestBody().orElseThrow(() -> new IllegalStateException("This request is an event streaming request and thus " + "should have an asyncRequestBody"));
    Publisher<ByteBuffer> withInitialRequest = new AsyncStreamPrepender<>(asyncRequestBody, initialRequest);
    return Optional.of(AsyncRequestBody.fromPublisher(withInitialRequest));
}
Also used : HeaderValue(software.amazon.eventstream.HeaderValue) Message(software.amazon.eventstream.Message) HashMap(java.util.HashMap) AsyncStreamPrepender(software.amazon.awssdk.core.internal.async.AsyncStreamPrepender) ByteBuffer(java.nio.ByteBuffer)

Example 5 with HeaderValue

use of software.amazon.eventstream.HeaderValue in project aws-sdk-java-v2 by aws.

the class EventStreamAws4SignerTest method openStreamEventSignaturesCanRollOverBetweenDays.

/**
 * Verify that when an event stream is open from one day to the next, the signature is properly signed for the day of the
 * event.
 */
@Test
public void openStreamEventSignaturesCanRollOverBetweenDays() {
    EventStreamAws4Signer signer = EventStreamAws4Signer.create();
    Region region = Region.US_WEST_2;
    AwsCredentials credentials = AwsBasicCredentials.create("a", "s");
    String signingName = "name";
    AdjustableClock clock = new AdjustableClock();
    clock.time = Instant.parse("2020-01-01T23:59:59Z");
    SdkHttpFullRequest initialRequest = SdkHttpFullRequest.builder().uri(URI.create("http://localhost:8080")).method(SdkHttpMethod.GET).build();
    SdkHttpFullRequest signedRequest = SignerTestUtils.signRequest(signer, initialRequest, credentials, signingName, clock, region.id());
    ByteBuffer event = new Message(Collections.emptyMap(), "foo".getBytes(UTF_8)).toByteBuffer();
    Callable<ByteBuffer> lastEvent = () -> {
        clock.time = Instant.parse("2020-01-02T00:00:00Z");
        return event;
    };
    AsyncRequestBody requestBody = AsyncRequestBody.fromPublisher(Flowable.concatArray(Flowable.just(event), Flowable.fromCallable(lastEvent)));
    AsyncRequestBody signedBody = SignerTestUtils.signAsyncRequest(signer, signedRequest, requestBody, credentials, signingName, clock, region.id());
    List<Message> signedMessages = readMessages(signedBody);
    assertThat(signedMessages.size()).isEqualTo(3);
    Map<String, HeaderValue> firstMessageHeaders = signedMessages.get(0).getHeaders();
    assertThat(firstMessageHeaders.get(":date").getTimestamp()).isEqualTo("2020-01-01T23:59:59Z");
    assertThat(Base64.getEncoder().encodeToString(firstMessageHeaders.get(":chunk-signature").getByteArray())).isEqualTo("EFt7ZU043r/TJE8U+1GxJXscmNxoqmIdGtUIl8wE9u0=");
    Map<String, HeaderValue> lastMessageHeaders = signedMessages.get(2).getHeaders();
    assertThat(lastMessageHeaders.get(":date").getTimestamp()).isEqualTo("2020-01-02T00:00:00Z");
    assertThat(Base64.getEncoder().encodeToString(lastMessageHeaders.get(":chunk-signature").getByteArray())).isEqualTo("UTRGo0D7BQytiVkH1VofR/8f3uFsM4V5QR1A8grr1+M=");
}
Also used : Message(software.amazon.eventstream.Message) AsyncRequestBody(software.amazon.awssdk.core.async.AsyncRequestBody) ByteBuffer(java.nio.ByteBuffer) HeaderValue(software.amazon.eventstream.HeaderValue) SdkHttpFullRequest(software.amazon.awssdk.http.SdkHttpFullRequest) AwsCredentials(software.amazon.awssdk.auth.credentials.AwsCredentials) Region(software.amazon.awssdk.regions.Region) Test(org.junit.jupiter.api.Test)

Aggregations

HeaderValue (software.amazon.eventstream.HeaderValue)7 Message (software.amazon.eventstream.Message)7 ByteBuffer (java.nio.ByteBuffer)6 HashMap (java.util.HashMap)5 Map (java.util.Map)4 SdkHttpFullRequest (software.amazon.awssdk.http.SdkHttpFullRequest)3 Flowable (io.reactivex.Flowable)2 IOException (java.io.IOException)2 UncheckedIOException (java.io.UncheckedIOException)2 StandardCharsets (java.nio.charset.StandardCharsets)2 Instant (java.time.Instant)2 ArrayList (java.util.ArrayList)2 List (java.util.List)2 CompletableFuture (java.util.concurrent.CompletableFuture)2 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)2 Collectors (java.util.stream.Collectors)2 Assertions.assertThat (org.assertj.core.api.Assertions.assertThat)2 Test (org.junit.Test)2 Test (org.junit.jupiter.api.Test)2 Subscriber (org.reactivestreams.Subscriber)2