apr_bucket_brigade *bb = ctx->bb;
apr_brigade_cleanup(bb);
+
+ if (f->r->proxyreq == PROXYREQ_RESPONSE) {
+ switch (http_error) {
+ case HTTP_REQUEST_ENTITY_TOO_LARGE:
+ return APR_ENOSPC;
+
+ case HTTP_REQUEST_TIME_OUT:
+ return APR_INCOMPLETE;
+
+ 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);
if (rv != APR_SUCCESS || ctx->remaining < 0) {
ap_log_rerror(APLOG_MARK, APLOG_INFO, rv, f->r, APLOGNO(01589) "Error reading first chunk %s ",
(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 (APR_STATUS_IS_TIMEUP(rv) || ctx->remaining > 0) {
http_error = HTTP_REQUEST_TIME_OUT;
}
+ ctx->remaining = 0; /* Reset it in case we have to
+ * come back here later */
return bail_out_on_error(ctx, f, http_error);
}
return APR_EAGAIN;
}
/* If we get an error, then leave */
+ if (rv == APR_EOF) {
+ return APR_INCOMPLETE;
+ }
if (rv != APR_SUCCESS) {
return rv;
}
if (rv != APR_SUCCESS || ctx->remaining < 0) {
ap_log_rerror(APLOG_MARK, APLOG_INFO, rv, f->r, APLOGNO(01590) "Error reading chunk %s ",
(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 (APR_STATUS_IS_TIMEUP(rv) || ctx->remaining > 0) {
http_error = HTTP_REQUEST_TIME_OUT;
}
+ ctx->remaining = 0; /* Reset it in case we have to
+ * come back here later */
return bail_out_on_error(ctx, f, http_error);
}
rv = ap_get_brigade(f->next, b, mode, block, readbytes);
+ if (rv == APR_EOF && ctx->state != BODY_NONE &&
+ ctx->remaining > 0) {
+ return APR_INCOMPLETE;
+ }
if (rv != APR_SUCCESS) {
return rv;
}
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_INCOMPLETE;
+ }
}
}