[libsoup] header-parsing.c: Add tests for new bad-header-parsing rules



commit 13ab5e6145eede86acd3038b537444142e77bed6
Author: Dan Winship <danw gnome org>
Date:   Sun Apr 19 11:25:14 2009 -0400

    header-parsing.c: Add tests for new bad-header-parsing rules
---
 tests/header-parsing.c |   89 +++++++++++++++++++++++++++++++++---------------
 1 files changed, 61 insertions(+), 28 deletions(-)

diff --git a/tests/header-parsing.c b/tests/header-parsing.c
index 918c119..4c45140 100644
--- a/tests/header-parsing.c
+++ b/tests/header-parsing.c
@@ -243,6 +243,17 @@ static struct RequestTest {
 	  }
 	},
 
+	/* qv bug 579318, do_bad_header_tests() below */
+	{ "Req w/ mangled header",
+	  "GET / HTTP/1.1\r\nHost: example.com\r\nFoo one\r\nBar: two\r\n", -1,
+	  SOUP_STATUS_OK,
+	  "GET", "/", SOUP_HTTP_1_1,
+	  { { "Host", "example.com" },
+	    { "Bar", "two" },
+	    { NULL }
+	  }
+	},
+
 	/************************/
 	/*** INVALID REQUESTS ***/
 	/************************/
@@ -303,13 +314,6 @@ static struct RequestTest {
 	  { { NULL } }
 	},
 
-	{ "Header line with no ':'",
-	  "GET / HTTP/1.1\r\nHost example.com\r\n", -1,
-	  SOUP_STATUS_BAD_REQUEST,
-	  NULL, NULL, -1,
-	  { { NULL } }
-	},
-
 	{ "No terminating CRLF",
 	  "GET / HTTP/1.1\r\nHost: example.com", -1,
 	  SOUP_STATUS_BAD_REQUEST,
@@ -317,27 +321,6 @@ static struct RequestTest {
 	  { { NULL } }
 	},
 
-	{ "Blank line before headers",
-	  "GET / HTTP/1.1\r\n\r\nHost: example.com\r\n", -1,
-	  SOUP_STATUS_BAD_REQUEST,
-	  NULL, NULL, -1,
-	  { { NULL } }
-	},
-
-	{ "Blank line in headers",
-	  "GET / HTTP/1.1\r\nHost: example.com\r\n\r\nConnection: close\r\n", -1,
-	  SOUP_STATUS_BAD_REQUEST,
-	  NULL, NULL, -1,
-	  { { NULL } }
-	},
-
-	{ "Blank line after headers",
-	  "GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n", -1,
-	  SOUP_STATUS_BAD_REQUEST,
-	  NULL, NULL, -1,
-	  { { NULL } }
-	},
-
 	{ "Unrecognized expectation",
 	  "GET / HTTP/1.1\r\nHost: example.com\r\nExpect: the-impossible\r\n", -1,
 	  SOUP_STATUS_EXPECTATION_FAILED,
@@ -468,6 +451,7 @@ static struct ResponseTest {
 	  }
 	},
 
+	/* Shoutcast support */
 	{ "Shoutcast server not-quite-HTTP",
 	  "ICY 200 OK\r\nFoo: bar\r\n", -1,
 	  SOUP_HTTP_1_0, SOUP_STATUS_OK, "OK",
@@ -476,6 +460,16 @@ static struct ResponseTest {
 	  }
 	},
 
+	/* qv bug 579318, do_bad_header_tests() below */
+	{ "Response w/ mangled header",
+	  "HTTP/1.1 200 ok\r\nFoo: one\r\nBar two:2\r\nBaz: three\r\n", -1,
+	  SOUP_HTTP_1_1, SOUP_STATUS_OK, "ok",
+	  { { "Foo", "one" },
+	    { "Baz", "three" },
+	    { NULL }
+	  }
+	},
+
 	/*************************/
 	/*** INVALID RESPONSES ***/
 	/*************************/
@@ -986,6 +980,44 @@ do_append_param_tests (void)
 	} else
 		debug_printf (1, "  OK\n");
 	g_string_free (params, TRUE);
+
+	debug_printf (1, "\n");
+}
+
+static const struct {
+	const char *description, *name, *value;
+} bad_headers[] = {
+	{ "Empty name", "", "value" },
+	{ "Name with spaces", "na me", "value" },
+	{ "Name with colon", "na:me", "value" },
+	{ "Name with CR", "na\rme", "value" },
+	{ "Name with LF", "na\nme", "value" },
+	{ "Name with tab", "na\tme", "value" },
+	{ "Value with CR", "name", "val\rue" },
+	{ "Value with LF", "name", "val\nue" },
+	{ "Value with LWS", "name", "val\r\n ue" }
+};
+
+static void
+do_bad_header_tests (void)
+{
+	SoupMessageHeaders *hdrs;
+	int i;
+
+	debug_printf (1, "bad header rejection tests\n");
+
+	hdrs = soup_message_headers_new (SOUP_MESSAGE_HEADERS_MULTIPART);
+	for (i = 0; i < G_N_ELEMENTS (bad_headers); i++) {
+		debug_printf (1, "  %s\n", bad_headers[i].description);
+		expect_warning = TRUE;
+		soup_message_headers_append (hdrs, bad_headers[i].name,
+					     bad_headers[i].value);
+		if (expect_warning) {
+			expect_warning = FALSE;
+			debug_printf (1, "    FAILED: soup_message_headers_append() did not reject it\n");
+			errors++;
+		}
+	}
 }
 
 int
@@ -999,6 +1031,7 @@ main (int argc, char **argv)
 	do_rfc2231_tests ();
 	do_content_type_tests ();
 	do_append_param_tests ();
+	do_bad_header_tests ();
 
 	test_cleanup ();
 	return errors != 0;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]