private void invoke(ServiceRequestContext ctx, HttpResponseWriter res, ArmeriaHttpTransport transport, HttpChannel httpChannel) { final Queue<HttpData> out = transport.out; try { server.handle(httpChannel); httpChannel.getResponse().getHttpOutput().flush(); final Throwable cause = transport.cause; if (cause != null) { throw cause; } final HttpHeaders headers = toResponseHeaders(transport); if (res.tryWrite(headers)) { for (;;) { final HttpData data = out.poll(); if (data == null || !res.tryWrite(data)) { break; } } } } catch (Throwable t) { logger.warn("{} Failed to produce a response:", ctx, t); } finally { res.close(); } }
final boolean endOfStream = nextOffset == end; if (readBytes > 0) { if (!res.tryWrite(new ByteBufHttpData(buf, endOfStream))) { close(in); return;
private void doClose(Status status, Metadata unusedGrpcMetadata) { checkState(!closeCalled, "call already closed"); closeCalled = true; if (cancelled) { // No need to write anything to client if cancelled already. closeListener(status); return; } final HttpHeaders trailers = statusToTrailers(status, sendHeadersCalled); final HttpObject trailersObj; if (sendHeadersCalled && GrpcSerializationFormats.isGrpcWeb(serializationFormat)) { // Normal trailers are not supported in grpc-web and must be encoded as a message. // Message compression is not supported in grpc-web, so we don't bother using the normal // ArmeriaMessageFramer. trailersObj = serializeTrailersAsMessage(trailers); } else { trailersObj = trailers; } try { if (res.tryWrite(trailersObj)) { res.close(); } } finally { closeListener(status); } }
private void doClose(Status status, Metadata unusedGrpcMetadata) { checkState(!closeCalled, "call already closed"); closeCalled = true; if (cancelled) { // No need to write anything to client if cancelled already. closeListener(status); return; } final HttpHeaders trailers = statusToTrailers(status, sendHeadersCalled); final HttpObject trailersObj; if (sendHeadersCalled && GrpcSerializationFormats.isGrpcWeb(serializationFormat)) { // Normal trailers are not supported in grpc-web and must be encoded as a message. // Message compression is not supported in grpc-web, so we don't bother using the normal // ArmeriaMessageFramer. trailersObj = serializeTrailersAsMessage(trailers); } else { trailersObj = trailers; } try { if (res.tryWrite(trailersObj)) { res.close(); } } finally { closeListener(status); } }