--- modules/http/http_filters.c (revision 1522831) +++ modules/http/http_filters.c (working copy) @@ -85,6 +85,23 @@ apr_bucket_brigade *bb = ctx->bb; apr_brigade_cleanup(bb); + + if (f->r->proxyreq == PROXYREQ_RESPONSE) { + switch (http_error) { + case HTTP_REQUEST_TIME_OUT: + return APR_ECONNABORTED; + + case HTTP_REQUEST_ENTITY_TOO_LARGE: + return APR_ENOSPC; + + case HTTP_NOT_IMPLEMENTED: + return APR_ENOTIMPL; + + default: + return APR_EGENERAL; + } + } + e = ap_bucket_error_create(http_error, NULL, f->r->pool, f->c->bucket_alloc); @@ -388,7 +405,7 @@ (ctx->remaining < 0) ? "(overflow)" : ""); ctx->remaining = 0; /* Reset it in case we have to * come back here later */ - if (APR_STATUS_IS_TIMEUP(rv)) { + if (rv != APR_SUCCESS) { http_error = HTTP_REQUEST_TIME_OUT; } return bail_out_on_error(ctx, f, http_error); @@ -439,6 +456,9 @@ return APR_EAGAIN; } /* If we get an error, then leave */ + if (rv == APR_EOF) { + return APR_ECONNABORTED; + } if (rv != APR_SUCCESS) { return rv; } @@ -494,7 +514,7 @@ (ctx->remaining < 0) ? "(overflow)" : ""); ctx->remaining = 0; /* Reset it in case we have to * come back here later */ - if (APR_STATUS_IS_TIMEUP(rv)) { + if (rv != APR_SUCCESS) { http_error = HTTP_REQUEST_TIME_OUT; } return bail_out_on_error(ctx, f, http_error); @@ -524,6 +544,10 @@ rv = ap_get_brigade(f->next, b, mode, block, readbytes); + if (rv == APR_EOF && ctx->state != BODY_NONE && + ctx->remaining > 0) { + return APR_ECONNABORTED; + } if (rv != APR_SUCCESS) { return rv; } @@ -539,8 +563,10 @@ ctx->remaining -= totalread; if (ctx->remaining > 0) { e = APR_BRIGADE_LAST(b); - if (APR_BUCKET_IS_EOS(e)) - return APR_EOF; + if (APR_BUCKET_IS_EOS(e)) { + apr_bucket_delete(e); + return APR_ECONNABORTED; + } } }