X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=php_http_message_parser.c;h=5acf66f76529f18d20cce5fdcd40f6a9465fe8b0;hb=c0d96fe2c0d156412bcb22bf5b9f5e9ed0046c9c;hp=4162e3710cf060f027840bf92a16a4524de54803;hpb=5389d7b1cc701efea82a2c6cbb1cc1b234f705e3;p=m6w6%2Fext-http diff --git a/php_http_message_parser.c b/php_http_message_parser.c index 4162e37..5acf66f 100644 --- a/php_http_message_parser.c +++ b/php_http_message_parser.c @@ -46,11 +46,11 @@ PHP_HTTP_API php_http_message_parser_t *php_http_message_parser_init(php_http_me PHP_HTTP_API php_http_message_parser_state_t php_http_message_parser_state_push(php_http_message_parser_t *parser, unsigned argc, ...) { + php_http_message_parser_state_t state; va_list va_args; unsigned i; - va_start(va_args, argc); - php_http_message_parser_state_t state; + va_start(va_args, argc); for (i = 0; i < argc; ++i) { state = va_arg(va_args, php_http_message_parser_state_t); zend_stack_push(&parser->stack, &state, sizeof(state)); @@ -117,38 +117,31 @@ PHP_HTTP_API php_http_message_parser_state_t php_http_message_parser_parse_strea case PHP_HTTP_MESSAGE_PARSER_STATE_HEADER: case PHP_HTTP_MESSAGE_PARSER_STATE_HEADER_DONE: /* read line */ - php_stream_get_line(s, buf.data, buf.free, &len); - buf.used += len; - buf.free -= len; + php_stream_get_line(s, buf.data + buf.used, buf.free, &len); + php_http_buffer_account(&buf, len); break; case PHP_HTTP_MESSAGE_PARSER_STATE_BODY_DUMB: /* read all */ - len = php_stream_read(s, buf.data, buf.free); - buf.used += len; - buf.free -= len; + php_http_buffer_account(&buf, php_stream_read(s, buf.data + buf.used, buf.free)); break; case PHP_HTTP_MESSAGE_PARSER_STATE_BODY_LENGTH: /* read body_length */ - len = php_stream_read(s, buf.data, MIN(buf.free, parser->body_length)); - buf.used += len; - buf.free -= len; + php_http_buffer_account(&buf, php_stream_read(s, buf.data + buf.used, MIN(buf.free, parser->body_length))); break; case PHP_HTTP_MESSAGE_PARSER_STATE_BODY_CHUNKED: /* duh, this is very naive */ if (len) { - size_t read = php_stream_read(s, buf.data, MIN(len, buf.free)); + size_t read = php_stream_read(s, buf.data + buf.used, MIN(len, buf.free)); - buf.used += read; - buf.free -= read; + php_http_buffer_account(&buf, read); len -= read; } else { php_stream_get_line(s, buf.data, buf.free, &len); - buf.used += len; - buf.free -= len; + php_http_buffer_account(&buf, len); len = strtoul(buf.data - len, NULL, 16); } @@ -213,7 +206,7 @@ PHP_HTTP_API php_http_message_parser_state_t php_http_message_parser_parse(php_h { unsigned header_parser_flags = (flags & PHP_HTTP_MESSAGE_PARSER_CLEANUP) ? PHP_HTTP_HEADER_PARSER_CLEANUP : 0; - switch (php_http_header_parser_parse(&parser->header, buffer, header_parser_flags, &(*message)->hdrs, (php_http_info_callback_t) php_http_message_info_callback, message)) { + switch (php_http_header_parser_parse(&parser->header, buffer, header_parser_flags, *message ? &(*message)->hdrs : NULL, (php_http_info_callback_t) php_http_message_info_callback, message)) { case PHP_HTTP_HEADER_PARSER_STATE_FAILURE: return PHP_HTTP_MESSAGE_PARSER_STATE_FAILURE; @@ -399,7 +392,7 @@ PHP_HTTP_API php_http_message_parser_state_t php_http_message_parser_parse(php_h len = buffer->used; cut = len; - php_http_message_parser_state_push(parser, 2, !buffer->used?PHP_HTTP_MESSAGE_PARSER_STATE_BODY_DONE:PHP_HTTP_MESSAGE_PARSER_STATE_BODY_DUMB, PHP_HTTP_MESSAGE_PARSER_STATE_BODY); + php_http_message_parser_state_push(parser, 2, PHP_HTTP_MESSAGE_PARSER_STATE_BODY_DONE, PHP_HTTP_MESSAGE_PARSER_STATE_BODY); break; }