{PHP_HTTP_HEADER_PARSER_STATE_DONE, 0}
};
-php_http_header_parser_t *php_http_header_parser_init(php_http_header_parser_t *parser TSRMLS_DC)
+php_http_header_parser_t *php_http_header_parser_init(php_http_header_parser_t *parser)
{
if (!parser) {
parser = emalloc(sizeof(*parser));
}
memset(parser, 0, sizeof(*parser));
- TSRMLS_SET_CTX(parser->ts);
-
return parser;
}
php_http_header_parser_state_t php_http_header_parser_state_is(php_http_header_parser_t *parser)
{
- php_http_header_parser_state_t state;
-
if (parser->stack.top) {
- return (php_http_header_parser_state_t) zend_ptr_stack_top(&parser->stack);
+ return (php_http_header_parser_state_t) parser->stack.elements[parser->stack.top - 1];
}
return PHP_HTTP_HEADER_PARSER_STATE_START;
{
zend_ptr_stack_destroy(&parser->stack);
php_http_info_dtor(&parser->info);
- STR_FREE(parser->_key.str);
- STR_FREE(parser->_val.str);
+ PTR_FREE(parser->_key.str);
+ PTR_FREE(parser->_val.str);
}
void php_http_header_parser_free(php_http_header_parser_t **parser)
}
}
-STATUS php_http_header_parser_parse(php_http_header_parser_t *parser, php_http_buffer_t *buffer, unsigned flags, HashTable *headers, php_http_info_callback_t callback_func, void *callback_arg)
+php_http_header_parser_state_t php_http_header_parser_parse(php_http_header_parser_t *parser, php_http_buffer_t *buffer, unsigned flags, HashTable *headers, php_http_info_callback_t callback_func, void *callback_arg)
{
- TSRMLS_FETCH_FROM_CTX(parser->ts);
-
while (buffer->used || !php_http_header_parser_states[php_http_header_parser_state_is(parser)].need_data) {
#if 0
- const char *state[] = {"START", "KEY", "VALUE", "HEADER_DONE", "DONE"};
- fprintf(stderr, "#HP: %s (avail:%zu, num:%d)\n", php_http_header_parser_state_is(parser) < 0 ? "FAILURE" : state[php_http_header_parser_state_is(parser)], buffer->used, headers?zend_hash_num_elements(headers):0);
+ const char *state[] = {"START", "KEY", "VALUE", "VALUE_EX", "HEADER_DONE", "DONE"};
+ int num_headers = headers ? zend_hash_num_elements(headers) : 0;
+ fprintf(stderr, "#HP: (%d) %s (avail:%zu, num:%d)\n", php_http_header_parser_state_is(parser),
+ php_http_header_parser_state_is(parser) < 0 ? "FAILURE" : state[php_http_header_parser_state_is(parser)],
+ buffer->used, num_headers);
_dpf(0, buffer->data, buffer->used);
#endif
switch (php_http_header_parser_state_pop(parser)) {
/* end of headers */
php_http_buffer_cut(buffer, 0, eol_len);
php_http_header_parser_state_push(parser, 1, PHP_HTTP_HEADER_PARSER_STATE_DONE);
- } else if (php_http_info_parse(&parser->info, php_http_buffer_fix(buffer)->data TSRMLS_CC)) {
+ } else if (php_http_info_parse(&parser->info, php_http_buffer_fix(buffer)->data)) {
/* new message starting with request/response line */
if (callback_func) {
- callback_func(callback_arg, &headers, &parser->info TSRMLS_CC);
+ callback_func(callback_arg, &headers, &parser->info);
}
php_http_info_dtor(&parser->info);
php_http_buffer_cut(buffer, 0, eol_str + eol_len - buffer->data);
case PHP_HTTP_HEADER_PARSER_STATE_HEADER_DONE:
if (parser->_key.str && parser->_val.str) {
- zval array, **exist;
+ zval tmp, *exist;
if (!headers && callback_func) {
- callback_func(callback_arg, &headers, NULL TSRMLS_CC);
+ callback_func(callback_arg, &headers, NULL);
}
- INIT_PZVAL_ARRAY(&array, headers);
php_http_pretty_key(parser->_key.str, parser->_key.len, 1, 1);
- if (SUCCESS == zend_symtable_find(headers, parser->_key.str, parser->_key.len + 1, (void *) &exist)) {
- convert_to_array(*exist);
- add_next_index_stringl(*exist, parser->_val.str, parser->_val.len, 0);
+ if ((exist = zend_symtable_str_find(headers, parser->_key.str, parser->_key.len))) {
+ convert_to_array(exist);
+ add_next_index_str(exist, php_http_cs2zs(parser->_val.str, parser->_val.len));
} else {
- add_assoc_stringl_ex(&array, parser->_key.str, parser->_key.len + 1, parser->_val.str, parser->_val.len, 0);
+ ZVAL_STR(&tmp, php_http_cs2zs(parser->_val.str, parser->_val.len));
+ zend_symtable_str_update(headers, parser->_key.str, parser->_key.len, &tmp);
}
parser->_val.str = NULL;
}
- STR_SET(parser->_key.str, NULL);
- STR_SET(parser->_val.str, NULL);
+ PTR_SET(parser->_key.str, NULL);
+ PTR_SET(parser->_val.str, NULL);
php_http_header_parser_state_push(parser, 1, PHP_HTTP_HEADER_PARSER_STATE_KEY);
break;