diff -ur apache_1.3.23/src/include/httpd.h apache_1.3.23_recvtimeout/src/include/httpd.h
--- apache_1.3.23/src/include/httpd.h	Mon Jan 21 14:25:02 2002
+++ apache_1.3.23_recvtimeout/src/include/httpd.h	Sat Jan 26 15:57:00 2002
@@ -264,11 +264,16 @@
 #define MAX_STRING_LEN HUGE_STRING_LEN
 #define HUGE_STRING_LEN 8192
 
-/* The timeout for waiting for messages */
+/* The timeout for waiting for messages sent */
 #ifndef DEFAULT_TIMEOUT
 #define DEFAULT_TIMEOUT 300
 #endif
 
+/* The timeout for waiting for messages received */
+#ifndef DEFAULT_RECV_TIMEOUT
+#define DEFAULT_RECV_TIMEOUT 5
+#endif
+
 /* The timeout for waiting for keepalive timeout until next request */
 #ifndef DEFAULT_KEEPALIVE_TIMEOUT
 #define DEFAULT_KEEPALIVE_TIMEOUT 15
@@ -957,7 +962,7 @@
     /* Transaction handling */
 
     server_addr_rec *addrs;
-    int timeout;		/* Timeout, in seconds, before we give up */
+    int timeout;		/* Timeout, in seconds, before we give up (general)*/
     int keep_alive_timeout;	/* Seconds we'll wait for another request */
     int keep_alive_max;		/* Maximum requests per connection */
     int keep_alive;		/* Use persistent connections? */
@@ -975,6 +980,7 @@
     int limit_req_line;      /* limit on size of the HTTP request line    */
     int limit_req_fieldsize; /* limit on size of any request header field */
     int limit_req_fields;    /* limit on number of request header fields  */
+    int recv_timeout;		/* Timeout, in seconds, before we give up on receives */
 };
 
 /* These are more like real hosts than virtual hosts */
diff -ur apache_1.3.23/src/main/http_config.c apache_1.3.23_recvtimeout/src/main/http_config.c
--- apache_1.3.23/src/main/http_config.c	Sun Jan 20 15:14:37 2002
+++ apache_1.3.23_recvtimeout/src/main/http_config.c	Sat Jan 26 14:17:26 2002
@@ -1417,6 +1417,7 @@
     s->srm_confname = NULL;
     s->access_confname = NULL;
     s->timeout = 0;
+    s->recv_timeout = 0;
     s->keep_alive_timeout = 0;
     s->keep_alive = -1;
     s->keep_alive_max = -1;
@@ -1470,6 +1471,9 @@
 	if (virt->timeout == 0)
 	    virt->timeout = main_server->timeout;
 
+	if (virt->recv_timeout == 0)
+	    virt->recv_timeout = main_server->recv_timeout;
+
 	if (virt->keep_alive_timeout == 0)
 	    virt->keep_alive_timeout = main_server->keep_alive_timeout;
 
@@ -1537,6 +1541,7 @@
     s->limit_req_fieldsize = DEFAULT_LIMIT_REQUEST_FIELDSIZE;
     s->limit_req_fields = DEFAULT_LIMIT_REQUEST_FIELDS;
     s->timeout = DEFAULT_TIMEOUT;
+    s->recv_timeout = DEFAULT_RECV_TIMEOUT;
     s->keep_alive_timeout = DEFAULT_KEEPALIVE_TIMEOUT;
     s->keep_alive_max = DEFAULT_KEEPALIVE;
     s->keep_alive = 1;
diff -ur apache_1.3.23/src/main/http_core.c apache_1.3.23_recvtimeout/src/main/http_core.c
--- apache_1.3.23/src/main/http_core.c	Wed Jan 16 16:34:32 2002
+++ apache_1.3.23_recvtimeout/src/main/http_core.c	Sat Jan 26 14:17:26 2002
@@ -2165,6 +2165,17 @@
     return NULL;
 }
 
