- add missing http_request_body_encode()
authorMichael Wallner <mike@php.net>
Thu, 6 Apr 2006 18:37:45 +0000 (18:37 +0000)
committerMichael Wallner <mike@php.net>
Thu, 6 Apr 2006 18:37:45 +0000 (18:37 +0000)
# I bet this breaks the windows build; let's see

http.c
http_functions.c
php_http.h

diff --git a/http.c b/http.c
index 807910a4226ee9564bc460eb77a4610063f80440..c951383007f5c83029c60a84a151d3de533f9bea 100644 (file)
--- a/http.c
+++ b/http.c
@@ -106,6 +106,7 @@ zend_function_entry http_functions[] = {
        PHP_FE(http_put_file, http_arg_pass_ref_4)
        PHP_FE(http_put_stream, http_arg_pass_ref_4)
        PHP_FE(http_request, http_arg_pass_ref_5)
+       PHP_FE(http_request_body_encode, NULL)
 #endif
        PHP_FE(http_request_method_register, NULL)
        PHP_FE(http_request_method_unregister, NULL)
index 89a8c61ca093c6ca1086a513e8121830676f73fd..ab889cd71d4323c3e6f1fe353e67402c2a5910d5 100644 (file)
@@ -1667,6 +1667,83 @@ PHP_FUNCTION(http_request)
        http_request_dtor(&request);
 }
 /* }}} */
+
+/* {{{ no-proto string http_request_body_encode(array fields, array files) */
+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);
+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;
+       
+       if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a!a!", &fields, &files)) {
+               RETURN_FALSE;
+       }
+       
+       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 != Curl_getFormData(&data, body.data, &size)) {
+                               RETVAL_FALSE;
+                       } else {
+                               phpstr_init_ex(&rbuf, size, PHPSTR_INIT_PREALLOC);
+                               for (ptr = data; ptr; ptr = ptr->next) {
+                                       if (ptr->type) {
+                                               if ((fdata = file_get_contents(ptr->line, &fsize TSRMLS_CC))) {
+                                                       phpstr_append(&rbuf, fdata, fsize);
+                                                       efree(fdata);
+                                               }
+                                       } else {
+                                               phpstr_append(&rbuf, ptr->line, ptr->length);
+                                       }
+                                       curl_free(ptr->line);
+                               }
+                               curl_free(data);
+                               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;
+       }
+}
 #endif /* HTTP_HAVE_CURL */
 /* }}} HAVE_CURL */
 
index 6ff5418ceb137ad5f5c98776e09a3144fab763a8..447293f66242b7f0b6659c5f38d5a55e014e80f0 100644 (file)
@@ -182,6 +182,7 @@ PHP_FUNCTION(http_put_data);
 PHP_FUNCTION(http_put_file);
 PHP_FUNCTION(http_put_stream);
 PHP_FUNCTION(http_request);
+PHP_FUNCTION(http_request_body_encode);
 #endif /* HTTP_HAVE_CURL */
 PHP_FUNCTION(http_request_method_register);
 PHP_FUNCTION(http_request_method_unregister);