sas             Fri Jun 27 14:40:55 2003 EDT

  Modified files:              (Branch: PHP_4_3)
    /php-src/sapi/thttpd        thttpd.c 
  Log:
  Serialize headers for systems with low IOV_MAX (e.g. Solaris)
  
Index: php-src/sapi/thttpd/thttpd.c
diff -u php-src/sapi/thttpd/thttpd.c:1.77.2.13 php-src/sapi/thttpd/thttpd.c:1.77.2.14
--- php-src/sapi/thttpd/thttpd.c:1.77.2.13      Wed Jun  4 01:13:41 2003
+++ php-src/sapi/thttpd/thttpd.c        Fri Jun 27 14:40:55 2003
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: thttpd.c,v 1.77.2.13 2003/06/04 05:13:41 sas Exp $ */
+/* $Id: thttpd.c,v 1.77.2.14 2003/06/27 18:40:55 sas Exp $ */
 
 #include "php.h"
 #include "SAPI.h"
@@ -93,22 +93,20 @@
        return sent;
 }
 
-#define ADD_VEC(str,l) vec[n].iov_base=str;len += (vec[n].iov_len=l); n++
-#define ADD_VEC_S(str) ADD_VEC((str), sizeof(str)-1)
-#define COMBINE_HEADERS 30
+#define COMBINE_HEADERS 64
+
+#if defined(IOV_MAX)
+# if IOV_MAX - 64 <= 0
+#  define SERIALIZE_HEADERS
+# endif
+#endif
 
 static int do_writev(struct iovec *vec, int nvec, int len TSRMLS_DC)
 {
        int n;
 
-       /*
-        * XXX: partial writevs are not handled
-        * This can only cause problems, if the user tries to send
-        * huge headers, so I consider this a void issue right now.
-        * The maximum size depends on SO_SNDBUF and is usually
-        * at least 16KB from my experience.
-        */
-       
+       assert(nvec <= IOV_MAX);
+
        if (TG(sbuf).c == 0) {
                n = writev(TG(hc)->conn_fd, vec, nvec);
 
@@ -151,6 +149,18 @@
        return 0;
 }
 
+#ifdef SERIALIZE_HEADERS
+# define ADD_VEC(str,l) smart_str_appendl(&vec_str, (str), (l))
+# define VEC_BASE() smart_str vec_str = {0}
+# define VEC_FREE() smart_str_free(&vec_str)
+#else
+# define ADD_VEC(str,l) vec[n].iov_base=str;len += (vec[n].iov_len=l); n++
+# define VEC_BASE() struct iovec vec[COMBINE_HEADERS]
+# define VEC_FREE() do {} while (0)
+#endif
+
+#define ADD_VEC_S(str) ADD_VEC((str), sizeof(str)-1)
+
 #define CL_TOKEN "Content-length: "
 #define CN_TOKEN "Connection: "
 #define KA_DO "Connection: keep-alive\r\n"
@@ -160,8 +170,7 @@
 static int sapi_thttpd_send_headers(sapi_headers_struct *sapi_headers TSRMLS_DC)
 {
        char buf[1024], *p;
-       struct iovec vec[COMBINE_HEADERS];
-       
+       VEC_BASE();
        int n = 0;
        zend_llist_position pos;
        sapi_header_struct *h;
@@ -197,10 +206,12 @@
                }
 
                ADD_VEC(h->header, h->header_len);
+#ifndef SERIALIZE_HEADERS
                if (n >= COMBINE_HEADERS - 1) {
                        len = do_writev(vec, n, len TSRMLS_CC);
                        n = 0;
                }
+#endif
                ADD_VEC("\r\n", 2);
                
                h = zend_llist_get_next_ex(&sapi_headers->headers, &pos);
@@ -214,8 +225,14 @@
        }
                
        ADD_VEC("\r\n", 2);
-                       
+
+#ifdef SERIALIZE_HEADERS
+       sapi_thttpd_ub_write(vec_str.c, vec_str.len TSRMLS_CC);
+#else                  
        do_writev(vec, n, len TSRMLS_CC);
+#endif
+
+       VEC_FREE();
 
        return SAPI_HEADER_SENT_SUCCESSFULLY;
 }



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to