| From bb23caf7db4e9112089e1502aa8c106178095e7e Mon Sep 17 00:00:00 2001 |
| From: Carlos Garcia Campos <cgarcia@igalia.com> |
| Date: Tue, 21 Mar 2017 14:19:46 +0100 |
| Subject: [PATCH] soup-message-io: Do not fail when there's no empty line after |
| headers |
| |
| The spec says there should be an empty line (\r\n) between the response |
| headers and the body. However, some servers don't include the empty line |
| when the response doesn't have a body. This is causing several WebKit |
| tests to fail, because some of the imported w3c tests do not include |
| that empty line. Those tests pass in firefox, chromium and safari, so at |
| least those other browsers allow that. |
| |
| https://bugzilla.gnome.org/show_bug.cgi?id=780352 |
| --- |
| libsoup/soup-message-io.c | 34 ++++++++++++++++++++-------------- |
| 1 file changed, 20 insertions(+), 14 deletions(-) |
| |
| diff --git a/libsoup/soup-message-io.c b/libsoup/soup-message-io.c |
| index e893ec2a..ea02b1e3 100644 |
| --- a/libsoup/soup-message-io.c |
| +++ b/libsoup/soup-message-io.c |
| @@ -229,12 +229,16 @@ read_headers (SoupMessage *msg, gboolean blocking, |
| cancellable, error); |
| io->read_header_buf->len = old_len + MAX (nread, 0); |
| if (nread == 0) { |
| - soup_message_set_status (msg, SOUP_STATUS_MALFORMED); |
| - g_set_error_literal (error, G_IO_ERROR, |
| - G_IO_ERROR_PARTIAL_INPUT, |
| - _("Connection terminated unexpectedly")); |
| + if (io->read_header_buf->len == 0) { |
| + soup_message_set_status (msg, SOUP_STATUS_MALFORMED); |
| + g_set_error_literal (error, G_IO_ERROR, |
| + G_IO_ERROR_PARTIAL_INPUT, |
| + _("Connection terminated unexpectedly")); |
| + return FALSE; |
| + } |
| + break; |
| } |
| - if (nread <= 0) |
| + if (nread < 0) |
| return FALSE; |
| |
| if (got_lf) { |
| @@ -251,15 +255,17 @@ read_headers (SoupMessage *msg, gboolean blocking, |
| } |
| } |
| |
| - /* We need to "rewind" io->read_header_buf back one line. |
| - * That SHOULD be two characters (CR LF), but if the |
| - * web server was stupid, it might only be one. |
| - */ |
| - if (io->read_header_buf->len < 3 || |
| - io->read_header_buf->data[io->read_header_buf->len - 2] == '\n') |
| - io->read_header_buf->len--; |
| - else |
| - io->read_header_buf->len -= 2; |
| + if (got_lf) { |
| + /* We need to "rewind" io->read_header_buf back one line. |
| + * That SHOULD be two characters (CR LF), but if the |
| + * web server was stupid, it might only be one. |
| + */ |
| + if (io->read_header_buf->len < 3 || |
| + io->read_header_buf->data[io->read_header_buf->len - 2] == '\n') |
| + io->read_header_buf->len--; |
| + else |
| + io->read_header_buf->len -= 2; |
| + } |
| io->read_header_buf->data[io->read_header_buf->len] = '\0'; |
| |
| return TRUE; |
| -- |
| 2.11.0 |
| |