]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http: Fixed handling responses whose header arrives in smaller pieces.
authorTimo Sirainen <tss@iki.fi>
Thu, 11 Jul 2013 06:25:53 +0000 (09:25 +0300)
committerTimo Sirainen <tss@iki.fi>
Thu, 11 Jul 2013 06:25:53 +0000 (09:25 +0300)
src/lib-http/http-response-parser.c
src/lib-http/test-http-response-parser.c

index 35651cf3834b3c950760aa9c1c557e2d55e2ac78..7e9c469ef2f6cd7fc7c31d5ac4d52dd1ed1aacd6 100644 (file)
@@ -376,14 +376,13 @@ int http_response_parse_next(struct http_response_parser *parser,
                        *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;
index 95cfaeb556e2901f41ccfdad7cabdf6310617a29..365a46d2ec13720f21fe03ca088fd9a2d2fe4695 100644 (file)
@@ -99,19 +99,26 @@ static void test_http_response_parse_valid(void)
                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 @@ static void test_http_response_parse_valid(void)
                        } else {
                                payload = NULL;
                        }
+                       ret = http_response_parse_next(parser, FALSE, &response, &error);
                }
 
                test_out("parse success", ret == 0);