Commit 4f362278 authored by Jim Jagielski's avatar Jim Jagielski
Browse files

More trunk backporting


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/httpd-2.2-proxy@809545 13f79535-47bb-0310-9956-ffa450edef68
parent 6283224c
Loading
Loading
Loading
Loading
+9 −4
Original line number Diff line number Diff line
@@ -534,10 +534,15 @@ static int proxy_balancer_pre_request(proxy_worker **worker,
    if (!*worker) {
        runtime = find_best_worker(*balancer, r);
        if (!runtime) {
            if ((*balancer)->workers->nelts) {
                ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
                             "proxy: BALANCER: (%s). All workers are in error state",
                             (*balancer)->name);

            } else {
                 ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
                              "proxy: BALANCER: (%s). No workers in balancer",
                               (*balancer)->name);
            }
            return HTTP_SERVICE_UNAVAILABLE;
        }
        if ((*balancer)->sticky && runtime) {
+17 −4
Original line number Diff line number Diff line
@@ -201,7 +201,7 @@ static int proxy_connect_handler(request_rec *r, proxy_worker *worker,
            return DECLINED;
        }
        else {
            return HTTP_BAD_GATEWAY;
            return HTTP_SERVICE_UNAVAILABLE;
        }
    }

@@ -270,7 +270,8 @@ static int proxy_connect_handler(request_rec *r, proxy_worker *worker,
    if ((rv = apr_pollset_create(&pollset, 2, r->pool, 0)) != APR_SUCCESS) {
        apr_socket_close(sock);
        ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
            "proxy: CONNECT: error apr_pollset_create()");
            "proxy: CONNECT: error apr_pollset_create();"
            " check system or user limits");
        return HTTP_INTERNAL_SERVER_ERROR;
    }

@@ -280,11 +281,23 @@ static int proxy_connect_handler(request_rec *r, proxy_worker *worker,
    pollfd.reqevents = APR_POLLIN;
    pollfd.desc.s = client_socket;
    pollfd.client_data = NULL;
    apr_pollset_add(pollset, &pollfd);
    rv = apr_pollset_add(pollset, &pollfd);
    if (rv != APR_SUCCESS) {
        ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
                     "proxy: CONNECT: error apr_pollset_add();"
                     " check system or user limits");
        return HTTP_INTERNAL_SERVER_ERROR;
    }

    /* Add the server side to the poll */
    pollfd.desc.s = sock;
    apr_pollset_add(pollset, &pollfd);
    rv = apr_pollset_add(pollset, &pollfd);
    if (rv != APR_SUCCESS) {
        ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
                     "proxy: CONNECT: error apr_pollset_add();"
                     " check system or user limits");
        return HTTP_INTERNAL_SERVER_ERROR;
    }

    while (1) { /* Infinite loop until error (one side closes the connection) */
        if ((rv = apr_pollset_poll(pollset, -1, &pollcnt, &signalled)) != APR_SUCCESS) {
+29 −10
Original line number Diff line number Diff line
@@ -427,10 +427,15 @@ static int stream_reqbody_cl(apr_pool_t *p,
    apr_off_t bytes_streamed = 0;

    if (old_cl_val) {
        char *endstr;
        add_cl(p, bucket_alloc, header_brigade, old_cl_val);
        if (APR_SUCCESS != (status = apr_strtoff(&cl_val, old_cl_val, NULL,
                                                 0))) {
            return HTTP_INTERNAL_SERVER_ERROR;
        status = apr_strtoff(&cl_val, old_cl_val, &endstr, 10);

        if (status || *endstr || endstr == old_cl_val || cl_val < 0) {
            ap_log_rerror(APLOG_MARK, APLOG_ERR, status, r,
                          "proxy: could not parse request Content-Length (%s)",
                          old_cl_val);
            return HTTP_BAD_REQUEST;
        }
    }
    terminate_headers(bucket_alloc, header_brigade);
@@ -463,8 +468,13 @@ static int stream_reqbody_cl(apr_pool_t *p,
         *
         * Prevents HTTP Response Splitting.
         */
        if (bytes_streamed > cl_val)
             continue;
        if (bytes_streamed > cl_val) {
            ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
                          "proxy: read more bytes of request body than expected "
                          "(got %" APR_OFF_T_FMT ", expected %" APR_OFF_T_FMT ")",
                          bytes_streamed, cl_val);
            return HTTP_INTERNAL_SERVER_ERROR;
        }

        if (header_brigade) {
            /* we never sent the header brigade, so go ahead and
@@ -733,6 +743,14 @@ int ap_proxy_http_request(apr_pool_t *p, request_rec *r,
    e = apr_bucket_pool_create(buf, strlen(buf), p, c->bucket_alloc);
    APR_BRIGADE_INSERT_TAIL(header_brigade, e);
    if (conf->preserve_host == 0) {
        if (ap_strchr_c(uri->hostname, ':')) { /* if literal IPv6 address */
            if (uri->port_str && uri->port != DEFAULT_HTTP_PORT) {
                buf = apr_pstrcat(p, "Host: [", uri->hostname, "]:", 
                                  uri->port_str, CRLF, NULL);
            } else {
                buf = apr_pstrcat(p, "Host: [", uri->hostname, "]", CRLF, NULL);
            }
        } else {
            if (uri->port_str && uri->port != DEFAULT_HTTP_PORT) {
                buf = apr_pstrcat(p, "Host: ", uri->hostname, ":", uri->port_str,
                                  CRLF, NULL);
@@ -740,6 +758,7 @@ int ap_proxy_http_request(apr_pool_t *p, request_rec *r,
                buf = apr_pstrcat(p, "Host: ", uri->hostname, CRLF, NULL);
            }
        }
    }
    else {
        /* don't want to use r->hostname, as the incoming header might have a
         * port attached
@@ -947,7 +966,7 @@ int ap_proxy_http_request(apr_pool_t *p, request_rec *r,
     * encoding has been done by the extensions' handler, and
     * do not modify add_te_chunked's logic
     */
    if (old_te_val && strcmp(old_te_val, "chunked") != 0) {
    if (old_te_val && strcasecmp(old_te_val, "chunked") != 0) {
        ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server,
                     "proxy: %s Transfer-Encoding is not supported",
                     old_te_val);
+30 −28
Original line number Diff line number Diff line
@@ -1785,6 +1785,7 @@ PROXY_DECLARE(void) ap_proxy_initialize_worker_share(proxy_server_conf *conf,
              worker->name);
        return;
    }
    if (!worker->s) {
        /* Get scoreboard slot */
        if (ap_scoreboard_image) {
            score = (proxy_worker_stat *) ap_get_scoreboard_lb(worker->id);
@@ -1817,6 +1818,7 @@ PROXY_DECLARE(void) ap_proxy_initialize_worker_share(proxy_server_conf *conf,
                  worker->name);
            return;
        }
    }
    if (worker->route) {
        strcpy(worker->s->route, worker->route);
    }