use of com.linecorp.armeria.common.HttpResponse in project curiostack by curioswitch.
the class StorageClient method createFile.
/**
* Create a new file for uploading data to cloud storage.
*/
public ListenableFuture<FileWriter> createFile(String filename, Map<String, String> metadata, RequestContext ctx) {
FileRequest request = ImmutableFileRequest.builder().name(filename).metadata(metadata).build();
ByteBuf buf = ctx.alloc().buffer();
try (ByteBufOutputStream os = new ByteBufOutputStream(buf)) {
OBJECT_MAPPER.writeValue((DataOutput) os, request);
} catch (IOException e) {
buf.release();
throw new UncheckedIOException("Could not serialize resource JSON to buffer.", e);
}
HttpData data = new ByteBufHttpData(buf, true);
HttpHeaders headers = HttpHeaders.of(HttpMethod.POST, uploadUrl).contentType(MediaType.JSON_UTF_8);
HttpResponse res = httpClient.execute(headers, data);
return CompletableFuturesExtra.toListenableFuture(res.aggregate(ctx.contextAwareEventLoop()).handle((msg, t) -> {
if (t != null) {
throw new RuntimeException("Unexpected error creating new file.", t);
}
HttpHeaders responseHeaders = msg.headers();
if (!responseHeaders.status().equals(HttpStatus.OK)) {
throw new RuntimeException("Non-successful response when creating new file: " + responseHeaders + "\n" + msg.content().toStringUtf8());
}
String location = responseHeaders.get(HttpHeaderNames.LOCATION);
String pathAndQuery = location.substring("https://www.googleapis.com/upload/storage/v1".length());
return new FileWriter(pathAndQuery, ctx, httpClient);
}));
}
use of com.linecorp.armeria.common.HttpResponse in project zipkin by openzipkin.
the class ScribeInboundHandler method channelRead.
@Override
public void channelRead(ChannelHandlerContext ctx, Object payload) {
assert payload instanceof ByteBuf;
HttpRequest request = HttpRequest.of(THRIFT_HEADERS, HttpData.wrap((ByteBuf) payload));
ServiceRequestContextBuilder requestContextBuilder = ServiceRequestContext.builder(request).service(scribeService).alloc(ctx.alloc());
if (ctx.executor() instanceof EventLoop) {
requestContextBuilder.eventLoop((EventLoop) ctx.executor());
}
ServiceRequestContext requestContext = requestContextBuilder.build();
final HttpResponse response;
try (SafeCloseable unused = requestContext.push()) {
response = HttpResponse.of(scribeService.serve(requestContext, request));
} catch (Throwable t) {
propagateIfFatal(t);
exceptionCaught(ctx, t);
return;
}
int responseIndex = nextResponseIndex++;
response.aggregateWithPooledObjects(ctx.executor(), ctx.alloc()).handle((msg, t) -> {
if (t != null) {
exceptionCaught(ctx, t);
return null;
}
try (HttpData content = msg.content()) {
ByteBuf returned = ctx.alloc().buffer(content.length() + 4);
returned.writeInt(content.length());
returned.writeBytes(content.byteBuf());
if (responseIndex == previouslySentResponseIndex + 1) {
ctx.writeAndFlush(returned);
previouslySentResponseIndex++;
flushResponses(ctx);
} else {
pendingResponses.put(responseIndex, returned);
}
}
return null;
});
}
use of com.linecorp.armeria.common.HttpResponse in project zipkin by openzipkin.
the class HttpCall method sendRequest.
CompletableFuture<AggregatedHttpResponse> sendRequest() {
final HttpResponse response;
try (SafeCloseable ignored = Clients.withContextCustomizer(ctx -> ctx.logBuilder().name(name))) {
HttpRequestWriter httpRequest = HttpRequest.streaming(request.headers());
response = httpClient.execute(httpRequest);
request.writeBody(httpRequest::tryWrite);
httpRequest.close();
}
CompletableFuture<AggregatedHttpResponse> responseFuture = RequestContext.mapCurrent(ctx -> response.aggregateWithPooledObjects(ctx.eventLoop(), ctx.alloc()), // This should never be used in practice since the module runs in an Armeria server.
response::aggregate);
responseFuture = responseFuture.exceptionally(t -> {
if (t instanceof UnprocessedRequestException) {
Throwable cause = t.getCause();
// Go ahead and reduce the output in logs since this is usually a configuration or
// infrastructure issue and the Armeria stack trace won't help debugging that.
Exceptions.clearTrace(cause);
String message = cause.getMessage();
if (message == null)
message = cause.getClass().getSimpleName();
throw new RejectedExecutionException(message, cause);
} else {
Exceptions.throwUnsafely(t);
}
return null;
});
this.responseFuture = responseFuture;
return responseFuture;
}
use of com.linecorp.armeria.common.HttpResponse in project curiostack by curioswitch.
the class ArmeriaSdkHttpClient method execute.
@Override
public CompletableFuture<Void> execute(AsyncExecuteRequest executeRequest) {
SdkHttpRequest httpRequest = executeRequest.request();
SdkAsyncHttpResponseHandler handler = executeRequest.responseHandler();
RequestHeadersBuilder headersBuilder = RequestHeaders.builder(convert(httpRequest.method()), httpRequest.getUri().toString());
executeRequest.requestContentPublisher().contentLength().ifPresent(contentLength -> headersBuilder.add(HttpHeaderNames.CONTENT_LENGTH, contentLength.toString()));
for (Map.Entry<String, List<String>> header : httpRequest.headers().entrySet()) {
headersBuilder.add(header.getKey(), header.getValue());
}
Publisher<HttpData> requestStream = delegate -> executeRequest.requestContentPublisher().subscribe(new SdkToHttpDataSubscriber(delegate));
HttpRequest request = HttpRequest.of(headersBuilder.build(), requestStream);
HttpResponse response = client.execute(request);
response.subscribe(new ResponseSubscriber(handler));
CompletableFuture<Void> completionFuture = response.whenComplete();
completionFuture.whenComplete((unused, t) -> {
if (t != null) {
// Subscriber.onError, SdkAsyncHttpResponseHandler.onError, the returned future, and any
// thrown exception are all ways of communicating errors to the SDK. This seems like two
// too many but cover all the bases just in case.
handler.onError(t);
}
});
return completionFuture;
}
use of com.linecorp.armeria.common.HttpResponse 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();
}
Aggregations