From: Michael Wallner Date: Thu, 8 Sep 2016 06:30:51 +0000 (+0200) Subject: Merge branch 'v2.6.x' X-Git-Tag: RELEASE_3_1_0_RC1~33 X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=commitdiff_plain;h=0ccb6d6575f81affd97a78ba1a88641ad41b4b55;hp=9cf5671e4429610d3e82e304e16166c1c44d1566 Merge branch 'v2.6.x' --- diff --git a/src/php_http_info.c b/src/php_http_info.c index 4e43fda..cbaee88 100644 --- a/src/php_http_info.c +++ b/src/php_http_info.c @@ -49,6 +49,46 @@ void php_http_info_free(php_http_info_t **i) } } +void php_http_info_to_string(php_http_info_t *info, char **str, size_t *len, const char *eol) +{ + char *tmp = NULL; + + if (info->http.version.major == 2) { + if (info->type == PHP_HTTP_REQUEST) { + *len = spprintf(str, 0, "%s %s HTTP/2%s", + info->http.info.request.method?info->http.info.request.method:"UNKNOWN", + info->http.info.request.method&&!strcasecmp(info->http.info.request.method,"CONNECT")?( + info->http.info.request.url?php_http_url_authority_to_string(info->http.info.request.url, &(tmp), NULL):"0"):( + info->http.info.request.url?php_http_url_to_string(info->http.info.request.url, &(tmp), NULL, 0):"/"), + eol); + } else if (info->type == PHP_HTTP_RESPONSE) { + *len = spprintf(str, 0, "HTTP/2 %d%s%s%s", + info->http.info.response.code?info->http.info.response.code:200, + info->http.info.response.status&&*info->http.info.response.status ? " ":"", + STR_PTR(info->http.info.response.status), + eol); + } + } else if (info->type == PHP_HTTP_REQUEST) { + *len = spprintf(str, 0, "%s %s HTTP/%u.%u%s", + info->http.info.request.method?info->http.info.request.method:"UNKNOWN", + info->http.info.request.method&&!strcasecmp(info->http.info.request.method,"CONNECT")?( + info->http.info.request.url?php_http_url_authority_to_string(info->http.info.request.url, &(tmp), NULL):"0"):( + info->http.info.request.url?php_http_url_to_string(info->http.info.request.url, &(tmp), NULL, 0):"/"), + info->http.version.major||info->http.version.major?info->http.version.major:1, + info->http.version.major||info->http.version.minor?info->http.version.minor:1, + eol); + } else if (info->type == PHP_HTTP_RESPONSE){ + *len = spprintf(str, 0, "HTTP/%u.%u %d%s%s%s", info->http.version.major||info->http.version.major?info->http.version.major:1, + info->http.version.major||info->http.version.minor?info->http.version.minor:1, + info->http.info.response.code?info->http.info.response.code:200, + info->http.info.response.status&&*info->http.info.response.status ? " ":"", + STR_PTR(info->http.info.response.status), + eol); + } + + PTR_FREE(tmp); +} + php_http_info_t *php_http_info_parse(php_http_info_t *info, const char *pre_header) { const char *end, *http, *off; @@ -80,7 +120,7 @@ php_http_info_t *php_http_info_parse(php_http_info_t *info, const char *pre_head /* clumsy fix for changed libcurl behaviour in 7.49.1, see https://github.com/curl/curl/issues/888 */ off = &http[lenof("HTTP/X")]; - if (info->http.version.major < 2) { + if (info->http.version.major < 2 || (info->http.version.major == 2 && *off == '.')) { off += 2; } diff --git a/src/php_http_info.h b/src/php_http_info.h index 8a52ee2..700dd34 100644 --- a/src/php_http_info.h +++ b/src/php_http_info.h @@ -16,21 +16,6 @@ #include "php_http_version.h" #include "php_http_url.h" -#define PHP_HTTP_INFO_REQUEST_FMT_ARGS(_http_ptr, tmp, eol) "%s %s HTTP/%u.%u" eol, \ - (_http_ptr)->info.request.method?(_http_ptr)->info.request.method:"UNKNOWN", \ - (_http_ptr)->info.request.method&&!strcasecmp((_http_ptr)->info.request.method,"CONNECT")?( \ - (_http_ptr)->info.request.url?php_http_url_authority_to_string((_http_ptr)->info.request.url, &(tmp), NULL):"0"):( \ - (_http_ptr)->info.request.url?php_http_url_to_string((_http_ptr)->info.request.url, &(tmp), NULL, 0):"/"), \ - (_http_ptr)->version.major||(_http_ptr)->version.major?(_http_ptr)->version.major:1, \ - (_http_ptr)->version.major||(_http_ptr)->version.minor?(_http_ptr)->version.minor:1 - -#define PHP_HTTP_INFO_RESPONSE_FMT_ARGS(_http_ptr, tmp, eol) "HTTP/%u.%u %d%s%s" eol, \ - (_http_ptr)->version.major||(_http_ptr)->version.major?(_http_ptr)->version.major:1, \ - (_http_ptr)->version.major||(_http_ptr)->version.minor?(_http_ptr)->version.minor:1, \ - (_http_ptr)->info.response.code?(_http_ptr)->info.response.code:200, \ - (_http_ptr)->info.response.status&&*(_http_ptr)->info.response.status ? " ":"", \ - STR_PTR((_http_ptr)->info.response.status) - typedef struct php_http_info_data { union { /* GET /foo/bar */ @@ -62,6 +47,7 @@ typedef zend_bool (*php_http_info_callback_t)(void **callback_data, HashTable ** PHP_HTTP_API php_http_info_t *php_http_info_init(php_http_info_t *info); PHP_HTTP_API php_http_info_t *php_http_info_parse(php_http_info_t *info, const char *pre_header); +PHP_HTTP_API void php_http_info_to_string(php_http_info_t *info, char **str, size_t *len, const char *eol); PHP_HTTP_API void php_http_info_dtor(php_http_info_t *info); PHP_HTTP_API void php_http_info_free(php_http_info_t **info); diff --git a/src/php_http_message.c b/src/php_http_message.c index 078ae4c..5a5b5ca 100644 --- a/src/php_http_message.c +++ b/src/php_http_message.c @@ -330,24 +330,14 @@ void php_http_message_update_headers(php_http_message_t *msg) static void message_headers(php_http_message_t *msg, php_http_buffer_t *str) { char *tmp = NULL; + size_t len = 0; - switch (msg->type) { - case PHP_HTTP_REQUEST: - php_http_buffer_appendf(str, PHP_HTTP_INFO_REQUEST_FMT_ARGS(&msg->http, tmp, PHP_HTTP_CRLF)); - PTR_FREE(tmp); - break; - - case PHP_HTTP_RESPONSE: - php_http_buffer_appendf(str, PHP_HTTP_INFO_RESPONSE_FMT_ARGS(&msg->http, tmp, PHP_HTTP_CRLF)); - PTR_FREE(tmp); - break; - - default: - break; - } - + php_http_info_to_string((php_http_info_t *) msg, &tmp, &len, PHP_HTTP_CRLF TSRMLS_CC); php_http_message_update_headers(msg); + + php_http_buffer_append(str, tmp, len); php_http_header_to_string(str, &msg->hdrs); + PTR_FREE(tmp); } void php_http_message_to_callback(php_http_message_t *msg, php_http_pass_callback_t cb, void *cb_arg) @@ -1375,25 +1365,12 @@ ZEND_END_ARG_INFO(); static PHP_METHOD(HttpMessage, getInfo) { if (SUCCESS == zend_parse_parameters_none()) { - char *str, *tmp = NULL; - size_t len; + char *str = NULL; + size_t len = 0; php_http_message_object_t *obj = PHP_HTTP_OBJ(NULL, getThis()); PHP_HTTP_MESSAGE_OBJECT_INIT(obj); - - switch (obj->message->type) { - case PHP_HTTP_REQUEST: - len = spprintf(&str, 0, PHP_HTTP_INFO_REQUEST_FMT_ARGS(&obj->message->http, tmp, "")); - PTR_FREE(tmp); - break; - case PHP_HTTP_RESPONSE: - len = spprintf(&str, 0, PHP_HTTP_INFO_RESPONSE_FMT_ARGS(&obj->message->http, tmp, "")); - PTR_FREE(tmp); - break; - default: - RETURN_NULL(); - break; - } + php_http_info_to_string((php_http_info_t *) obj->message, &str, &len, ""); RETVAL_STR(php_http_cs2zs(str, len)); } diff --git a/src/php_http_version.c b/src/php_http_version.c index 7f7d342..043b4b3 100644 --- a/src/php_http_version.c +++ b/src/php_http_version.c @@ -73,7 +73,12 @@ php_http_version_t *php_http_version_parse(php_http_version_t *v, const char *st void php_http_version_to_string(php_http_version_t *v, char **str, size_t *len, const char *pre, const char *post) { - *len = spprintf(str, 0, "%s%u.%u%s", pre ? pre : "", v->major, v->minor, post ? post : ""); + /* different semantics for different versions */ + if (v->major == 2) { + *len = spprintf(str, 0, "%s2%s", STR_PTR(pre), STR_PTR(post)); + } else { + *len = spprintf(str, 0, "%s%u.%u%s", STR_PTR(pre), v->major, v->minor, STR_PTR(post)); + } } void php_http_version_dtor(php_http_version_t *v) diff --git a/tests/client022.phpt b/tests/client022.phpt index a59971c..e813cdc 100644 --- a/tests/client022.phpt +++ b/tests/client022.phpt @@ -31,7 +31,7 @@ nghttpd(function($port) { ===DONE=== --EXPECTF-- Test -HTTP/2.0 200 +HTTP/2 200 %a