/** * Ensures that the specified {@link RequestLogAvailability} is satisfied. * * @throws RequestLogAvailabilityException if not satisfied yet */ default void ensureAvailability(RequestLogAvailability availability) { if (!isAvailable(availability)) { throw new RequestLogAvailabilityException(availability.name()); } }
private void propagateRequestSideLog(RequestLog child) { child.addListener(log -> startRequest0(log.channel(), log.sessionProtocol(), null, log.requestStartTimeNanos(), log.requestStartTimeMicros(), true), REQUEST_START); child.addListener(log -> serializationFormat(log.serializationFormat()), SCHEME); child.addListener(log -> requestFirstBytesTransferred(log.requestFirstBytesTransferredTimeNanos()), REQUEST_FIRST_BYTES_TRANSFERRED); child.addListener(log -> requestHeaders(log.requestHeaders()), REQUEST_HEADERS); child.addListener(log -> requestContent(log.requestContent(), log.rawRequestContent()), REQUEST_CONTENT); child.addListener(log -> endRequest0(log.requestCause(), log.requestEndTimeNanos()), REQUEST_END); }
/** * Logs a stringified request of {@link RequestLog}. */ public static void logRequest(Logger logger, RequestLog log, LogLevel requestLogLevel, Function<HttpHeaders, HttpHeaders> requestHeadersSanitizer, Function<Object, Object> requestContentSanitizer) { if (requestLogLevel.isEnabled(logger)) { requestLogLevel.log(logger, REQUEST_FORMAT, log.toStringRequestOnly(requestHeadersSanitizer, requestContentSanitizer)); } }
@Override public SessionProtocol sessionProtocol() { ensureAvailability(REQUEST_START); return sessionProtocol; }
@Override public boolean isAvailable(RequestLogAvailability availability) { return isAvailable(availability.getterFlags()); }
private void updateAvailability(RequestLogAvailability a) { updateAvailability(a.setterFlags()); }
private boolean isAvailabilityAlreadyUpdated(RequestLogAvailability availability) { return isAvailable(availability.setterFlags()); }
void logResponseFirstBytesTransferred() { if (!loggedResponseFirstBytesTransferred) { logBuilder.responseFirstBytesTransferred(); loggedResponseFirstBytesTransferred = true; } }
@Override public void requestFirstBytesTransferred(long requestFirstBytesTransferredTimeNanos) { if (isAvailabilityAlreadyUpdated(REQUEST_FIRST_BYTES_TRANSFERRED)) { return; } requestFirstBytesTransferred0(requestFirstBytesTransferredTimeNanos); }
private void startResponse0(long responseStartTimeNanos, long responseStartTimeMicros, boolean updateAvailability) { if (isAvailabilityAlreadyUpdated(RESPONSE_START)) { return; } this.responseStartTimeNanos = responseStartTimeNanos; this.responseStartTimeMicros = responseStartTimeMicros; if (updateAvailability) { updateAvailability(RESPONSE_START); } }
@Override public void deferRequestContent() { if (isAvailabilityAlreadyUpdated(REQUEST_CONTENT)) { return; } requestContentDeferred = true; }
@Override public boolean contains(Object e) { if (!(e instanceof RequestLogAvailability)) { return false; } final int flags = ((RequestLogAvailability) e).getterFlags(); return (this.flags & flags) == flags; }
@Override public Object requestContent() { ensureAvailability(REQUEST_CONTENT); return requestContent; }
@Override public void deferResponseContent() { if (isAvailabilityAlreadyUpdated(RESPONSE_CONTENT)) { return; } responseContentDeferred = true; }
@Override public long totalDurationNanos() { ensureAvailability(COMPLETE); return responseEndTimeNanos - requestStartTimeNanos; }
@Override public SSLSession sslSession() { ensureAvailability(REQUEST_START); return sslSession; }
@Override public long responseFirstBytesTransferredTimeNanos() { ensureAvailability(RESPONSE_FIRST_BYTES_TRANSFERRED); return responseFirstBytesTransferredTimeNanos; }
@Override public HttpHeaders responseHeaders() { ensureAvailability(RESPONSE_HEADERS); return responseHeaders; }
@Override public Object responseContent() { ensureAvailability(RESPONSE_CONTENT); return responseContent; }
@Override public Object rawRequestContent() { ensureAvailability(REQUEST_CONTENT); return rawRequestContent; }