--- nginx-1.2.3/src/http/ngx_http_upstream.c	2012-08-06 10:34:08.000000000 -0700
+++ nginx-1.2.3-patched/src/http/ngx_http_upstream.c	2012-09-05 20:57:44.832566031 -0700
@@ -2383,7 +2383,7 @@
 
     if (c->read->timedout) {
         ngx_connection_error(c, NGX_ETIMEDOUT, "upstream timed out");
-        ngx_http_upstream_finalize_request(r, u, 0);
+        ngx_http_upstream_finalize_request(r, u, NGX_HTTP_GATEWAY_TIME_OUT);
         return;
     }
 
@@ -2429,14 +2429,16 @@
 
             if (u->busy_bufs == NULL) {
 
-                if (u->length == 0
-                    || upstream->read->eof
-                    || upstream->read->error)
-                {
+                if (u->length == 0) {
                     ngx_http_upstream_finalize_request(r, u, 0);
                     return;
                 }
 
+                if (upstream->read->eof || upstream->read->error) {
+                    ngx_http_upstream_finalize_request(r, u, NGX_HTTP_BAD_GATEWAY);
+                    return;
+                }
+
                 b->pos = b->start;
                 b->last = b->start;
             }
@@ -3073,6 +3075,13 @@
         && rc != NGX_HTTP_REQUEST_TIME_OUT
         && (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE))
     {
+        if (rc == NGX_ERROR) {
+            r->headers_out.status = NGX_HTTP_INTERNAL_SERVER_ERROR;
+
+        } else {
+            r->headers_out.status = rc;
+        }
+
         rc = 0;
     }