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