X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Fphp_http_version.c;h=2cba01e3615ae773eecdec6ca42fe44d1b4d6b72;hb=749dbbaa0e7c5e33d27121dab0f53bda85a67339;hp=7adef9d3c897ce66f5923b981c74bd3b46a992d0;hpb=bdd6edb59194cda9e5fcb393c48ab4230fceb32a;p=m6w6%2Fext-http diff --git a/src/php_http_version.c b/src/php_http_version.c index 7adef9d..2cba01e 100644 --- a/src/php_http_version.c +++ b/src/php_http_version.c @@ -44,25 +44,41 @@ php_http_version_t *php_http_version_parse(php_http_version_t *v, const char *st major = *ptr++ - '0'; if (major >= 0 && major <= 9) { separator = *ptr++; - if (separator) { - if (separator != '.' && separator != ',') { - php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Non-standard version separator '%c' in HTTP protocol version '%s'", separator, ptr - 2); - } + switch (separator) { + default: + php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Non-standard version separator '%c' in HTTP protocol version '%s'", separator, ptr - 2); + /* no break */ + case '.': + case ',': minor = *ptr - '0'; - if (minor >= 0 && minor <= 9) { - return php_http_version_init(v, major, minor TSRMLS_CC); + break; + + case ' ': + if (major > 1) { + minor = 0; + } else { + goto error; } } + if (minor >= 0 && minor <= 9) { + return php_http_version_init(v, major, minor TSRMLS_CC); + } } } + error: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not parse HTTP protocol version '%s'", str); return NULL; } void php_http_version_to_string(php_http_version_t *v, char **str, size_t *len, const char *pre, const char *post TSRMLS_DC) { - *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)