public void process()

in httpcore5/src/main/java/org/apache/hc/core5/http/protocol/ResponseConnControl.java [70:127]


    public void process(final HttpResponse response, final EntityDetails entity, final HttpContext localContext)
            throws HttpException, IOException {
        Args.notNull(response, "HTTP response");
        Args.notNull(localContext, "HTTP context");

        final HttpCoreContext context = HttpCoreContext.cast(localContext);
        // Always drop connection after certain type of responses
        final int status = response.getCode();
        if (status == HttpStatus.SC_BAD_REQUEST ||
                status == HttpStatus.SC_REQUEST_TIMEOUT ||
                status == HttpStatus.SC_LENGTH_REQUIRED ||
                status == HttpStatus.SC_REQUEST_TOO_LONG ||
                status == HttpStatus.SC_REQUEST_URI_TOO_LONG ||
                status == HttpStatus.SC_SERVICE_UNAVAILABLE ||
                status == HttpStatus.SC_NOT_IMPLEMENTED) {
            response.setHeader(HttpHeaders.CONNECTION, HeaderElements.CLOSE);
            return;
        }
        if (!response.containsHeader(HttpHeaders.CONNECTION)) {
            // Always drop connection for HTTP/1.0 responses and below
            // if the content body cannot be correctly delimited
            final ProtocolVersion ver = context.getProtocolVersion();
            if (entity != null && entity.getContentLength() < 0 && ver.lessEquals(HttpVersion.HTTP_1_0)) {
                response.setHeader(HttpHeaders.CONNECTION, HeaderElements.CLOSE);
            } else {
                final HttpRequest request = context.getRequest();
                boolean closeRequested = false;
                boolean keepAliveRequested = false;
                if (request != null) {
                    final Iterator<HeaderElement> it = MessageSupport.iterate(request, HttpHeaders.CONNECTION);
                    while (it.hasNext()) {
                        final HeaderElement he = it.next();
                        if (he.getName().equalsIgnoreCase(HeaderElements.CLOSE)) {
                            closeRequested = true;
                            break;
                        } else if (he.getName().equalsIgnoreCase(HeaderElements.KEEP_ALIVE)) {
                            keepAliveRequested = true;
                        }
                    }
                }
                if (closeRequested) {
                    response.addHeader(HttpHeaders.CONNECTION, HeaderElements.CLOSE);
                } else {
                    if (response.containsHeader(HttpHeaders.UPGRADE)) {
                        response.addHeader(HttpHeaders.CONNECTION, HeaderElements.UPGRADE);
                    } else {
                        if (keepAliveRequested) {
                            response.addHeader(HttpHeaders.CONNECTION, HeaderElements.KEEP_ALIVE);
                        } else {
                            if (ver.lessEquals(HttpVersion.HTTP_1_0)) {
                                response.addHeader(HttpHeaders.CONNECTION, HeaderElements.CLOSE);
                            }
                        }
                    }
                }
            }
        }
    }