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
)
20 HashTable
*ht
= (HashTable
*) arg
;
23 INIT_PZVAL_ARRAY(&tmp
, ht
);
29 add_assoc_stringl_ex(entry
, key
, keylen
+ 1, estrndup(val
, vallen
), vallen
, 0);
31 add_next_index_stringl(entry
, val
, vallen
, 1);
33 add_next_index_zval(&tmp
, entry
);
35 add_next_index_stringl(&tmp
, key
, keylen
, 1);
40 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
)
48 int st
= ST_KEY
, keylen
= 0, vallen
= 0;
49 char *s
, *c
, *key
= NULL
, *val
= NULL
;
52 cb
= php_http_params_parse_default_func
;
55 for(c
= s
= estrdup(param
);;) {
59 char *tk
= NULL
, *tv
= NULL
;
63 tk
= estrndup(key
, keylen
);
67 tk
[3]='.'; tk
[4]='.'; tk
[5]='.';
72 tv
= estrndup(val
, vallen
);
76 tv
[3]='.'; tv
[4]='.'; tv
[5]='.';
79 fprintf(stderr
, "[%6s] %c \"%s=%s\"\n",
81 st
== ST_QUOTE
? "QUOTE" :
82 st
== ST_VALUE
? "VALUE" :
83 st
== ST_KEY
? "KEY" :
84 st
== ST_ASSIGN
? "ASSIGN" :
89 STR_FREE(tk
); STR_FREE(tv
);
97 memmove(c
-1, c
, strlen(c
)+1);
129 if (flags
& PHP_HTTP_PARAMS_ALLOW_COMMA
) {
143 if (flags
& PHP_HTTP_PARAMS_ALLOW_COMMA
) {
171 if (!(flags
& PHP_HTTP_PARAMS_COLON_SEPARATOR
)) {
183 if (flags
& PHP_HTTP_PARAMS_COLON_SEPARATOR
) {
206 } else if (!*c
|| *c
== ';' || ((flags
& PHP_HTTP_PARAMS_ALLOW_COMMA
) && *c
== ',')) {
208 } else if (*c
!= ' ') {
217 if (st
!= ST_QUOTE
) {
218 while (val
[vallen
-1] == ' ') --vallen
;
225 cb(cb_arg
, key
, keylen
, val
, vallen TSRMLS_CC
);
234 } else if (st
== ST_ADD
) {
245 if (flags
& PHP_HTTP_PARAMS_RAISE_ERROR
) {
246 php_http_error(HE_WARNING
, PHP_HTTP_E_INVALID_PARAM
, "Unexpected character (%c) at pos %tu of %zu", *c
, c
-s
, strlen(s
));
248 if (flags
& PHP_HTTP_PARAMS_ALLOW_FAILURE
) {
271 * vim600: noet sw=4 ts=4 fdm=marker
272 * vim<600: noet sw=4 ts=4