Z_ARRVAL(array) = headers;
if (crlfcrlf = strstr(header, HTTP_CRLF HTTP_CRLF)) {
- header_len = crlfcrlf - header;
+ header_len = crlfcrlf - header + lenof(HTTP_CRLF);
} else {
- header_len = strlen(header);
+ header_len = strlen(header) + 1;
}
-
+
if (header_len < 2 || !strchr(header, ':')) {
http_error(E_WARNING, HTTP_E_PARSE, "Cannot parse too short or malformed HTTP headers");
/* if we already have got such a header make an array of those */
if (SUCCESS == zend_hash_find(headers, key, keylen + 1, (void **) &previous)) {
- /* already an array? - just add */
- if (Z_TYPE_PP(previous) == IS_ARRAY) {
- add_next_index_stringl(*previous, value, value_len, 0);
- } else {
- /* create the array */
- zval *new_array;
- MAKE_STD_ZVAL(new_array);
- array_init(new_array);
-
- add_next_index_stringl(new_array, Z_STRVAL_PP(previous), Z_STRLEN_PP(previous), 1);
- add_next_index_stringl(new_array, value, value_len, 0);
- add_assoc_zval(&array, key, new_array);
+ /* convert to array */
+ if (Z_TYPE_PP(previous) != IS_ARRAY) {
+ convert_to_array(*previous);
}
-
- previous = NULL;
+ add_next_index_stringl(*previous, value, value_len, 0);
} else {
add_assoc_stringl(&array, key, value, value_len, 0);
}
efree(key);
}
}
- /* stop at CRLF CRLF */
- if (!strncmp(HTTP_CRLF, line + 1, lenof(HTTP_CRLF))) {
- return SUCCESS;
- }
colon = NULL;
value_len = 0;
header += line - header;
}
}
-/* {{{ */
-PHP_HTTP_API STATUS _http_parse_cookie(const char *cookie, HashTable *values TSRMLS_DC)
-{
- const char *key = cookie, *val = NULL;
- int vallen = 0, keylen = 0, done = 0;
- zval array;
-
- Z_ARRVAL(array) = values;
-
- if (!(val = strchr(cookie, '='))) {
- return FAILURE;
- }
-
-#define HTTP_COOKIE_VAL(array, k, str, len) \
- { \
- const char *encoded = str; \
- char *decoded = NULL; \
- int decoded_len = 0, encoded_len = len; \
- decoded = estrndup(encoded, encoded_len); \
- decoded_len = php_url_decode(decoded, encoded_len); \
- add_assoc_stringl(array, k, decoded, decoded_len, 0); \
- }
-#define HTTP_COOKIE_FIXKEY() \
- { \
- while (isspace(*key)) ++key; \
- keylen = val - key; \
- while (isspace(key[keylen - 1])) --keylen; \
- }
-#define HTTP_COOKIE_FIXVAL() \
- { \
- ++val; \
- while (isspace(*val)) ++val; \
- vallen = key - val; \
- while (isspace(val[vallen - 1])) --vallen; \
- }
-
- HTTP_COOKIE_FIXKEY();
- HTTP_COOKIE_VAL(&array, "name", key, keylen);
-
- /* just a name=value cookie */
- if (!(key = strchr(val, ';'))) {
- key = val + strlen(val);
- HTTP_COOKIE_FIXVAL();
- HTTP_COOKIE_VAL(&array, "value", val, vallen);
- }
- /* additional info appended */
- else {
- char *keydup = NULL;
-
- HTTP_COOKIE_FIXVAL();
- HTTP_COOKIE_VAL(&array, "value", val, vallen);
-
- do {
- if (!(val = strchr(key, '='))) {
- break;
- }
- ++key;
- HTTP_COOKIE_FIXKEY();
- keydup = estrndup(key, keylen);
- if (!(key = strchr(val, ';'))) {
- done = 1;
- key = val + strlen(val);
- }
- HTTP_COOKIE_FIXVAL();
- HTTP_COOKIE_VAL(&array, keydup, val, vallen);
- efree(keydup);
- } while (!done);
- }
- return SUCCESS;
-}
-/* }}} */
-
/* {{{ void http_get_request_headers_ex(HashTable *, zend_bool) */
PHP_HTTP_API void _http_get_request_headers_ex(HashTable *headers, zend_bool prettify TSRMLS_DC)
{
}
/* }}} */
+/* {{{ zend_bool http_match_request_header(char *, char *) */
+PHP_HTTP_API zend_bool _http_match_request_header_ex(const char *header, const char *value, zend_bool match_case TSRMLS_DC)
+{
+ char *name, *key = NULL;
+ ulong idx;
+ zend_bool result = 0;
+ HashTable headers;
+
+ name = pretty_key(estrdup(header), strlen(header), 1, 1);
+ zend_hash_init(&headers, 0, NULL, ZVAL_PTR_DTOR, 0);
+ http_get_request_headers_ex(&headers, 1);
+
+ FOREACH_HASH_KEY(&headers, key, idx) {
+ if (key && (!strcmp(key, name))) {
+ zval **data;
+
+ if (SUCCESS == zend_hash_get_current_data(&headers, (void **) &data)) {
+ result = (match_case ? strcmp(Z_STRVAL_PP(data), value) : strcasecmp(Z_STRVAL_PP(data), value)) ? 0 : 1;
+ }
+ break;
+ }
+ }
+
+ zend_hash_destroy(&headers);
+ efree(name);
+
+ return result;
+}
+/* }}} */
+
/*
* Local variables: