}
/* }}} */
-/* {{{ proto string http_build_url(mixed url[, mixed parts[, int flags = HTTP_URL_REPLACE[, array &new_url]]])
+/* {{{ proto string http_build_url([mixed url[, mixed parts[, int flags = HTTP_URL_REPLACE[, array &new_url]]]])
*
* Build an URL.
*
zval *z_old_url = NULL, *z_new_url = NULL, *z_composed_url = NULL;
php_url *old_url = NULL, *new_url = NULL, *composed_url = NULL;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/|z/lz", &z_old_url, &z_new_url, &flags, &z_composed_url) != SUCCESS) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|z/z/lz", &z_old_url, &z_new_url, &flags, &z_composed_url) != SUCCESS) {
RETURN_FALSE;
}
}
}
- if (Z_TYPE_P(z_old_url) == IS_ARRAY || Z_TYPE_P(z_old_url) == IS_OBJECT) {
- old_url = array2url(HASH_OF(z_old_url));
- } else {
- convert_to_string(z_old_url);
- if (!(old_url = php_url_parse_ex(Z_STRVAL_P(z_old_url), Z_STRLEN_P(z_old_url)))) {
- if (new_url) {
- php_url_free(new_url);
+ if (z_old_url) {
+ if (Z_TYPE_P(z_old_url) == IS_ARRAY || Z_TYPE_P(z_old_url) == IS_OBJECT) {
+ old_url = array2url(HASH_OF(z_old_url));
+ } else {
+ convert_to_string(z_old_url);
+ if (!(old_url = php_url_parse_ex(Z_STRVAL_P(z_old_url), Z_STRLEN_P(z_old_url)))) {
+ if (new_url) {
+ php_url_free(new_url);
+ }
+ http_error_ex(HE_WARNING, HTTP_E_URL, "Could not parse URL (%s)", Z_STRVAL_P(z_old_url));
+ RETURN_FALSE;
}
- http_error_ex(HE_WARNING, HTTP_E_URL, "Could not parse URL (%s)", Z_STRVAL_P(z_old_url));
- RETURN_FALSE;
}
}
if (new_url) {
php_url_free(new_url);
}
- php_url_free(old_url);
+ if (old_url) {
+ php_url_free(old_url);
+ }
RETURN_STRINGL(url_str, url_len, 0);
}
*/
PHP_FUNCTION(http_redirect)
{
- int url_len;
+ int url_len = 0;
size_t query_len = 0;
zend_bool session = 0, free_params = 0;
zval *params = NULL;
}
/* }}} */
-/* {{{ 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;
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.
+ *
+ * Returns encoded string on success, or FALSE on failure.
+ */
PHP_FUNCTION(http_request_body_encode)
{
zval *fields = NULL, *files = NULL;
curl_off_t size;
char *fdata = NULL;
size_t fsize = 0;
+ CURLcode rc;
+ int fgc_error = 0;
if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a!a!", &fields, &files)) {
RETURN_FALSE;
switch (body.type)
{
case HTTP_REQUEST_BODY_CURLPOST:
- if (CURLE_OK != Curl_getFormData(&data, body.data, &size)) {
+ 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, PHPSTR_INIT_PREALLOC);
+ phpstr_init_ex(&rbuf, (size_t) 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);
+ 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);
}
- } else {
- phpstr_append(&rbuf, ptr->line, ptr->length);
}
curl_free(ptr->line);
}
curl_free(data);
- RETVAL_PHPSTR_VAL(&rbuf);
+ if (fgc_error) {
+ phpstr_dtor(&rbuf);
+ RETVAL_FALSE;
+ } else {
+ RETVAL_PHPSTR_VAL(&rbuf);
+ }
}
http_request_body_dtor(&body);
break;