in httpcore5/src/main/java/org/apache/hc/core5/http/protocol/ForwardedRequest.java [114:184]
public void process(final HttpRequest request, final EntityDetails entity, final HttpContext localContext) throws HttpException, IOException {
Args.notNull(request, "HTTP request");
Args.notNull(localContext, "HTTP context");
final HttpCoreContext context = HttpCoreContext.cast(localContext);
final ProtocolVersion ver = context.getProtocolVersion() != null ? context.getProtocolVersion() : HttpVersion.HTTP_1_1;
final URIAuthority authority = request.getAuthority();
if (authority == null) {
throw new ProtocolException("Request authority not specified");
}
final int port = authority.getPort();
final StringBuilder valueBuilder = new StringBuilder();
final Header forwardedHeader = request.getFirstHeader(FORWARDED_HEADER_NAME);
final boolean forwardedHeaderExists = forwardedHeader != null;
if (forwardedHeaderExists) {
// Forwarded header already exists, add current hop details to the end of the existing value
valueBuilder.append(forwardedHeader.getValue());
valueBuilder.append(", ");
}
// Add the current hop details
final EndpointDetails endpointDetails = context.getEndpointDetails();
// Add the "by" parameter
if (endpointDetails != null) {
final SocketAddress remoteAddress = endpointDetails.getRemoteAddress();
if (remoteAddress instanceof InetSocketAddress) {
final InetSocketAddress inetAddress = (InetSocketAddress) remoteAddress;
final String byValue = inetAddress.getHostString() + ":" + inetAddress.getPort();
if (inetAddress.getAddress() instanceof Inet6Address) {
valueBuilder.append("by=\"").append(byValue).append("\"");
} else {
valueBuilder.append("by=").append(byValue);
}
}
// Add the "for" parameter
final SocketAddress localAddress = endpointDetails.getLocalAddress();
if (localAddress instanceof InetSocketAddress) {
final InetSocketAddress inetAddress = (InetSocketAddress) localAddress;
final String forValue = inetAddress.getHostString() + ":" + inetAddress.getPort();
if (inetAddress.getAddress() instanceof Inet6Address) {
valueBuilder.append(";for=\"").append(forValue).append("\"");
} else {
valueBuilder.append(";for=").append(forValue);
}
}
}
// Add the "host" parameter
if (valueBuilder.length() > 0 && !forwardedHeaderExists) {
valueBuilder.append(";");
}
valueBuilder.append("host=\"").append(authority.getHostName()).append("\"");
// Add the "port" parameter
if (port != -1) {
valueBuilder.append(";port=").append(port);
}
// Add the "proto" parameter
final String protoValue = ver.getProtocol();
if (protoValue != null) {
valueBuilder.append(";proto=").append(protoValue);
}
final String value = valueBuilder.toString();
request.setHeader(FORWARDED_HEADER_NAME, value);
}