dovecot-2.2: lib-http: Fixed handling responses whose header arr...
dovecot at dovecot.org
dovecot at dovecot.org
Thu Jul 11 09:27:04 EEST 2013
details: http://hg.dovecot.org/dovecot-2.2/rev/07fb7d4665c6
changeset: 16597:07fb7d4665c6
user: Timo Sirainen <tss at iki.fi>
date: Thu Jul 11 09:25:53 2013 +0300
description:
lib-http: Fixed handling responses whose header arrives in smaller pieces.
diffstat:
src/lib-http/http-response-parser.c | 11 +++++------
src/lib-http/test-http-response-parser.c | 16 ++++++++++++----
2 files changed, 17 insertions(+), 10 deletions(-)
diffs (65 lines):
diff -r d7244f7ceca4 -r 07fb7d4665c6 src/lib-http/http-response-parser.c
--- a/src/lib-http/http-response-parser.c Thu Jul 11 09:23:14 2013 +0300
+++ b/src/lib-http/http-response-parser.c Thu Jul 11 09:25:53 2013 +0300
@@ -376,14 +376,13 @@
*error_r = parser->error;
return ret;
}
+ /* *( header-field CRLF ) CRLF */
+ if (parser->header_parser == NULL)
+ parser->header_parser = http_header_parser_init(parser->input);
+ else
+ http_header_parser_reset(parser->header_parser);
}
- /* *( header-field CRLF ) CRLF */
- if (parser->header_parser == NULL)
- parser->header_parser = http_header_parser_init(parser->input);
- else
- http_header_parser_reset(parser->header_parser);
-
while ((ret=http_header_parse_next_field
(parser->header_parser, &field_name, &field_data, &field_size, &error)) > 0) {
if (field_name == NULL) break;
diff -r d7244f7ceca4 -r 07fb7d4665c6 src/lib-http/test-http-response-parser.c
--- a/src/lib-http/test-http-response-parser.c Thu Jul 11 09:23:14 2013 +0300
+++ b/src/lib-http/test-http-response-parser.c Thu Jul 11 09:25:53 2013 +0300
@@ -99,19 +99,26 @@
struct ostream *output;
const struct http_response_parse_test *test;
struct http_response_parser *parser;
- struct http_response *response;
+ struct http_response *response = NULL;
const char *response_text, *payload, *error;
- int ret;
+ unsigned int response_text_len;
+ int ret = 0;
test = &valid_response_parse_tests[i];
response_text = test->response;
- input = i_stream_create_from_data(response_text, strlen(response_text));
+ response_text_len = strlen(response_text);
+ input = test_istream_create_data(response_text, response_text_len);
parser = http_response_parser_init(input);
test_begin(t_strdup_printf("http response valid [%d]", i));
payload = NULL;
- while ((ret=http_response_parse_next(parser, FALSE, &response, &error)) > 0) {
+ for (i = 0; i < response_text_len && ret == 0; i++) {
+ test_istream_set_size(input, i);
+ ret = http_response_parse_next(parser, FALSE, &response, &error);
+ }
+ test_istream_set_size(input, response_text_len);
+ while (ret > 0) {
if (response->payload != NULL) {
buffer_set_used_size(payload_buffer, 0);
output = o_stream_create_buffer(payload_buffer);
@@ -122,6 +129,7 @@
} else {
payload = NULL;
}
+ ret = http_response_parse_next(parser, FALSE, &response, &error);
}
test_out("parse success", ret == 0);
More information about the dovecot-cvs
mailing list