Merge branch 'master' into phpng
[m6w6/ext-http] / php_http_version.c
index fbe94118cf53532bc603b52fbe46f160f14a3951..5e8008dc2aacb3f19e9a80161d804270d3cf34cc 100644 (file)
@@ -12,7 +12,7 @@
 
 #include "php_http_api.h"
 
-php_http_version_t *php_http_version_init(php_http_version_t *v, unsigned major, unsigned minor TSRMLS_DC)
+php_http_version_t *php_http_version_init(php_http_version_t *v, unsigned major, unsigned minor)
 {
        if (!v) {
                v = emalloc(sizeof(*v));
@@ -24,10 +24,10 @@ php_http_version_t *php_http_version_init(php_http_version_t *v, unsigned major,
        return v;
 }
 
-php_http_version_t *php_http_version_parse(php_http_version_t *v, const char *str TSRMLS_DC)
+php_http_version_t *php_http_version_parse(php_http_version_t *v, const char *str)
 {
-       php_http_version_t tmp;
-       char separator = 0, *stop = NULL;
+       long major, minor;
+       char separator = 0;
        register const char *ptr = str;
 
        switch (*ptr) {
@@ -40,17 +40,17 @@ php_http_version_t *php_http_version_parse(php_http_version_t *v, const char *st
                ++ptr;
                /* no break */
        default:
-               tmp.major = strtol(ptr, &stop, 10);
-               if (stop && stop != ptr && tmp.major != LONG_MIN && tmp.major != LONG_MAX) {
-                       separator = *stop;
+               /* rfc7230#2.6 The HTTP version number consists of two decimal digits separated by a "." (period or decimal point) */
+               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);
+                                       php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Non-standard version separator '%c' in HTTP protocol version '%s'", separator, ptr - 2);
                                }
-                               ptr = stop + 1;
-                               tmp.minor = strtol(ptr, &stop, 10);
-                               if (tmp.minor != LONG_MIN && tmp.minor != LONG_MAX) {
-                                       return php_http_version_init(v, tmp.major, tmp.minor TSRMLS_CC);
+                               minor = *ptr - '0';
+                               if (minor >= 0 && minor <= 9) {
+                                       return php_http_version_init(v, major, minor TSRMLS_CC);
                                }
                        }
                }
@@ -60,7 +60,7 @@ php_http_version_t *php_http_version_parse(php_http_version_t *v, const char *st
        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)
+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 : "");
 }