summaryrefslogtreecommitdiff
path: root/sapi
diff options
context:
space:
mode:
authorAlex Waugh <alexwaugh@php.net>2006-11-26 19:51:23 +0000
committerAlex Waugh <alexwaugh@php.net>2006-11-26 19:51:23 +0000
commit4e0446b6c9b9794a896acf942f949037ec386c26 (patch)
tree10ed4db33dcc99a9e08b8fc81087397ee6ddf8f9 /sapi
parente6a34313153e7f8deb6c38870c74b518173f9f17 (diff)
downloadphp-git-4e0446b6c9b9794a896acf942f949037ec386c26.tar.gz
MFH: Improve robustness of sending routines
Diffstat (limited to 'sapi')
-rw-r--r--sapi/webjames/webjames.c44
1 files changed, 32 insertions, 12 deletions
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 <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");
}
}