]> granicus.if.org Git - php/commitdiff
Improve robustness of sending routines
authorAlex Waugh <alexwaugh@php.net>
Sun, 26 Nov 2006 19:50:30 +0000 (19:50 +0000)
committerAlex Waugh <alexwaugh@php.net>
Sun, 26 Nov 2006 19:50:30 +0000 (19:50 +0000)
sapi/webjames/webjames.c

index 3068d8fcccbe649911fa8f9d14d5835b4c9620d8..5a6533ff5f2a4dfbde9bda0effe99e9c5d5b0a99 100644 (file)
@@ -27,7 +27,7 @@
 
 #include <unixlib/local.h>
 
-#define WEBJAMES_SAPI_VERSION "1.0.1"
+#define WEBJAMES_SAPI_VERSION "1.0.2"
 
 typedef struct {
        struct connection *conn; /*structure holding all the details of the current request*/
@@ -42,24 +42,44 @@ static php_webjames_globals webjames_globals;
 static int sapi_webjames_ub_write(const char *str, uint str_length TSRMLS_DC)
 /*unbuffered write - send data straight out to socket*/
 {
-       int bytes;
-       
-       bytes = webjames_writebuffer(WG(conn),str,str_length);
-       if (bytes<0) {
-               PG(connection_status) = PHP_CONNECTION_ABORTED;
-               if (!PG(ignore_user_abort)) {
-                       zend_bailout();
+       int totalbytes = 0;
+
+       do {
+               int bytes;
+               bytes = webjames_writebuffer(WG(conn),str,str_length);
+               if (bytes<0) {
+                       PG(connection_status) = PHP_CONNECTION_ABORTED;
+                       if (!PG(ignore_user_abort)) {
+                               zend_bailout();
+                       }
+                       return bytes;
                }
-       }
-       return bytes;
+               str += bytes;
+               str_length -= bytes;
+               totalbytes += bytes;
+       } while (str_length);
+       return totalbytes;
 }
 
 static void sapi_webjames_send_header(sapi_header_struct *sapi_header, void *server_context TSRMLS_DC)
 /*send an HTTP header*/
 {
+       char *header = sapi_header->header;
+       int len = sapi_header->header_len;
        if (WG(conn)->flags.outputheaders) {
-               if (sapi_header)
-                       webjames_writebuffer(WG(conn), sapi_header->header, sapi_header->header_len);
+               while (sapi_header && len > 0) {
+                       int bytes;
+                       bytes = webjames_writebuffer(WG(conn), header, len);
+                       if (bytes<0) {
+                               PG(connection_status) = PHP_CONNECTION_ABORTED;
+                               if (!PG(ignore_user_abort)) {
+                                       zend_bailout();
+                               }
+                               return;
+                       }
+                       header += bytes;
+                       len -= bytes;
+               }
                webjames_writestring(WG(conn), "\r\n");
        }
 }