- (non-)ZTS fixes
[m6w6/ext-http] / http_request_body_api.c
index fcaa635d00f54603a9ba1c820aa944e70427cef1..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,27 +200,75 @@ 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)
 {
        if (body) {
                if (body->free) {
-                       switch (body->type)
-                       {
+                       switch (body->type) {
                                case HTTP_REQUEST_BODY_CSTRING:
                                        if (body->data) {
                                                efree(body->data);
                                        }
-                               break;
+                                       break;
        
                                case HTTP_REQUEST_BODY_CURLPOST:
                                        curl_formfree(body->data);
-                               break;
+                                       break;
        
                                case HTTP_REQUEST_BODY_UPLOADFILE:
                                        php_stream_close(body->data);
-                               break;
+                                       break;
                        }
                }
                memset(body, 0, sizeof(http_request_body));