- adjust ini entry names to those of the globals struct
[m6w6/ext-http] / http_api.c
index 33cd17d1009c6adf5efc5050f3561a363725ac7d..22542083ee1e88b3a01bbbe46909ae644f1dc281 100644 (file)
@@ -33,6 +33,11 @@ PHP_MINIT_FUNCTION(http_support)
        HTTP_LONG_CONSTANT("HTTP_SUPPORT_ENCODINGS", HTTP_SUPPORT_ENCODINGS);
        HTTP_LONG_CONSTANT("HTTP_SUPPORT_SSLREQUESTS", HTTP_SUPPORT_SSLREQUESTS);
        
+       HTTP_LONG_CONSTANT("HTTP_PARAMS_ALLOW_COMMA", HTTP_PARAMS_ALLOW_COMMA);
+       HTTP_LONG_CONSTANT("HTTP_PARAMS_ALLOW_FAILURE", HTTP_PARAMS_ALLOW_FAILURE);
+       HTTP_LONG_CONSTANT("HTTP_PARAMS_RAISE_ERROR", HTTP_PARAMS_RAISE_ERROR);
+       HTTP_LONG_CONSTANT("HTTP_PARAMS_DEFAULT", HTTP_PARAMS_DEFAULT);
+       
        return SUCCESS;
 }
 
@@ -154,8 +159,7 @@ STATUS _http_exit_ex(int status, char *header, char *body, zend_bool send_header
                PHPWRITE(body, strlen(body));
        }
        
-       switch (status)
-       {
+       switch (status) {
                case 301:       http_log(HTTP_G->log.redirect, "301-REDIRECT", header);                 break;
                case 302:       http_log(HTTP_G->log.redirect, "302-REDIRECT", header);                 break;
                case 303:       http_log(HTTP_G->log.redirect, "303-REDIRECT", header);                 break;
@@ -317,7 +321,7 @@ PHP_HTTP_API void _http_parse_params_default_callback(void *arg, const char *key
 /* }}} */
 
 /* {{{ STATUS http_parse_params(const char *, HashTable *) */
-PHP_HTTP_API STATUS _http_parse_params_ex(const char *param, int allow_comma_sep, http_parse_params_callback cb, void *cb_arg TSRMLS_DC)
+PHP_HTTP_API STATUS _http_parse_params_ex(const char *param, int flags, http_parse_params_callback cb, void *cb_arg TSRMLS_DC)
 {
 #define ST_QUOTE       1
 #define ST_VALUE       2
@@ -358,12 +362,12 @@ PHP_HTTP_API STATUS _http_parse_params_ex(const char *param, int allow_comma_sep
                                                st == ST_ASSIGN ? "ASSIGN" :
                                                st == ST_ADD ? "ADD":
                                                "HUH?"
-                               ), *c, tk, tv
+                               ), *c?*c:'0', tk, tv
                );
                STR_FREE(tk); STR_FREE(tv);
 #endif
-               switch (st)
-               {
+       continued:
+               switch (st) {
                        case ST_QUOTE:
                        quote:
                                if (*c == '"') {
@@ -382,38 +386,39 @@ PHP_HTTP_API STATUS _http_parse_params_ex(const char *param, int allow_comma_sep
                                                st = ST_ADD;
                                        }
                                }
-                       break;
+                               break;
                                
                        case ST_VALUE:
-                               switch (*c)
-                               {
+                               switch (*c) {
                                        case '"':
                                                if (!val) {
                                                        st = ST_QUOTE;
                                                }
-                                       break;
+                                               break;
                                        
                                        case ' ':
-                                       break;
+                                               break;
                                        
                                        case ';':
                                        case '\0':
                                                goto add;
-                                       break;
-                                       
+                                               break;
+                                       case ',':
+                                               if (flags & HTTP_PARAMS_ALLOW_COMMA) {
+                                                       goto add;
+                                               }
                                        default:
                                                if (!val) {
                                                        val = c;
                                                }
-                                       break;
+                                               break;
                                }
-                       break;
+                               break;
                                
                        case ST_KEY:
-                               switch (*c)
-                               {
+                               switch (*c) {
                                        case ',':
-                                               if (allow_comma_sep) {
+                                               if (flags & HTTP_PARAMS_ALLOW_COMMA) {
                                                        goto allow_comma;
                                                }
                                        case '\r':
@@ -422,7 +427,7 @@ PHP_HTTP_API STATUS _http_parse_params_ex(const char *param, int allow_comma_sep
                                        case '\013':
                                        case '\014':
                                                goto failure;
-                                       break;
+                                               break;
                                        
                                        case '=':
                                                if (key) {
@@ -431,41 +436,41 @@ PHP_HTTP_API STATUS _http_parse_params_ex(const char *param, int allow_comma_sep
                                                } else {
                                                        goto failure;
                                                }
-                                       break;
+                                               break;
                                        
                                        case ' ':
                                                if (key) {
                                                        keylen = c - key;
                                                        st = ST_ASSIGN;
                                                }
-                                       break;
+                                               break;
                                        
                                        case ';':
                                        case '\0':
                                        allow_comma:
                                                if (key) {
-                                                       keylen = c - key;
+                                                       keylen = c-- - key;
                                                        st = ST_ADD;
                                                }
-                                       break;
+                                               break;
                                        
                                        default:
                                                if (!key) {
                                                        key = c;
                                                }
-                                       break;
+                                               break;
                                }
-                       break;
+                               break;
                                
                        case ST_ASSIGN:
                                if (*c == '=') {
                                        st = ST_VALUE;
-                               } else if (!*c || *c == ';') {
+                               } else if (!*c || *c == ';' || ((flags & HTTP_PARAMS_ALLOW_COMMA) && *c == ',')) {
                                        st = ST_ADD;
                                } else if (*c != ' ') {
                                        goto failure;
                                }
-                       break;
+                               break;
                                
                        case ST_ADD:
                        add:
@@ -484,9 +489,8 @@ PHP_HTTP_API STATUS _http_parse_params_ex(const char *param, int allow_comma_sep
                                st = ST_KEY;
                                key = val = NULL;
                                keylen = vallen = 0;
-                       break;
+                               break;
                }
-               
                if (*c) {
                        ++c;
                } else if (st == ST_ADD) {
@@ -500,7 +504,14 @@ PHP_HTTP_API STATUS _http_parse_params_ex(const char *param, int allow_comma_sep
        return SUCCESS;
        
 failure:
-       http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, "Unexpected character (%c) at pos %tu of %zu", *c, c-s, strlen(s));
+       if (flags & HTTP_PARAMS_RAISE_ERROR) {
+               http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, "Unexpected character (%c) at pos %tu of %zu", *c, c-s, strlen(s));
+       }
+       if (flags & HTTP_PARAMS_ALLOW_FAILURE) {
+               --c;
+               st = ST_ADD;
+               goto continued;
+       }
        efree(s);
        return FAILURE;
 }