use of ratpack.exec.Promise 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.Promise in project ratpack by ratpack.
the class FlatMapPublisher method subscribe.
@Override
public void subscribe(final Subscriber<? super O> outSubscriber) {
input.subscribe(new Subscriber<I>() {
private Subscription subscription;
private final AtomicBoolean done = new AtomicBoolean();
@Override
public void onSubscribe(Subscription subscription) {
this.subscription = new Subscription() {
@Override
public void request(long n) {
subscription.request(n);
}
@Override
public void cancel() {
subscription.cancel();
}
};
outSubscriber.onSubscribe(this.subscription);
}
@Override
public void onNext(I in) {
if (done.get()) {
return;
}
Promise<? extends O> out;
try {
out = function.apply(in);
} catch (Throwable throwable) {
subscription.cancel();
innerOnError(throwable);
return;
}
out.onError(e -> {
subscription.cancel();
innerOnError(e);
}).then(v -> {
if (!done.get()) {
outSubscriber.onNext(v);
}
});
}
@Override
public void onError(Throwable t) {
Promise.value(t).then(this::innerOnError);
}
public void innerOnError(Throwable t) {
if (done.compareAndSet(false, true)) {
outSubscriber.onError(t);
}
}
@Override
public void onComplete() {
Operation.noop().then(() -> {
if (done.compareAndSet(false, true)) {
outSubscriber.onComplete();
}
});
}
});
}
use of ratpack.exec.Promise in project ratpack by ratpack.
the class DefaultRequestFixture method invoke.
private HandlingResult invoke(Handler handler, Registry registry, DefaultHandlingResult.ResultsHolder results) throws HandlerTimeoutException {
ServerConfig serverConfig = registry.get(ServerConfig.class);
DefaultRequest request = new DefaultRequest(Instant.now(), requestHeaders, HttpMethod.valueOf(method.toUpperCase()), HttpVersion.valueOf(protocol), uri, new InetSocketAddress(remoteHostAndPort.getHostText(), remoteHostAndPort.getPort()), new InetSocketAddress(localHostAndPort.getHostText(), localHostAndPort.getPort()), serverConfig, new RequestBodyReader() {
@Override
public long getContentLength() {
return requestBody.readableBytes();
}
@Override
public Promise<? extends ByteBuf> read(long maxContentLength, Block onTooLarge) {
return Promise.value(requestBody).route(r -> r.readableBytes() > maxContentLength, onTooLarge.action());
}
@Override
public TransformablePublisher<? extends ByteBuf> readStream(long maxContentLength) {
return Streams.<ByteBuf>yield(r -> {
if (r.getRequestNum() > 0) {
return null;
} else {
return requestBody;
}
});
}
});
if (pathBinding != null) {
handler = Handlers.chain(ctx -> {
ctx.getExecution().get(PathBindingStorage.TYPE).push(pathBinding);
ctx.next();
}, handler);
}
try {
return new DefaultHandlingResult(request, results, responseHeaders, registry, timeout, handler);
} catch (Exception e) {
throw Exceptions.uncheck(e);
} finally {
registry.get(ExecController.class).close();
}
}
Aggregations