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;
}
struct tm nowtm;
char datetime[20] = {0};
- now = HTTP_GET_REQUEST_TIME();
+ now = HTTP_G->request.time;
strftime(datetime, sizeof(datetime), "%Y-%m-%d %H:%M:%S", php_localtime_r(&now, &nowtm));
#define HTTP_LOG_WRITE(file, type, msg) \
if ((SUCCESS != zend_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void *) &hsv)) || (Z_TYPE_PP(hsv) != IS_ARRAY)) {
return NULL;
}
- if ((SUCCESS != zend_hash_find(Z_ARRVAL_PP(hsv), (char *) key, key_size, (void *) &var)) || (Z_TYPE_PP(var) != IS_STRING)) {
+ if ((SUCCESS != zend_hash_find(Z_ARRVAL_PP(hsv), (char *) key, key_size, (void *) &var))) {
return NULL;
}
- if (check && !(Z_STRVAL_PP(var) && Z_STRLEN_PP(var))) {
+ if (check && !((Z_TYPE_PP(var) == IS_STRING) && Z_STRVAL_PP(var) && Z_STRLEN_PP(var))) {
return NULL;
}
return *var;
/* }}} */
/* {{{ 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
st == ST_ASSIGN ? "ASSIGN" :
st == ST_ADD ? "ADD":
"HUH?"
- ), *c, tk, tv
+ ), *c?*c:'0', tk, tv
);
STR_FREE(tk); STR_FREE(tv);
#endif
+ continued:
switch (st) {
case ST_QUOTE:
quote:
case '\0':
goto add;
break;
-
+ case ',':
+ if (flags & HTTP_PARAMS_ALLOW_COMMA) {
+ goto add;
+ }
default:
if (!val) {
val = c;
case ST_KEY:
switch (*c) {
case ',':
- if (allow_comma_sep) {
+ if (flags & HTTP_PARAMS_ALLOW_COMMA) {
goto allow_comma;
}
case '\r':
case '\0':
allow_comma:
if (key) {
- keylen = c - key;
+ keylen = c-- - key;
st = ST_ADD;
}
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;
keylen = vallen = 0;
break;
}
-
if (*c) {
++c;
} else if (st == ST_ADD) {
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;
}