@Override public ServiceRequestContext newDerivedContext(Request request) { final DefaultServiceRequestContext ctx = new DefaultServiceRequestContext( cfg, ch, meterRegistry(), sessionProtocol(), pathMappingContext, pathMappingResult, (HttpRequest) request, sslSession(), proxiedAddresses(), clientAddress); final HttpHeaders additionalHeaders = additionalResponseHeaders(); if (!additionalHeaders.isEmpty()) { ctx.setAdditionalResponseHeaders(additionalHeaders); } final HttpHeaders additionalTrailers = additionalResponseTrailers(); if (!additionalTrailers.isEmpty()) { ctx.setAdditionalResponseTrailers(additionalTrailers); } for (final Iterator<Attribute<?>> i = attrs(); i.hasNext();/* noop */) { ctx.addAttr(i.next()); } return ctx; }
@SuppressWarnings("unchecked") private <T> void addAttr(Attribute<?> attribute) { final Attribute<T> a = (Attribute<T>) attribute; attr(a.key()).set(a.get()); }
@Nonnull @Override public <A extends SocketAddress> A localAddress() { final Channel ch = channel(); assert ch != null; @SuppressWarnings("unchecked") final A addr = (A) ch.localAddress(); return addr; }
final Channel ch = channel(); final boolean hasChannel = ch != null; if (hasChannel) { buf.append(ch); final InetAddress remote = ((InetSocketAddress) remoteAddress()).getAddress(); final InetAddress client = clientAddress(); if (remote != null && !remote.equals(client)) { buf.append("[C:").append(client.getHostAddress()).append(']'); .append(sessionProtocol().uriText()) .append("://") .append(virtualHost().defaultHostname()); final InetSocketAddress laddr = localAddress(); if (laddr != null) { buf.append(':').append(laddr.getPort()); buf.append(path()) .append('#') .append(method()) .append(']');
final DefaultServiceRequestContext reqCtx = new DefaultServiceRequestContext( serviceCfg, channel, serviceCfg.server().meterRegistry(), protocol, mappingCtx, mappingResult, req, getSSLSession(channel), proxiedAddresses, clientAddress); try (SafeCloseable ignored = reqCtx.push()) { final RequestLogBuilder logBuilder = reqCtx.logBuilder(); HttpResponse serviceResponse; try { reqCtx.log().addListener(log -> { final HttpStatus status = log.responseHeaders().status(); if (status != null && status.code() >= 200 && status.code() < 400) { final HttpResponseSubscriber resSubscriber = new HttpResponseSubscriber(ctx, responseEncoder, reqCtx, req, accessLogWriter); reqCtx.setRequestTimeoutChangeListener(resSubscriber); res.subscribe(resSubscriber, eventLoop, true);
@Override public void onComplete() { if (!cancelTimeout() && reqCtx.requestTimeoutHandler() == null) { // We have already returned a failed response due to a timeout. return; } if (wroteNothing(state)) { logger.warn("{} Published nothing (or only informational responses): {}", ctx.channel(), service()); responseEncoder.writeReset(req.id(), req.streamId(), Http2Error.INTERNAL_ERROR); return; } if (state != State.DONE) { final HttpHeaders additionalTrailers = reqCtx.additionalResponseTrailers(); if (!additionalTrailers.isEmpty()) { write(additionalTrailers, true); } else { write(HttpData.EMPTY_DATA, true); } } }
@Override public boolean removeAdditionalResponseHeader(AsciiString name) { requireNonNull(name, "name"); return createAdditionalHeadersIfAbsent().remove(name); }
@Override public void addAdditionalResponseTrailers(Headers<? extends AsciiString, ? extends String, ?> headers) { requireNonNull(headers, "headers"); createAdditionalTrailersIfAbsent().add(headers); }
final HttpHeaders additionalHeaders = reqCtx.additionalResponseHeaders(); o = fillAdditionalHeaders(headers, additionalHeaders); " (service: " + service() + ')'); final HttpHeaders additionalTrailers = reqCtx.additionalResponseTrailers(); o = fillAdditionalHeaders(trailingHeaders, additionalTrailers); final HttpHeaders additionalTrailers = reqCtx.additionalResponseTrailers(); if (!additionalTrailers.isEmpty()) { write(o, false);
return new DefaultServiceRequestContext( serviceCfg, fakeChannel(), meterRegistry(), sessionProtocol(), pathMappingCtx, pathMappingResult, request(), sslSession(), proxiedAddresses, clientAddress, requestStartTimeNanos(), requestStartTimeMicros()); } else { return new DefaultServiceRequestContext( serviceCfg, fakeChannel(), meterRegistry(), sessionProtocol(), pathMappingCtx, pathMappingResult, request(), sslSession(), proxiedAddresses, clientAddress);
@Override public void setAdditionalResponseHeader(AsciiString name, String value) { requireNonNull(name, "name"); requireNonNull(value, "value"); createAdditionalHeadersIfAbsent().set(name, value); }
@Override public void addAdditionalResponseTrailer(AsciiString name, String value) { requireNonNull(name, "name"); requireNonNull(value, "value"); createAdditionalTrailersIfAbsent().add(name, value); }
@Override public void addAdditionalResponseHeader(AsciiString name, String value) { requireNonNull(name, "name"); requireNonNull(value, "value"); createAdditionalHeadersIfAbsent().add(name, value); }
@Override public boolean removeAdditionalResponseTrailer(AsciiString name) { requireNonNull(name, "name"); return createAdditionalTrailersIfAbsent().remove(name); }
@Nonnull @Override public <A extends SocketAddress> A remoteAddress() { final Channel ch = channel(); assert ch != null; @SuppressWarnings("unchecked") final A addr = (A) ch.remoteAddress(); return addr; }
@Override public void setAdditionalResponseHeaders(Headers<? extends AsciiString, ? extends String, ?> headers) { requireNonNull(headers, "headers"); createAdditionalHeadersIfAbsent().set(headers); }
@Override public void setAdditionalResponseTrailer(AsciiString name, String value) { requireNonNull(name, "name"); requireNonNull(value, "value"); createAdditionalTrailersIfAbsent().set(name, value); }
@Override public void addAdditionalResponseHeaders(Headers<? extends AsciiString, ? extends String, ?> headers) { requireNonNull(headers, "headers"); createAdditionalHeadersIfAbsent().add(headers); }
@Override public void setAdditionalResponseTrailers(Headers<? extends AsciiString, ? extends String, ?> headers) { requireNonNull(headers, "headers"); createAdditionalTrailersIfAbsent().set(headers); }