dmitry          Wed Feb 18 01:58:34 2004 EDT

  Modified files:              
    /php-src/ext/soap   php_http.c 
  Log:
  BUGFIX: HTTP chunked transfer-encoding support
  
  
http://cvs.php.net/diff.php/php-src/ext/soap/php_http.c?r1=1.42&r2=1.43&ty=u
Index: php-src/ext/soap/php_http.c
diff -u php-src/ext/soap/php_http.c:1.42 php-src/ext/soap/php_http.c:1.43
--- php-src/ext/soap/php_http.c:1.42    Mon Feb 16 04:56:30 2004
+++ php-src/ext/soap/php_http.c Wed Feb 18 01:58:33 2004
@@ -17,7 +17,7 @@
   |          Dmitry Stogov <[EMAIL PROTECTED]>                             |
   +----------------------------------------------------------------------+
 */
-/* $Id: php_http.c,v 1.42 2004/02/16 09:56:30 dmitry Exp $ */
+/* $Id: php_http.c,v 1.43 2004/02/18 06:58:33 dmitry Exp $ */
 
 #include "php_soap.h"
 #include "ext/standard/base64.h"
@@ -642,26 +642,41 @@
        content_length = get_http_header_value(headers, "Content-Length: ");
 
        if (trans_enc && !strcmp(trans_enc, "chunked")) {
-               int buf_size = 0, len_size;
                char done, chunk_size[10];
 
                done = FALSE;
                http_buf = NULL;
 
                while (!done) {
-                       php_stream_gets(stream, chunk_size, sizeof(chunk_size));
-
-                       if (sscanf(chunk_size, "%x", &buf_size) != -1) {
-                               http_buf = erealloc(http_buf, http_buf_size + buf_size 
+ 1);
-                               len_size = 0;
-
-                               while (http_buf_size < buf_size) {
-                                       len_size += php_stream_read(stream, http_buf + 
http_buf_size, buf_size - len_size);
-                                       http_buf_size += len_size;
-                               }
+                       int buf_size = 0;
 
+                       php_stream_gets(stream, chunk_size, sizeof(chunk_size));       
         
+                       if (sscanf(chunk_size, "%x", &buf_size) > 0 ) {
+                               if (buf_size > 0) {
+                                       int len_size = 0;
+               
+                                       http_buf = erealloc(http_buf, http_buf_size + 
buf_size + 1);
+
+                                       while (len_size < buf_size) {
+                                               int len_read = php_stream_read(stream, 
http_buf + http_buf_size, buf_size - len_size);
+                                               if (len_read <= 0) {
+                                                       /* Error or EOF */
+                                                       done = TRUE;
+                                                 break;
+                                               }
+                                               len_size += len_read;
+                                               http_buf_size += len_size;
+                                       }
+                               }
+                               
                                /* Eat up '\r' '\n' */
-                               php_stream_getc(stream);php_stream_getc(stream);
+                               php_stream_getc(stream);
+                               php_stream_getc(stream);
+                       } else {                                
+                               /* Somthing wrong in chunked encoding */
+                               efree(trans_enc);
+                               efree(http_buf);
+                               return FALSE;
                        }
                        if (buf_size == 0) {
                                done = TRUE;

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

Reply via email to