iliaa           Thu Jul 14 10:59:19 2005 EDT

  Modified files:              
    /php-src/ext/standard       http_fopen_wrapper.c 
  Log:
  Properly recognize redirect code 303.
  When encountering redirect on POST request follow browsers and cURL and 
  perform GET on the specified location field.
  
  
http://cvs.php.net/diff.php/php-src/ext/standard/http_fopen_wrapper.c?r1=1.97&r2=1.98&ty=u
Index: php-src/ext/standard/http_fopen_wrapper.c
diff -u php-src/ext/standard/http_fopen_wrapper.c:1.97 
php-src/ext/standard/http_fopen_wrapper.c:1.98
--- php-src/ext/standard/http_fopen_wrapper.c:1.97      Mon Jun  6 08:39:57 2005
+++ php-src/ext/standard/http_fopen_wrapper.c   Thu Jul 14 10:59:16 2005
@@ -19,7 +19,7 @@
    |          Sara Golemon <[EMAIL PROTECTED]>                              |
    +----------------------------------------------------------------------+
  */
-/* $Id: http_fopen_wrapper.c,v 1.97 2005/06/06 12:39:57 derick Exp $ */ 
+/* $Id: http_fopen_wrapper.c,v 1.98 2005/07/14 14:59:16 iliaa Exp $ */ 
 
 #include "php.h"
 #include "php_globals.h"
@@ -190,7 +190,7 @@
                redirect_max = Z_LVAL_PP(tmpzval);
        }
 
-       if (context &&
+       if (header_init && context &&
                php_stream_context_get_option(context, "http", "method", 
&tmpzval) == SUCCESS) {
                if (Z_TYPE_PP(tmpzval) == IS_STRING && Z_STRLEN_PP(tmpzval) > 
0) {
                        scratch_len = strlen(path) + 29 + Z_STRLEN_PP(tmpzval);
@@ -267,6 +267,35 @@
                   php_trim will estrndup() */
                tmp = php_trim(Z_STRVAL_PP(tmpzval), Z_STRLEN_PP(tmpzval), 
NULL, 0, NULL, 3 TSRMLS_CC);
                if (strlen(tmp) > 0) {
+                       if (!header_init) { /* Remove post headers for 
redirects */
+                               int l = strlen(tmp);
+                               char *s, *s2, *tmp_c = estrdup(tmp);
+                               
+                               php_strtolower(tmp_c, l);
+                               if ((s = strstr(tmp_c, "content-length:"))) {
+                                       if ((s2 = memchr(s, '\n', tmp_c + l - 
s))) {
+                                               int b = tmp_c + l - 1 - s2;
+                                               memmove(tmp, tmp + (s2 + 1 - 
tmp_c), b);
+                                               memmove(tmp_c, s2 + 1, b);
+                                               
+                                       } else {
+                                               tmp[s - tmp_c] = *s = '\0';
+                                       }
+                                       l = strlen(tmp_c);
+                               }
+                               if ((s = strstr(tmp_c, "content-type:"))) {
+                                       if ((s2 = memchr(s, '\n', tmp_c + l - 
s))) {
+                                               memmove(tmp, tmp + (s2 + 1 - 
tmp_c), tmp_c + l - 1 - s2);
+                                       } else {
+                                               tmp[s - tmp_c] = '\0';
+                                       }
+                               }
+                               efree(tmp_c);
+                               tmp_c = php_trim(tmp, strlen(tmp), NULL, 0, 
NULL, 3 TSRMLS_CC);
+                               efree(tmp);
+                               tmp = tmp_c;
+                       }
+               
                        /* Output trimmed headers with \r\n at the end */
                        php_stream_write(stream, tmp, strlen(tmp));
                        php_stream_write(stream, "\r\n", sizeof("\r\n") - 1);
@@ -367,7 +396,7 @@
        }
 
        /* Request content, such as for POST requests */
-       if (context &&
+       if (header_init && context &&
                php_stream_context_get_option(context, "http", "content", 
&tmpzval) == SUCCESS &&
                Z_STRLEN_PP(tmpzval) > 0) {
                if (!(have_header & HTTP_HEADER_CONTENT_LENGTH)) {
@@ -423,6 +452,7 @@
                        switch(response_code) {
                                case 200:
                                case 302:
+                               case 303:
                                case 301:
                                        reqok = 1;
                                        break;

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

Reply via email to