- curl_formget() patch was accepted into libcurl-7.15.5
authorMichael Wallner <mike@php.net>
Sat, 24 Jun 2006 16:58:50 +0000 (16:58 +0000)
committerMichael Wallner <mike@php.net>
Sat, 24 Jun 2006 16:58:50 +0000 (16:58 +0000)
- move code into http_request_body_encode() function

config9.m4
http_functions.c
http_request_body_api.c
php_http_request_body_api.h

index e1c4ab8831c87d703538695001a47cce06cd7ffe..09e31c54158c5248dca4fc2bf7a8d93bb65050d5 100644 (file)
@@ -226,6 +226,11 @@ dnl ----
                        [AC_DEFINE([HAVE_CURL_GETFORMDATA], [1], [ ])], [ ],
                        [$CURL_LIBS -L$CURL_DIR/$PHP_LIBDIR]
                )
+               dnl New API function which obsoletes use of Curl_getFormData (>=7.15.5)
+               PHP_CHECK_LIBRARY(curl, curl_formget,
+                       [AC_DEFINE([HAVE_CURL_FORMGET], [1], [ ])], [ ],
+                       [$CURL_LIBS -L$CURL_DIR/$PHP_LIBDIR]
+               )
        fi
 
 dnl ----
index bf1e19393557e10c0105bec88a384c755ab7b2f7..33c1e4a34a3a856826ae94ae6fe3cab0b721d1fe 100644 (file)
@@ -1670,28 +1670,6 @@ PHP_FUNCTION(http_request)
 }
 /* }}} */
 
-#ifdef HAVE_CURL_GETFORMDATA
-static char *file_get_contents(char *file, size_t *len TSRMLS_DC)
-{
-       php_stream *s = NULL;
-       char *buf = NULL;
-       
-       if ((s = php_stream_open_wrapper_ex(file, "rb", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL, HTTP_DEFAULT_STREAM_CONTEXT))) {
-               *len = php_stream_copy_to_mem(s, &buf, (size_t) -1, 0);
-               php_stream_close(s);
-       } else {
-               *len = 0;
-       }
-       return buf;
-}
-struct FormData {
-       struct FormData *next;
-       int type;
-       char *line;
-       size_t length;
-};
-CURLcode Curl_getFormData(struct FormData **, struct curl_httppost *post, curl_off_t *size);
-
 /* {{{ proto string http_request_body_encode(array fields, array files)
  *
  * Generate x-www-form-urlencoded resp. form-data encoded request body.
@@ -1703,13 +1681,8 @@ PHP_FUNCTION(http_request_body_encode)
        zval *fields = NULL, *files = NULL;
        HashTable *fields_ht, *files_ht;
        http_request_body body;
-       phpstr rbuf;
-       struct FormData *data, *ptr;
-       curl_off_t size;
-       char *fdata = NULL;
-       size_t fsize = 0;
-       CURLcode rc;
-       int fgc_error = 0;
+       char *buf;
+       size_t len;
        
        if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a!a!", &fields, &files)) {
                RETURN_FALSE;
@@ -1717,54 +1690,14 @@ PHP_FUNCTION(http_request_body_encode)
        
        fields_ht = (fields && Z_TYPE_P(fields) == IS_ARRAY) ? Z_ARRVAL_P(fields) : NULL;
        files_ht = (files && Z_TYPE_P(files) == IS_ARRAY) ? Z_ARRVAL_P(files) : NULL;
-       if (!http_request_body_fill(&body, fields_ht, files_ht)) {
-               RETURN_FALSE;
-       }
-       
-       switch (body.type) {
-               case HTTP_REQUEST_BODY_CURLPOST:
-                       if (CURLE_OK != (rc = Curl_getFormData(&data, body.data, &size))) {
-                               http_error_ex(HE_WARNING, HTTP_E_RUNTIME, "Could not encode request body: %s", curl_easy_strerror(rc));
-                               RETVAL_FALSE;
-                       } else {
-                               phpstr_init_ex(&rbuf, (size_t) size, PHPSTR_INIT_PREALLOC);
-                               for (ptr = data; ptr; ptr = ptr->next) {
-                                       if (!fgc_error) {
-                                               if (ptr->type) {
-                                                       if ((fdata = file_get_contents(ptr->line, &fsize TSRMLS_CC))) {
-                                                               phpstr_append(&rbuf, fdata, fsize);
-                                                               efree(fdata);
-                                                       } else {
-                                                               fgc_error = 1;
-                                                       }
-                                               } else {
-                                                       phpstr_append(&rbuf, ptr->line, ptr->length);
-                                               }
-                                       }
-                                       curl_free(ptr->line);
-                               }
-                               curl_free(data);
-                               if (fgc_error) {
-                                       phpstr_dtor(&rbuf);
-                                       RETVAL_FALSE;
-                               } else {
-                                       RETVAL_PHPSTR_VAL(&rbuf);
-                               }
-                       }
-                       http_request_body_dtor(&body);
-                       break;
-               
-               case HTTP_REQUEST_BODY_CSTRING:
-                       RETVAL_STRINGL(body.data, body.size, 0);
-                       break;
-               
-               default:
-                       http_request_body_dtor(&body);
-                       RETVAL_FALSE;
-                       break;
+       if (http_request_body_fill(&body, fields_ht, files_ht) && (SUCCESS == http_request_body_encode(&body, &buf, &len))) {
+               RETVAL_STRINGL(buf, len, 0);
+       } else {
+               http_error(HE_WARNING, HTTP_E_RUNTIME, "Could not encode request body");
+               RETVAL_FALSE;
        }
+       http_request_body_dtor(&body);
 }
-#endif /* HAVE_CURL_GETFORMDATA */
 #endif /* HTTP_HAVE_CURL */
 /* }}} HAVE_CURL */
 
