public void process()

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);
    }