X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=http_functions.c;h=1b71506b7dcbe8f35e14d15431732bf47b77ec48;hb=eb42a474c2f5f0c6e69c92ba21383e75ee41b5c2;hp=424a6bde66ad7a41b4857507d09bf3e555ef9d6a;hpb=eabc03de1d511ce49640322859c6175f27a413e5;p=m6w6%2Fext-http diff --git a/http_functions.c b/http_functions.c index 424a6bd..1b71506 100644 --- a/http_functions.c +++ b/http_functions.c @@ -17,6 +17,7 @@ #endif #define HTTP_WANT_CURL +#define HTTP_WANT_ZLIB #include "php_http.h" #include "SAPI.h" @@ -67,41 +68,84 @@ PHP_FUNCTION(http_date) } /* }}} */ -/* {{{ proto string http_build_uri(string url[, string proto[, string host[, int port]]]) +/* {{{ proto string http_build_url(mixed url[, mixed parts[, array new_url]]) * - * Build a complete URI according to the supplied parameters. - * - * If the url is already abolute but a different proto was supplied, - * only the proto part of the URI will be updated. If url has no - * path specified, the path of the current REQUEST_URI will be taken. - * The host will be taken either from the Host HTTP header of the client - * the SERVER_NAME or just localhost if prior are not available. - * If a port is pecified in either the url or as sperate parameter, - * it will be added if it differs from te default port for HTTP(S). - * - * Returns the absolute URI as string on success or false on failure. - * - * Examples: - *
- * 
- * 
+ * Returns the new URL as string on success or FALSE on failure. */ -PHP_FUNCTION(http_build_uri) +PHP_FUNCTION(http_build_url) { - char *url = NULL, *proto = NULL, *host = NULL, *built = NULL; - int url_len = 0, proto_len = 0, host_len = 0; - long port = 0; + char *url_str = NULL; + size_t url_len = 0; + 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, "s|ssl", &url, &url_len, &proto, &proto_len, &host, &host_len, &port) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z/|z/z", &z_old_url, &z_new_url, &z_composed_url) != SUCCESS) { RETURN_FALSE; } - - if ((built = http_absolute_uri_ex(url, url_len, proto, proto_len, host, host_len, port))) { - RETURN_STRING(built, 0); + + if (z_new_url) { + if (Z_TYPE_P(z_new_url) == IS_ARRAY || Z_TYPE_P(z_new_url) == IS_OBJECT) { + new_url = array2url(HASH_OF(z_new_url)); + } else { + convert_to_string(z_new_url); + if (!(new_url = php_url_parse_ex(Z_STRVAL_P(z_new_url), Z_STRLEN_P(z_new_url)))) { + 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); + } + RETURN_FALSE; + } + } + + if (z_composed_url) { + http_build_url(old_url, new_url, &composed_url, &url_str, &url_len); + + zval_dtor(z_composed_url); + array_init(z_composed_url); + if (composed_url->scheme) { + add_assoc_string(z_composed_url, "scheme", composed_url->scheme, 1); + } + if (composed_url->user) { + add_assoc_string(z_composed_url, "user", composed_url->user, 1); + } + if (composed_url->pass) { + add_assoc_string(z_composed_url, "pass", composed_url->pass, 1); + } + if (composed_url->host) { + add_assoc_string(z_composed_url, "host", composed_url->host, 1); + } + if (composed_url->port) { + add_assoc_long(z_composed_url, "port", composed_url->port); + } + if (composed_url->path) { + add_assoc_string(z_composed_url, "path", composed_url->path, 1); + } + if (composed_url->query) { + add_assoc_string(z_composed_url, "query", composed_url->query, 1); + } + if (composed_url->fragment) { + add_assoc_string(z_composed_url, "fragment", composed_url->fragment, 1); + } + php_url_free(composed_url); + } else { + http_build_url(old_url, new_url, NULL, &url_str, &url_len); } - RETURN_FALSE; + + if (new_url) { + php_url_free(new_url); + } + php_url_free(old_url); + + RETURN_STRINGL(url_str, url_len, 0); } /* }}} */ @@ -685,7 +729,7 @@ PHP_FUNCTION(http_redirect) } } - URI = http_absolute_uri(url); + URI = http_absolute_url(url); if (query_len) { spprintf(&LOC, 0, "Location: %s?%s", URI, query); @@ -894,6 +938,7 @@ PHP_FUNCTION(http_parse_message) * ) * [Folded] => works * too + * ) * ?> * */ @@ -914,6 +959,44 @@ PHP_FUNCTION(http_parse_headers) } /* }}}*/ +/* {{{ proto object http_parse_cookie(string cookie) + * + * Parses HTTP cookies like sent in a response into a struct. + * + * Expects a string as parameter containing the value of a Set-Cookie response header. + * + * Returns an stdClass object with the cookie params as properties on success or FALSE on failure. + * + * Example: + *
+ *  foo
+ *     [value] => bar
+ *     [path] => /
+ * )
+ * ?>
+ * 
+ */ +PHP_FUNCTION(http_parse_cookie) +{ + char *cookie; + int cookie_len; + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &cookie, &cookie_len)) { + RETURN_FALSE; + } + + object_init(return_value); + if (SUCCESS != http_parse_cookie(cookie, HASH_OF(return_value))) { + zval_dtor(return_value); + RETURN_FALSE; + } +} + /* {{{ proto array http_get_request_headers(void) * * Get a list of incoming HTTP headers.