@Override public CompletableFuture<T> prepare() { streamFuture = new CompletableFuture<>(); return streamFuture.thenCompose(baos -> { ByteArrayInputStream content = new ByteArrayInputStream(baos.toByteArray()); // Ignore aborts - we already have all of the content. AbortableInputStream abortableContent = AbortableInputStream.create(content); httpResponse.content(abortableContent); try { return CompletableFuture.completedFuture(responseHandler.handle(crc32Validator .apply(httpResponse.build()), executionAttributes)); } catch (Exception e) { return CompletableFutureUtils.failedFuture(e); } }); }
/** * Transforms an event stream message into a {@link SdkHttpFullResponse} so we can reuse our existing generated unmarshallers. * * @param message Message to transform. */ private SdkHttpFullResponse adaptMessageToResponse(Message message, boolean isException) { Map<String, List<String>> headers = message.getHeaders() .entrySet() .stream() .collect(HashMap::new, (m, e) -> m.put(e.getKey(), singletonList(e.getValue().getString())), Map::putAll); if (requestId != null) { headers.put(X_AMZN_REQUEST_ID_HEADER, singletonList(requestId)); } SdkHttpFullResponse.Builder builder = SdkHttpFullResponse.builder() .content(AbortableInputStream.create(new ByteArrayInputStream(message.getPayload()))) .headers(headers); if (!isException) { builder.statusCode(200); } return builder.build(); }
/** * Creates and initializes an HttpResponse object suitable to be passed to an HTTP response * handler object. * * @return The new, initialized HttpResponse object ready to be passed to an HTTP response handler object. * @throws IOException If there were any problems getting any response information from the * HttpClient method object. */ private SdkHttpFullResponse createResponse(org.apache.http.HttpResponse apacheHttpResponse, HttpRequestBase apacheRequest) throws IOException { return SdkHttpFullResponse.builder() .statusCode(apacheHttpResponse.getStatusLine().getStatusCode()) .statusText(apacheHttpResponse.getStatusLine().getReasonPhrase()) .content(apacheHttpResponse.getEntity() != null ? toAbortableInputStream(apacheHttpResponse, apacheRequest) : null) .headers(transformHeaders(apacheHttpResponse)) .build(); }
@Override protected void channelRead0(ChannelHandlerContext channelContext, HttpObject msg) throws Exception { RequestContext requestContext = channelContext.channel().attr(REQUEST_CONTEXT_KEY).get(); if (msg instanceof HttpResponse) { HttpResponse response = (HttpResponse) msg; SdkHttpResponse sdkResponse = SdkHttpFullResponse.builder() .headers(fromNettyHeaders(response.headers())) .statusCode(response.status().code()) .statusText(response.status().reasonPhrase()) .build(); channelContext.channel().attr(KEEP_ALIVE).set(HttpUtil.isKeepAlive(response)); requestContext.handler().onHeaders(sdkResponse); } CompletableFuture<Void> ef = executeFuture(channelContext); if (msg instanceof StreamedHttpResponse) { requestContext.handler().onStream( new PublisherAdapter((StreamedHttpResponse) msg, channelContext, requestContext, ef)); } else if (msg instanceof FullHttpResponse) { // Be prepared to take care of (ignore) a trailing LastHttpResponse // from the HttpClientCodec if there is one. channelContext.pipeline().replace(HttpStreamsClientHandler.class, channelContext.name() + "-LastHttpContentSwallower", LastHttpContentSwallower.getInstance()); ByteBuf fullContent = ((FullHttpResponse) msg).content(); ByteBuffer bb = copyToByteBuffer(fullContent); fullContent.release(); requestContext.handler().onStream(new FullResponseContentPublisher(channelContext, bb, ef)); finalizeResponse(requestContext, channelContext); } }
@Override protected void channelRead0(ChannelHandlerContext channelContext, HttpObject msg) throws Exception { RequestContext requestContext = channelContext.channel().attr(REQUEST_CONTEXT_KEY).get(); if (msg instanceof HttpResponse) { HttpResponse response = (HttpResponse) msg; SdkHttpResponse sdkResponse = SdkHttpFullResponse.builder() .headers(fromNettyHeaders(response.headers())) .statusCode(response.status().code()) .statusText(response.status().reasonPhrase()) .build(); channelContext.channel().attr(KEEP_ALIVE).set(HttpUtil.isKeepAlive(response)); requestContext.handler().onHeaders(sdkResponse); } CompletableFuture<Void> ef = executeFuture(channelContext); if (msg instanceof StreamedHttpResponse) { requestContext.handler().onStream( new PublisherAdapter((StreamedHttpResponse) msg, channelContext, requestContext, ef)); } else if (msg instanceof FullHttpResponse) { // Be prepared to take care of (ignore) a trailing LastHttpResponse // from the HttpClientCodec if there is one. channelContext.pipeline().replace(HttpStreamsClientHandler.class, channelContext.name() + "-LastHttpContentSwallower", new LastHttpContentSwallower()); ByteBuf fullContent = ((FullHttpResponse) msg).content(); ByteBuffer bb = copyToByteBuffer(fullContent); fullContent.release(); requestContext.handler().onStream(new FullResponseContentPublisher(channelContext, bb, ef)); finalizeResponse(requestContext, channelContext); } }
response = response.toBuilder().content(AbortableInputStream.create(interceptorContext.responseBody().get())).build();
@Override public HttpExecuteResponse call() throws IOException { connection.connect(); request.contentStreamProvider().ifPresent(provider -> invokeSafely(() -> IoUtils.copy(provider.newStream(), connection.getOutputStream()))); int responseCode = connection.getResponseCode(); boolean isErrorResponse = HttpStatusFamily.of(responseCode).isOneOf(CLIENT_ERROR, SERVER_ERROR); InputStream content = !isErrorResponse ? connection.getInputStream() : connection.getErrorStream(); AbortableInputStream responseBody = content != null ? AbortableInputStream.create(content) : null; return HttpExecuteResponse.builder() .response(SdkHttpResponse.builder() .statusCode(responseCode) .statusText(connection.getResponseMessage()) // TODO: Don't ignore abort? .headers(extractHeaders(connection)) .build()) .responseBody(responseBody) .build(); }
/** * Creates and initializes an HttpResponse object suitable to be passed to an HTTP response * handler object. * * @return The new, initialized HttpResponse object ready to be passed to an HTTP response handler object. * @throws IOException If there were any problems getting any response information from the * HttpClient method object. */ private HttpExecuteResponse createResponse(org.apache.http.HttpResponse apacheHttpResponse, HttpRequestBase apacheRequest) throws IOException { SdkHttpResponse response = SdkHttpResponse.builder() .statusCode(apacheHttpResponse.getStatusLine().getStatusCode()) .statusText(apacheHttpResponse.getStatusLine().getReasonPhrase()) .headers(transformHeaders(apacheHttpResponse)) .build(); AbortableInputStream responseBody = apacheHttpResponse.getEntity() != null ? toAbortableInputStream(apacheHttpResponse, apacheRequest) : null; return HttpExecuteResponse.builder().response(response).responseBody(responseBody).build(); }
public static SdkHttpFullResponse validate(boolean calculateCrc32FromCompressedData, SdkHttpFullResponse httpResponse) { if (!httpResponse.content().isPresent()) { return httpResponse; } return httpResponse.toBuilder().content( process(calculateCrc32FromCompressedData, httpResponse, httpResponse.content().get())).build(); }
/** * Returns the response from executing one httpClientSettings request; or null for retry. */ public Pair<SdkHttpFullRequest, SdkHttpFullResponse> execute(SdkHttpFullRequest request, RequestExecutionContext context) throws Exception { InterruptMonitor.checkInterrupted(); HttpExecuteResponse executeResponse = executeHttpRequest(request, context); // TODO: Plumb through ExecuteResponse instead SdkHttpFullResponse httpResponse = (SdkHttpFullResponse) executeResponse.httpResponse(); return Pair.of(request, httpResponse.toBuilder().content(executeResponse.responseBody().orElse(null)).build()); }
private static SdkHttpFullResponse toFullResponse(SdkHttpResponse response) { SdkHttpFullResponse.Builder builder = SdkHttpFullResponse.builder() .statusCode(response.statusCode()) .headers(response.headers()); response.statusText().ifPresent(builder::statusText); return builder.build(); } }
private HttpExecuteResponse successResponse(String protocol) { return HttpExecuteResponse.builder() .response(SdkHttpResponse.builder() .statusCode(200) .build()) .responseBody(generateContent(protocol)) .build(); }
private HttpExecuteResponse errorResponse(String protocol) { return HttpExecuteResponse.builder() .response(SdkHttpResponse.builder() .statusCode(500) .build()) .responseBody(generateContent(protocol)) .build(); }
private SdkHttpFullResponse fullResponse(TestItemUnmarshalling item) { AbortableInputStream abortableInputStream = AbortableInputStream.create(new ByteArrayInputStream(item.utf8())); return SdkHttpFullResponse.builder() .statusCode(200) .content(abortableInputStream) .build(); }