use of ratpack.exec.Downstream in project ratpack by ratpack.
the class RequestBody method read.
@Override
public Promise<ByteBuf> read(long maxContentLength, Block onTooLarge) {
return Promise.<ByteBuf>async(downstream -> {
if (read) {
downstream.error(new RequestBodyAlreadyReadException());
return;
}
read = true;
this.onTooLarge = onTooLarge;
if (advertisedLength > maxContentLength || length > maxContentLength) {
tooLarge(downstream);
} else if (done) {
complete(downstream);
} else {
this.maxContentLength = maxContentLength;
this.downstream = downstream;
if (HttpUtil.is100ContinueExpected(request)) {
HttpResponse continueResponse = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.CONTINUE, Unpooled.EMPTY_BUFFER);
ctx.writeAndFlush(continueResponse).addListener(future -> {
if (!future.isSuccess()) {
ctx.fireExceptionCaught(future.cause());
}
});
}
ctx.read();
}
});
}
use of ratpack.exec.Downstream in project ratpack by ratpack.
the class BlockingHttpClient method request.
public ReceivedResponse request(HttpClient httpClient, URI uri, ExecController execController, Duration timeout, Action<? super RequestSpec> action) throws Throwable {
CountDownLatch latch = new CountDownLatch(1);
AtomicReference<ExecResult<ReceivedResponse>> result = new AtomicReference<>();
execController.fork().start(e -> httpClient.request(uri, action.prepend(s -> s.readTimeout(Duration.ofHours(1)))).map(response -> {
TypedData responseBody = response.getBody();
ByteBuf responseBuffer = responseBody.getBuffer();
ByteBuf heapResponseBodyBuffer = unreleasableBuffer(responseBuffer.isDirect() ? TestByteBufAllocators.LEAKING_UNPOOLED_HEAP.heapBuffer(responseBuffer.readableBytes()).writeBytes(responseBuffer) : responseBuffer.retain());
return new DefaultReceivedResponse(response.getStatus(), response.getHeaders(), new ByteBufBackedTypedData(heapResponseBodyBuffer, responseBody.getContentType()));
}).connect(new Downstream<ReceivedResponse>() {
@Override
public void success(ReceivedResponse value) {
result.set(ExecResult.of(Result.success(value)));
latch.countDown();
}
@Override
public void error(Throwable throwable) {
result.set(ExecResult.of(Result.error(throwable)));
latch.countDown();
}
@Override
public void complete() {
result.set(ExecResult.complete());
latch.countDown();
}
}));
try {
if (!latch.await(timeout.toNanos(), TimeUnit.NANOSECONDS)) {
TemporalUnit unit = timeout.getUnits().get(0);
throw new IllegalStateException("Request to " + uri + " took more than " + timeout.get(unit) + " " + unit.toString() + " to complete");
}
} catch (InterruptedException e) {
throw Exceptions.uncheck(e);
}
return result.get().getValueOrThrow();
}
Aggregations