X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_functions.c;h=869442d38238d458a9597b2a6f84d6adeea84356;hp=806cd664ebb52e658d0bdb817735c4ec67ee3935;hb=76d11ef7477a1caf622ac9823da6b2b098c9b86c;hpb=46fc12676a53668d55fe6d02d44210e2eaf4b6b5 diff --git a/http_functions.c b/http_functions.c index 806cd66..869442d 100644 --- a/http_functions.c +++ b/http_functions.c @@ -21,7 +21,7 @@ #include "ext/standard/php_string.h" #include "zend_operators.h" -#if HTTP_HAVE_EXT(SESSION) +#ifdef HTTP_HAVE_SESSION # include "ext/session/php_session.h" #endif @@ -62,6 +62,10 @@ PHP_FUNCTION(http_date) } /* }}} */ +#if PHP_MAJOR_VERSION == 4 && PHP_MINOR_VERSION == 3 && PHP_RELEASE_VERSION < 10 +# define php_url_parse_ex(u, l) php_url_parse(u) +#endif + /* {{{ proto string http_build_url([mixed url[, mixed parts[, int flags = HTTP_URL_REPLACE[, array &new_url]]]]) * * Build an URL. @@ -728,7 +732,7 @@ PHP_FUNCTION(http_redirect) RETURN_FALSE; } -#if 0 && HTTP_HAVE_EXT(SESSION) +#ifdef HTTP_HAVE_SESSION /* append session info */ if (session) { if (!params) { @@ -820,14 +824,14 @@ PHP_FUNCTION(http_redirect) */ PHP_FUNCTION(http_send_data) { - zval *zdata; + int data_len; + char *data_buf; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &zdata) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &data_buf, &data_len) != SUCCESS) { RETURN_FALSE; } - convert_to_string_ex(&zdata); - RETURN_SUCCESS(http_send_data(Z_STRVAL_P(zdata), Z_STRLEN_P(zdata))); + RETURN_SUCCESS(http_send_data(data_buf, data_len)); } /* }}} */ @@ -1059,7 +1063,7 @@ PHP_FUNCTION(http_parse_cookie) HashPosition pos; http_cookie_list list; - if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|la", &cookie, &cookie_len, &flags, &allowed_extras_array)) { + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|la!", &cookie, &cookie_len, &flags, &allowed_extras_array)) { RETURN_FALSE; } @@ -1068,7 +1072,7 @@ PHP_FUNCTION(http_parse_cookie) FOREACH_VAL(pos, allowed_extras_array, entry) { ZVAL_ADDREF(*entry); convert_to_string_ex(entry); - allowed_extras[i] = estrndup(Z_STRVAL_PP(entry), Z_STRLEN_PP(entry)); + allowed_extras[i++] = estrndup(Z_STRVAL_PP(entry), Z_STRLEN_PP(entry)); zval_ptr_dtor(entry); } } @@ -1088,6 +1092,30 @@ PHP_FUNCTION(http_parse_cookie) efree(allowed_extras); } } +/* }}} */ + +/* {{{ proto string http_build_cookie(array cookie) + * + * Build a cookie string from an array/object like returned by http_parse_cookie(). + */ +PHP_FUNCTION(http_build_cookie) +{ + char *str = NULL; + size_t len = 0; + zval *strct; + http_cookie_list list; + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &strct)) { + RETURN_FALSE; + } + + http_cookie_list_fromstruct(&list, strct); + http_cookie_list_tostring(&list, &str, &len); + http_cookie_list_dtor(&list); + + RETURN_STRINGL(str, len, 0); +} +/* }}} */ /* {{{ proto object http_parse_params(string param[, int flags = HTTP_PARAMS_DEFAULT]) * @@ -1127,7 +1155,7 @@ PHP_FUNCTION(http_get_request_headers) NO_ARGS; array_init(return_value); - http_get_request_headers(return_value); + http_get_request_headers(Z_ARRVAL_P(return_value)); } /* }}} */ @@ -1452,17 +1480,17 @@ PHP_FUNCTION(http_post_data) */ PHP_FUNCTION(http_post_fields) { - zval *options = NULL, *info = NULL, *fields, *files = NULL; + zval *options = NULL, *info = NULL, *fields = NULL, *files = NULL; char *URL; int URL_len; http_request_body body; http_request request; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sa|aa/!z", &URL, &URL_len, &fields, &files, &options, &info) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sa!|a!a/!z", &URL, &URL_len, &fields, &files, &options, &info) != SUCCESS) { RETURN_FALSE; } - if (!http_request_body_fill(&body, Z_ARRVAL_P(fields), files ? Z_ARRVAL_P(files) : NULL)) { + if (!http_request_body_fill(&body, fields ? Z_ARRVAL_P(fields) : NULL, files ? Z_ARRVAL_P(files) : NULL)) { RETURN_FALSE; } @@ -1670,28 +1698,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 +1709,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 +1718,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 */