前田です。

At Mon, 5 Jul 1999 22:22:16 +0900,
NAKAMURA, Hiroshi <nakahiro / sarion.co.jp> wrote:
> こちらの環境では,10000bytesのPOSTはOK,20000bytesだと×
> (前述の「req.rb POST 20000」に返事が返ってこない),
> だったんですが,頂いたPatchを当てても状況は変わらないようです.

再現しました(^_^;
やはりwriteでブロックしているのが、原因のようです。

こちらではバッファのサイズを小さくしたらうまく行ったのですが、
このpatchを試していただけないでしょうか?

diff -u -r1.2 mod_ruby.c
--- mod_ruby.c	1999/06/21 07:19:15	1.2
+++ mod_ruby.c	1999/07/06 03:56:50
@@ -540,7 +540,10 @@
 
 static VALUE write_client_block0(struct wcb_arg *arg)
 {
-    char buff[HUGE_STRING_LEN];
+    request_rec *r = arg->r;
+    FILE *fp = arg->fp;
+#define BUFF_LEN 256
+    char buff[BUFF_LEN];
     int len;
 #ifdef SIGPIPE
     void (*handler) (int);
@@ -550,16 +553,17 @@
 #ifdef SIGPIPE
     handler = signal(SIGPIPE, SIG_IGN);
 #endif
-    while ((len = ap_get_client_block(arg->r, buff, HUGE_STRING_LEN)) > 0) {
-	ap_reset_timeout(arg->r);
-	if (fwrite(buff, 1, len, arg->fp) == EOF)
+    while ((len = ap_get_client_block(r, buff, BUFF_LEN)) > 0) {
+	ap_reset_timeout(r);
+	rb_thread_fd_writable(fileno(fp));
+	if (fwrite(buff, 1, len, fp) == EOF)
 	    break;
     }
 #ifdef SIGPIPE
     signal(SIGPIPE, handler);
 #endif
-    ap_kill_timeout(arg->r);
-    fclose(arg->fp);
+    ap_kill_timeout(r);
+    fclose(fp);
     return Qnil;
 }

-- 
前田 修吾