From: Michael Wallner Date: Thu, 6 Apr 2006 18:37:45 +0000 (+0000) Subject: - add missing http_request_body_encode() X-Git-Tag: RELEASE_1_0_0RC3~8 X-Git-Url: https://git.m6w6.name/?a=commitdiff_plain;h=b6a7eefc4e43742bba57a1a338c3153a0bf5e3ed;p=m6w6%2Fext-http - add missing http_request_body_encode() # I bet this breaks the windows build; let's see --- diff --git a/http.c b/http.c index 807910a..c951383 100644 --- 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) diff --git a/http_functions.c b/http_functions.c index 89a8c61..ab889cd 100644 --- a/http_functions.c +++ b/http_functions.c @@ -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 */ diff --git a/php_http.h b/php_http.h index 6ff5418..447293f 100644 --- a/php_http.h +++ b/php_http.h @@ -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);