From: Alex Waugh Date: Sun, 26 Nov 2006 19:50:30 +0000 (+0000) Subject: Improve robustness of sending routines X-Git-Tag: RELEASE_1_0_0RC1~903 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=58c106cb062379f23e4c4f1531e16169503e2034;p=php Improve robustness of sending routines --- diff --git a/sapi/webjames/webjames.c b/sapi/webjames/webjames.c index 3068d8fccc..5a6533ff5f 100644 --- a/sapi/webjames/webjames.c +++ b/sapi/webjames/webjames.c @@ -27,7 +27,7 @@ #include -#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"); } }