2 +--------------------------------------------------------------------+
4 +--------------------------------------------------------------------+
5 | Redistribution and use in source and binary forms, with or without |
6 | modification, are permitted provided that the conditions mentioned |
7 | in the accompanying LICENSE file are met. |
8 +--------------------------------------------------------------------+
9 | Copyright (c) 2004-2010, Michael Wallner <mike@php.net> |
10 +--------------------------------------------------------------------+
13 /* $Id: http_api.c 300299 2010-06-09 06:23:16Z mike $ */
17 PHP_HTTP_API
void php_http_params_parse_default_func(void *arg
, const char *key
, int keylen
, const char *val
, int vallen TSRMLS_DC
)
21 HashTable
*ht
= (HashTable
*) arg
;
24 INIT_PZVAL_ARRAY(&tmp
, ht
);
30 kdup
= estrndup(key
, keylen
);
31 add_assoc_stringl_ex(entry
, kdup
, keylen
+ 1, (char *) val
, vallen
, 1);
34 add_next_index_stringl(entry
, (char *) val
, vallen
, 1);
36 add_next_index_zval(&tmp
, entry
);
38 add_next_index_stringl(&tmp
, (char *) key
, keylen
, 1);
43 PHP_HTTP_API STATUS
php_http_params_parse(const char *param
, int flags
, php_http_params_parse_func_t cb
, void *cb_arg TSRMLS_DC
)
51 int st
= ST_KEY
, keylen
= 0, vallen
= 0;
52 char *s
, *c
, *key
= NULL
, *val
= NULL
;
55 cb
= php_http_params_parse_default_func
;
58 for(c
= s
= estrdup(param
);;) {
62 char *tk
= NULL
, *tv
= NULL
;
66 tk
= estrndup(key
, keylen
);
70 tk
[3]='.'; tk
[4]='.'; tk
[5]='.';
75 tv
= estrndup(val
, vallen
);
79 tv
[3]='.'; tv
[4]='.'; tv
[5]='.';
82 fprintf(stderr
, "[%6s] %c \"%s=%s\"\n",
84 st
== ST_QUOTE
? "QUOTE" :
85 st
== ST_VALUE
? "VALUE" :
86 st
== ST_KEY
? "KEY" :
87 st
== ST_ASSIGN
? "ASSIGN" :
92 STR_FREE(tk
); STR_FREE(tv
);
100 memmove(c
-1, c
, strlen(c
)+1);
132 if (flags
& PHP_HTTP_PARAMS_ALLOW_COMMA
) {
146 if (flags
& PHP_HTTP_PARAMS_ALLOW_COMMA
) {
174 if (!(flags
& PHP_HTTP_PARAMS_COLON_SEPARATOR
)) {
186 if (flags
& PHP_HTTP_PARAMS_COLON_SEPARATOR
) {
209 } else if (!*c
|| *c
== ';' || ((flags
& PHP_HTTP_PARAMS_ALLOW_COMMA
) && *c
== ',')) {
211 } else if (*c
!= ' ') {
220 if (st
!= ST_QUOTE
) {
221 while (val
[vallen
-1] == ' ') --vallen
;
228 cb(cb_arg
, key
, keylen
, val
, vallen TSRMLS_CC
);
237 } else if (st
== ST_ADD
) {
248 if (flags
& PHP_HTTP_PARAMS_RAISE_ERROR
) {
249 php_http_error(HE_WARNING
, PHP_HTTP_E_INVALID_PARAM
, "Unexpected character (%c) at pos %tu of %zu", *c
, c
-s
, strlen(s
));
251 if (flags
& PHP_HTTP_PARAMS_ALLOW_FAILURE
) {
274 * vim600: noet sw=4 ts=4 fdm=marker
275 * vim<600: noet sw=4 ts=4