.build(); ctx.logBuilder().requestFirstBytesTransferred(); ctx.logBuilder().requestContent(rpcReq, req); ctx.logBuilder().endRequest(); ctx.logBuilder().responseHeaders(HttpHeaders.of(HttpStatus.OK)); ctx.logBuilder().responseFirstBytesTransferred(); ctx.logBuilder().responseContent(rpcRes, res); ctx.logBuilder().endResponse();
@Override public <I, O> ClientCall<I, O> newCall( MethodDescriptor<I, O> method, CallOptions callOptions) { final HttpRequestWriter req = HttpRequest.streaming( HttpHeaders.of(HttpMethod.POST, uri().getPath() + method.getFullMethodName()) .contentType(serializationFormat.mediaType())); final ClientRequestContext ctx = newContext(HttpMethod.POST, req); ctx.logBuilder().serializationFormat(serializationFormat); ctx.logBuilder().deferRequestContent(); ctx.logBuilder().deferResponseContent(); return new ArmeriaClientCall<>( ctx, httpClient, req, method, options().getOrElse(GrpcClientOptions.MAX_OUTBOUND_MESSAGE_SIZE_BYTES, ArmeriaMessageFramer.NO_MAX_OUTBOUND_MESSAGE_SIZE), options().getOrElse( GrpcClientOptions.MAX_INBOUND_MESSAGE_SIZE_BYTES, options().getOrElse( ClientOption.DEFAULT_MAX_RESPONSE_LENGTH, (long) DEFAULT_MAX_INBOUND_MESSAGE_SIZE).intValue()), callOptions, CompressorRegistry.getDefaultInstance(), DecompressorRegistry.getDefaultInstance(), serializationFormat, jsonMarshaller, options().getOrElse(GrpcClientOptions.UNSAFE_WRAP_RESPONSE_BUFFERS, false), advertisedEncodingsHeader); }
private void fail(Throwable cause) { state = State.DONE; logBuilder.endRequest(cause); logBuilder.endResponse(cause); cancelSubscription(); }
@Override public boolean tryWrite(HttpObject o) { if (o instanceof HttpHeaders) { // NB: It's safe to call logBuilder.start() multiple times. logBuilder.startResponse(); final HttpHeaders headers = (HttpHeaders) o; final HttpStatus status = headers.status(); if (status != null && status.codeClass() != HttpStatusClass.INFORMATIONAL) { logBuilder.responseHeaders(headers); } } else if (o instanceof HttpData) { logBuilder.increaseResponseLength(((HttpData) o).length()); } return delegate.tryWrite(o); }
private boolean handleEarlyCancellation(ClientRequestContext ctx, HttpRequest req, DecodedHttpResponse res) { if (res.isOpen()) { return false; } // The response has been closed even before its request is sent. assert protocol != null; req.abort(); ctx.logBuilder().startRequest(channel, protocol); ctx.logBuilder().requestHeaders(req.headers()); req.completionFuture().handle((unused, cause) -> { if (cause == null) { ctx.logBuilder().endRequest(); } else { ctx.logBuilder().endRequest(cause); } return null; }); res.completionFuture().handle((unused, cause) -> { if (cause == null) { ctx.logBuilder().endResponse(); } else { ctx.logBuilder().endResponse(cause); } return null; }); return true; }
try (SafeCloseable ignored = ctx.push()) { final RequestLogBuilder log = ctx.logBuilder(); log.serializationFormat(ThriftSerializationFormats.BINARY); log.requestLength(64); log.requestHeaders(HttpHeaders.of(HttpHeaderNames.USER_AGENT, "some-client")); log.requestContent(RPC_REQ, THRIFT_CALL); log.endRequest(); log.responseLength(128); log.responseHeaders(HttpHeaders.of(200).set(HttpHeaderNames.DATE, "some-date")); log.responseContent(RPC_RES, THRIFT_REPLY); log.endResponse();
final DefaultRpcResponse reply = new DefaultRpcResponse(); ctx.logBuilder().serializationFormat(serializationFormat); tProtocol.writeMessageEnd(); ctx.logBuilder().requestContent(call, new ThriftCall(header, tArgs)); HttpData.of(outTransport.getArray(), 0, outTransport.length())); ctx.logBuilder().deferResponseContent();
private static void handleSuccess(ClientRequestContext ctx, DefaultRpcResponse reply, @Nullable Object returnValue, @Nullable ThriftReply rawResponseContent) { reply.complete(returnValue); ctx.logBuilder().responseContent(reply, rawResponseContent); }
@Override public void endOfStream() { setClientStreamClosed(); if (!closeCalled) { if (!ctx.log().isAvailable(RequestLogAvailability.REQUEST_CONTENT)) { ctx.logBuilder().requestContent(GrpcLogUtil.rpcRequest(method), null); } if (useBlockingTaskExecutor) { ctx.blockingTaskExecutor().execute(this::invokeHalfClose); } else { invokeHalfClose(); } } }
ctx.logBuilder().serializationFormat(serializationFormat); ctx.logBuilder().deferRequestContent(); req.aggregateWithPooledObjects(ctx.eventLoop(), ctx.alloc()).handle((aReq, cause) -> { if (cause != null) {
if (!logBuilder.isRequestContentDeferred()) { logBuilder.requestContent(null, null); logBuilder.serializationFormat(SerializationFormat.NONE);
ctx.logBuilder().deferRequestContent(); ctx.logBuilder().deferResponseContent();
/** * Returns a new {@link ClientRequestContext} created with the properties of this builder. */ public ClientRequestContext build() { final Endpoint endpoint; if (this.endpoint != null) { endpoint = this.endpoint; } else { endpoint = Endpoint.parse(authority()); } final DefaultClientRequestContext ctx = new DefaultClientRequestContext( eventLoop(), meterRegistry(), sessionProtocol(), endpoint, method(), path(), query(), fragment, options, request()); if (isRequestStartTimeSet()) { ctx.logBuilder().startRequest(fakeChannel(), sessionProtocol(), sslSession(), requestStartTimeNanos(), requestStartTimeMicros()); } else { ctx.logBuilder().startRequest(fakeChannel(), sessionProtocol(), sslSession()); } if (request() instanceof HttpRequest) { ctx.logBuilder().requestHeaders(((HttpRequest) request()).headers()); } else { ctx.logBuilder().requestContent(request(), null); } return ctx; } }
logBuilder.startResponse(); assert responseEncoder != null; final HttpHeaders mutableHeaders = res.headers().toMutable(); logBuilder.responseHeaders(mutableHeaders); if (!contentAndTrailingHeadersEmpty) { future = responseEncoder.writeData( req.id(), req.streamId(), content, trailingHeadersEmpty); logBuilder.increaseResponseLength(content.length()); if (!trailingHeadersEmpty) { future = responseEncoder.writeHeaders( logBuilder.endResponse(); } else { logBuilder.endResponse(firstNonNull(cause, f.cause()));
wroteEmptyData = data.isEmpty(); future = responseEncoder.writeData(req.id(), req.streamId(), data, endOfStream); logBuilder().increaseResponseLength(data.length()); } else if (o instanceof HttpHeaders) { wroteEmptyData = false; logBuilder().responseFirstBytesTransferred(); loggedResponseHeadersFirstBytesTransferred = true; logBuilder().endResponse(); reqCtx.log().addListener(accessLogWriter::log, RequestLogAvailability.COMPLETE); logBuilder().endResponse(f.cause()); subscription.cancel(); reqCtx.log().addListener(accessLogWriter::log, RequestLogAvailability.COMPLETE);
private void cancelAction(@Nullable Throwable cause) { logBuilder.endResponse(); }
private void write0(HttpObject o, boolean endOfStream, boolean flush) { final ChannelFuture future; if (o instanceof HttpData) { final HttpData data = (HttpData) o; future = encoder.writeData(id, streamId(), data, endOfStream); logBuilder.increaseRequestLength(data.length()); } else if (o instanceof HttpHeaders) { future = encoder.writeHeaders(id, streamId(), (HttpHeaders) o, endOfStream); } else { // Should never reach here because we did validation in onNext(). throw new Error(); } if (endOfStream) { logBuilder.endRequest(); } future.addListener(this); if (flush) { ch.flush(); } }
private void failAndRespond(Throwable cause, AggregatedHttpMessage message, Http2Error error) { final HttpHeaders headers = message.headers(); final HttpData content = message.content(); logBuilder().responseHeaders(headers); logBuilder().increaseResponseLength(content.length()); final State oldState = setDone(); subscription.cancel(); final int id = req.id(); final int streamId = req.streamId(); final ChannelFuture future; if (wroteNothing(oldState)) { // Did not write anything yet; we can send an error response instead of resetting the stream. if (content.isEmpty()) { future = responseEncoder.writeHeaders(id, streamId, headers, true); } else { responseEncoder.writeHeaders(id, streamId, headers, false); future = responseEncoder.writeData(id, streamId, content, true); } } else { // Wrote something already; we have to reset/cancel the stream. future = responseEncoder.writeReset(id, streamId, error); } addCallbackAndFlush(cause, oldState, future); }
switch (state) { case NEEDS_HEADERS: { logBuilder().startResponse(); if (!(o instanceof HttpHeaders)) { throw newIllegalStateException( o = fillAdditionalHeaders(headers, additionalHeaders); logBuilder().responseHeaders(headers);
try (SafeCloseable ignored = ctx.push()) { final RequestLogBuilder log = ctx.logBuilder(); log.serializationFormat(ThriftSerializationFormats.BINARY); log.requestLength(64); log.requestHeaders(HttpHeaders.of(HttpHeaderNames.USER_AGENT, "some-client")); log.requestContent(RPC_REQ, THRIFT_CALL); log.endRequest(); log.responseLength(128); log.responseHeaders(HttpHeaders.of(200).set(HttpHeaderNames.DATE, "some-date")); log.responseContent(RPC_RES, THRIFT_REPLY); log.endResponse();