index 816e9c26abe778e3ea4352388cad4a545f87bb7f..a57702379425374db517eb22126c3f5cacfad688 100644 (file)
 #include "php_http_url_api.h"
 #include "php_http_request_body_api.h"
 
+#if defined(HAVE_CURL_GETFORMDATA) && !defined(HAVE_CURL_FORMGET)
+struct FormData {
+       struct FormData *next;
+       int type;
+       char *line;
+       size_t length;
+};
+
+CURLcode Curl_getFormData(struct FormData **, struct curl_httppost *post, curl_off_t *size);
+
+static char *file_get_contents(char *file, size_t *len TSRMLS_DC)
+{
+       php_stream *s = NULL;
+       char *buf = NULL;
+       
+       if ((s = php_stream_open_wrapper_ex(file, "rb", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL, HTTP_DEFAULT_STREAM_CONTEXT))) {
+               *len = php_stream_copy_to_mem(s, &buf, (size_t) -1, 0);
+               php_stream_close(s);
+       } else {
+               *len = 0;
+       }
+       return buf;
+}
+
+static int curl_formget(struct FormData *post, phpstr *str TSRMLS_DC)
+{
+       int fgc_error = 0;
+       char *fdata;
+       size_t fsize;
+       struct FormData *next, *pptr = post;
+       
+       while (pptr) {
+               next = pptr->next;
+               
+               if (!fgc_error) {
+                       if (pptr->type) {
+                               if ((fdata = file_get_contents(pptr->line, &fsize TSRMLS_CC))) {
+                                       phpstr_append(str, fdata, fsize);
+                                       efree(fdata);
+                               } else {
+                                       fgc_error = 1;
+                               }
+                       } else {
+                               phpstr_append(str, pptr->line, pptr->length);
+                       }
+               }
+               
+               curl_free(pptr->line);
+               curl_free(pptr);
+               pptr = next;
+       }
+       
+       return fgc_error;
+}
+#endif
+
+
 /* {{{ http_request_body *http_request_body_new() */
 PHP_HTTP_API http_request_body *_http_request_body_init_ex(http_request_body *body, int type, void *data, size_t size, zend_bool free ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC TSRMLS_DC)
 {
@@ -143,6 +200,55 @@ PHP_HTTP_API http_request_body *_http_request_body_fill(http_request_body *body,
        }
 }
 
+/* STATUS http_request_body_encode(http_request_body *, char**, size_t *) */
+PHP_HTTP_API STATUS _http_request_body_encode(http_request_body *body, char **buf, size_t *len TSRMLS_DC)
+{
+       switch (body->type) {
+               case HTTP_REQUEST_BODY_CURLPOST:
+               {
+#if defined(HAVE_CURL_FORMGET)
+                       phpstr str;
+                       
+                       phpstr_init_ex(&str, 0x8000, 0);
+                       if (curl_formget(body->data, &str, (curl_formget_callback) phpstr_append)) {
+                               phpstr_dtor(&str);
+                       } else {
+                               phpstr_fix(&str);
+                               *buf = PHPSTR_VAL(&str);
+                               *len = PHPSTR_LEN(&str);
+                               return SUCCESS;
+                       }
+#elif defined(HAVE_CURL_GETFORMDATA)
+                       struct FormData *data;
+                       curl_off_t size;
+                       
+                       if (!Curl_getFormData(&data, body->data, &size)) {
+                               phpstr str;
+                               
+                               phpstr_init_ex(&str, (size_t) size, 0);
+                               if (curl_formget(data, &str TSRMLS_CC)) {
+                                       phpstr_dtor(&str);
+                               } else {
+                                       phpstr_fix(&str);
+                                       *buf = PHPSTR_VAL(&str);
+                                       *len = PHPSTR_LEN(&len);
+                                       return SUCCESS;
+                               }
+                       }
+#endif
+                       break;
+               }
+               
+               case HTTP_REQUEST_BODY_CSTRING:
+                       *buf = estrndup(body->data, *len = body->size);
+                       return SUCCESS;
+               
+               default:
+                       break;
+       }
+       return FAILURE;
+}
+/* }}} */
 
 /* {{{ void http_request_body_dtor(http_request_body *) */
 PHP_HTTP_API void _http_request_body_dtor(http_request_body *body TSRMLS_DC)
index 739168f52c0e15629c804575b35a207cf0275338..ad698a5123c0ad4e418b1a6ea215c7ac9afe9f08 100644 (file)
@@ -39,6 +39,9 @@ PHP_HTTP_API http_request_body *_http_request_body_init_ex(http_request_body *bo
 #define http_request_body_fill(b, fields, files) _http_request_body_fill((b), (fields), (files) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC TSRMLS_CC)
 PHP_HTTP_API http_request_body *_http_request_body_fill(http_request_body *body, HashTable *fields, HashTable *files ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC TSRMLS_DC);
 
+#define http_request_body_encode(b, s, l) _http_request_body_encode((b), (s), (l) TSRMLS_CC)
+PHP_HTTP_API STATUS  _http_request_body_encode(http_request_body *body, char **buf, size_t *len TSRMLS_DC);
+
 #define http_request_body_dtor(b) _http_request_body_dtor((b) TSRMLS_CC)
 PHP_HTTP_API void _http_request_body_dtor(http_request_body *body TSRMLS_DC);