X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_api.c;h=2161d6d571d14f2807c022450122e174a0971e98;hp=317e902ccac993dfc5dd6c9f338ced5255a08a73;hb=815d3dc46b3c98fded874db7b8ef5f0f70dd9927;hpb=f6e558f7886fff36d239ae2fae69d955ac6925ee diff --git a/http_api.c b/http_api.c index 317e902..2161d6d 100644 --- a/http_api.c +++ b/http_api.c @@ -28,7 +28,6 @@ #include "php_version.h" #include "php_streams.h" #include "snprintf.h" -#include "spprintf.h" #include "ext/standard/md5.h" #include "ext/standard/url.h" #include "ext/standard/base64.h" @@ -887,8 +886,10 @@ PHP_HTTP_API char *_http_absolute_uri_ex( const char *host, size_t host_len, unsigned port TSRMLS_DC) { - php_url *purl, furl = {NULL}; +#ifdef ZEND_ENGINE_2 struct servent *se; +#endif + php_url *purl, furl = {NULL}; size_t full_len = 0; zval *zhost = NULL; char *scheme = NULL, *URL = ecalloc(1, HTTP_URI_MAXLEN + 1); @@ -909,14 +910,17 @@ PHP_HTTP_API char *_http_absolute_uri_ex( furl.user = purl->user; furl.pass = purl->pass; furl.path = purl->path; + furl.query = purl->query; furl.fragment = purl->fragment; if (proto) { furl.scheme = scheme = estrdup(proto); } else if (purl->scheme) { furl.scheme = purl->scheme; +#ifdef ZEND_ENGINE_2 } else if (port && (se = getservbyport(htons(port), "tcp"))) { furl.scheme = (scheme = estrdup(se->s_name)); +#endif } else { furl.scheme = "http"; } @@ -925,10 +929,15 @@ PHP_HTTP_API char *_http_absolute_uri_ex( furl.port = port; } else if (purl->port) { furl.port = purl->port; - } else if (strncmp(furl.scheme, "http", 4) && (se = getservbyname(furl.scheme, "tcp"))) { - furl.port = ntohs(se->s_port); + } else if (strncmp(furl.scheme, "http", 4)) { +#ifdef ZEND_ENGINE_2 + if (se = getservbyname(furl.scheme, "tcp")) { + furl.port = ntohs(se->s_port); + } else +#endif + furl.port = 80; } else { - furl.port = furl.scheme[5] ? 443 : 80; + furl.port = (furl.scheme[5] == 's') ? 443 : 80; } if (host) { @@ -982,14 +991,18 @@ PHP_HTTP_API char *_http_absolute_uri_ex( if (furl.path) { HTTP_URI_STRLCATL(URL, full_len, furl.path); - if (furl.query) { - HTTP_URI_STRLCATS(URL, full_len, "?"); - HTTP_URI_STRLCATL(URL, full_len, furl.query); - } - if (furl.fragment) { - HTTP_URI_STRLCATS(URL, full_len, "#"); - HTTP_URI_STRLCATL(URL, full_len, furl.fragment); - } + } else { + HTTP_URI_STRLCATS(URL, full_len, "/"); + } + + if (furl.query) { + HTTP_URI_STRLCATS(URL, full_len, "?"); + HTTP_URI_STRLCATL(URL, full_len, furl.query); + } + + if (furl.fragment) { + HTTP_URI_STRLCATS(URL, full_len, "#"); + HTTP_URI_STRLCATL(URL, full_len, furl.fragment); } if (scheme) { @@ -1456,16 +1469,17 @@ PHP_HTTP_API STATUS _http_split_response_ex(char *response, } } - if (*body && (*body_len = response_len - (*body - header))) { - *body = estrndup(*body, *body_len - 1); + if (*body && (*body_len = (response_len - (*body - header)))) { + *body = estrndup(*body, *body_len); } - return http_parse_headers(header, *body ? *body - header : response_len, headers); + return http_parse_headers_ex(header, *body ? response_len - *body_len : response_len, headers, 1); } /* }}} */ /* {{{ STATUS http_parse_headers(char *, long, zval *) */ -PHP_HTTP_API STATUS _http_parse_headers(char *header, int header_len, HashTable *headers TSRMLS_DC) +PHP_HTTP_API STATUS _http_parse_headers_ex(char *header, int header_len, + HashTable *headers, zend_bool prettify TSRMLS_DC) { char *colon = NULL, *line = NULL, *begin = header; zval array; @@ -1500,6 +1514,11 @@ PHP_HTTP_API STATUS _http_parse_headers(char *header, int header_len, HashTable /* skip empty key */ if (header != colon) { char *key = estrndup(header, colon - header); + + if (prettify) { + key = pretty_key(key, colon - header, 1, 1); + } + value_len += line - colon - 1; /* skip leading ws */ @@ -1533,17 +1552,26 @@ PHP_HTTP_API STATUS _http_parse_headers(char *header, int header_len, HashTable } /* }}} */ -/* {{{ void http_get_request_headers(zval *) */ -PHP_HTTP_API void _http_get_request_headers(zval *array TSRMLS_DC) +/* {{{ void http_get_request_headers_ex(HashTable *, zend_bool) */ +PHP_HTTP_API void _http_get_request_headers_ex(HashTable *headers, zend_bool prettify TSRMLS_DC) { char *key = NULL; long idx = 0; + zval array; + + Z_ARRVAL(array) = headers; FOREACH_HASH_KEY(HTTP_SERVER_VARS, key, idx) { if (key && !strncmp(key, "HTTP_", 5)) { zval **header; + + if (prettify) { + key = pretty_key(key + 5, strlen(key) - 5, 1, 1); + } + zend_hash_get_current_data(HTTP_SERVER_VARS, (void **) &header); - add_assoc_stringl(array, pretty_key(key + 5, strlen(key) - 5, 1, 1), Z_STRVAL_PP(header), Z_STRLEN_PP(header), 1); + add_assoc_stringl(&array, key, Z_STRVAL_PP(header), Z_STRLEN_PP(header), 1); + key = NULL; } } }