+static const char *set_recv_timeout(cmd_parms *cmd, void *dummy, char *arg)
+{
+    const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
+    if (err != NULL) {
+        return err;
+    }
+
+    cmd->server->recv_timeout = atoi(arg);
+    return NULL;
+}
+
 static const char *set_keep_alive_timeout(cmd_parms *cmd, void *dummy,
 					  char *arg)
 {
@@ -3274,6 +3285,7 @@
 { "ServerPath", set_serverpath, NULL, RSRC_CONF, TAKE1,
   "The pathname the server can be reached at" },
 { "Timeout", set_timeout, NULL, RSRC_CONF, TAKE1, "Timeout duration (sec)" },
+{ "RecvTimeout", set_recv_timeout, NULL, RSRC_CONF, TAKE1, "Timeout duration for receiving requests (sec)" },
 { "KeepAliveTimeout", set_keep_alive_timeout, NULL, RSRC_CONF, TAKE1,
   "Keep-Alive timeout duration (sec)"},
 { "MaxKeepAliveRequests", set_keep_alive_max, NULL, RSRC_CONF, TAKE1,
diff -ur apache_1.3.23/src/main/http_main.c apache_1.3.23_recvtimeout/src/main/http_main.c
--- apache_1.3.23/src/main/http_main.c	Sun Jan 20 17:45:14 2002
+++ apache_1.3.23_recvtimeout/src/main/http_main.c	Sat Jan 26 14:17:26 2002
@@ -1686,7 +1686,7 @@
     if (r->connection->keptalive)
 	to = r->server->keep_alive_timeout;
     else
-	to = r->server->timeout;
+	to = r->server->recv_timeout;
     ap_set_callback_and_alarm(timeout, to);
 }
 
@@ -1707,6 +1707,25 @@
 #endif
     timeout_name = name;
     ap_set_callback_and_alarm(timeout, r->server->timeout);
+}
+
+API_EXPORT(void) ap_hard_recv_timeout(char *name, request_rec *r)
+{
+#ifdef NETWARE
+    get_tsd
+#endif
+    timeout_req = r;
+    timeout_name = name;
+    ap_set_callback_and_alarm(timeout, r->server->recv_timeout);
+}
+
+API_EXPORT(void) ap_soft_recv_timeout(char *name, request_rec *r)
+{
+#ifdef NETWARE
+    get_tsd
+#endif
+    timeout_name = name;
+    ap_set_callback_and_alarm(timeout, r->server->recv_timeout);
 }
 
 API_EXPORT(void) ap_kill_timeout(request_rec *dummy)
diff -ur apache_1.3.23/src/main/http_protocol.c apache_1.3.23_recvtimeout/src/main/http_protocol.c
--- apache_1.3.23/src/main/http_protocol.c	Mon Jan 21 16:56:43 2002
+++ apache_1.3.23_recvtimeout/src/main/http_protocol.c	Sat Jan 26 14:17:26 2002
@@ -1172,7 +1172,7 @@
         return NULL;
     }
     if (!r->assbackwards) {
-        ap_hard_timeout("read request headers", r);
+        ap_hard_recv_timeout("read request headers", r);
         get_mime_headers(r);
         ap_kill_timeout(r);
         if (r->status != HTTP_REQUEST_TIME_OUT) {
@@ -2232,7 +2232,7 @@
             r->connection->keepalive = -1;
             return OK;
         }
-        ap_hard_timeout("reading request body", r);
+        ap_hard_recv_timeout("reading request body", r);
         while ((rv = ap_get_client_block(r, dumpbuf, HUGE_STRING_LEN)) > 0)
             continue;
         ap_kill_timeout(r);
diff -ur apache_1.3.23/src/modules/proxy/proxy_http.c apache_1.3.23_recvtimeout/src/modules/proxy/proxy_http.c
--- apache_1.3.23/src/modules/proxy/proxy_http.c	Sun Jan 20 15:14:37 2002
+++ apache_1.3.23_recvtimeout/src/modules/proxy/proxy_http.c	Sat Jan 26 14:24:50 2002
@@ -386,7 +386,7 @@
 
     /* Right - now it's time to listen for a response.
      */
-    ap_hard_timeout("proxy receive", r);
+    ap_hard_recv_timeout("proxy receive", r);
 
     len = ap_bgets(buffer, sizeof buffer - 1, f);
     if (len == -1) {
diff -ur apache_1.3.23/src/modules/standard/mod_info.c apache_1.3.23_recvtimeout/src/modules/standard/mod_info.c
--- apache_1.3.23/src/modules/standard/mod_info.c	Fri Mar  9 05:10:34 2001
+++ apache_1.3.23_recvtimeout/src/modules/standard/mod_info.c	Sat Jan 26 14:17:26 2002
@@ -511,8 +511,9 @@
                         ap_excess_requests_per_child);
             ap_rprintf(r, "<strong>Timeouts:</strong> "
                         "<tt>connection: %d &nbsp;&nbsp; "
+                        "recv: %d &nbsp;&nbsp; "
                         "keep-alive: %d</tt><br>",
-                        serv->timeout, serv->keep_alive_timeout);
+                        serv->timeout, serv->recv_timeout, serv->keep_alive_timeout);
             ap_rprintf(r, "<strong>Server Root:</strong> "
                         "<tt>%s</tt><br>\n", ap_server_root);
             ap_rprintf(r, "<strong>Config File:</strong> "
