]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Fix the char-at-a-time problem. To fix this, we just buffer up a line
authorRyan Bloom <rbb@apache.org>
Sun, 8 Oct 2000 19:03:18 +0000 (19:03 +0000)
committerRyan Bloom <rbb@apache.org>
Sun, 8 Oct 2000 19:03:18 +0000 (19:03 +0000)
until we have found a LF, then we send the data up to the previous filter.
I have test on Linux with both Linux's telnet and Win 98 telnet.  Win98
uses a char-at-a-time, so this should solve the problem.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@86457 13f79535-47bb-0310-9956-ffa450edef68

modules/http/http_core.c

index d10aee8980d4a883ce4f490af56f439688d1927d..d4ad73ffc40734614687dd8aa85dca35e20365df 100644 (file)
@@ -3290,8 +3290,13 @@ static apr_status_t chunk_filter(ap_filter_t *f, ap_bucket_brigade *b)
 
 static int core_input_filter(ap_filter_t *f, ap_bucket_brigade *b)
 {
+/* XXX this needs to be moved to a common header file, but this is an ugly
+ * hack just for today.
+ */
+#define ASCII_LF '\012'
     char *buff;
     apr_size_t length = HUGE_STRING_LEN;
+    apr_size_t templen;
     apr_socket_t *csock = NULL;
     apr_status_t rv;
     ap_bucket *e;
@@ -3303,11 +3308,17 @@ static int core_input_filter(ap_filter_t *f, ap_bucket_brigade *b)
     rv = apr_recv(csock, buff, &length);
     if (rv == APR_SUCCESS) {
         if (length > 0) {
+            templen = length - 1;
+            while (buff[templen] != ASCII_LF) {
+                rv = apr_recv(csock, buff + templen + 1, &length);
+                templen += length;
+            }
+                 
             /* This should probably be a pool bucket, but using a transient is 
              * actually okay here too.  We know the pool we are using will always 
              * be available as long as the connection is open.
              */
-            e = ap_bucket_create_transient(buff, length);
+            e = ap_bucket_create_transient(buff, templen + 1);
             AP_BRIGADE_INSERT_TAIL(b, e);
         }
         else {
@@ -3321,7 +3332,7 @@ static int core_input_filter(ap_filter_t *f, ap_bucket_brigade *b)
         /* leave the brigade empty for now; return error code
          * in the future */
     }
-    return length;
+    return templen;
 }
 /* Default filter.  This filter should almost always be used.  Its only job
  * is to send the headers if they haven't already been sent, and then send