|
rpm-build |
4f3c61 |
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
#include "test-utils.h"
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
typedef struct {
|
|
rpm-build |
4f3c61 |
const char *name, *value;
|
|
rpm-build |
4f3c61 |
} Header;
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
static struct RequestTest {
|
|
rpm-build |
4f3c61 |
const char *description;
|
|
rpm-build |
4f3c61 |
const char *bugref;
|
|
rpm-build |
4f3c61 |
const char *request;
|
|
rpm-build |
4f3c61 |
int length;
|
|
rpm-build |
4f3c61 |
guint status;
|
|
rpm-build |
4f3c61 |
const char *method, *path;
|
|
rpm-build |
4f3c61 |
SoupHTTPVersion version;
|
|
rpm-build |
4f3c61 |
Header headers[10];
|
|
rpm-build |
4f3c61 |
} reqtests[] = {
|
|
rpm-build |
4f3c61 |
/**********************/
|
|
rpm-build |
4f3c61 |
/*** VALID REQUESTS ***/
|
|
rpm-build |
4f3c61 |
/**********************/
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "HTTP 1.0 request with no headers", NULL,
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.0\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_0,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Req w/ 1 header", NULL,
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\nHost: example.com\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "Host", "example.com" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Req w/ 1 header, no leading whitespace", NULL,
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\nHost:example.com\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "Host", "example.com" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Req w/ 1 header including trailing whitespace", NULL,
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\nHost: example.com \r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "Host", "example.com" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Req w/ 1 header, wrapped", NULL,
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\nFoo: bar\r\n baz\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "Foo", "bar baz" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Req w/ 1 header, wrapped with additional whitespace", NULL,
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\nFoo: bar \r\n baz\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "Foo", "bar baz" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Req w/ 1 header, wrapped with tab", NULL,
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\nFoo: bar\r\n\tbaz\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "Foo", "bar baz" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Req w/ 1 header, wrapped before value", NULL,
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\nFoo:\r\n bar baz\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "Foo", "bar baz" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Req w/ 1 header with empty value", NULL,
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\nHost:\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "Host", "" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Req w/ 2 headers", NULL,
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "Host", "example.com" },
|
|
rpm-build |
4f3c61 |
{ "Connection", "close" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Req w/ 3 headers", NULL,
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\nBlah: blah\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "Host", "example.com" },
|
|
rpm-build |
4f3c61 |
{ "Connection", "close" },
|
|
rpm-build |
4f3c61 |
{ "Blah", "blah" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Req w/ 3 headers, 1st wrapped", NULL,
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\nFoo: bar\r\n baz\r\nConnection: close\r\nBlah: blah\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "Foo", "bar baz" },
|
|
rpm-build |
4f3c61 |
{ "Connection", "close" },
|
|
rpm-build |
4f3c61 |
{ "Blah", "blah" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Req w/ 3 headers, 2nd wrapped", NULL,
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\nConnection: close\r\nBlah: blah\r\nFoo: bar\r\n baz\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "Connection", "close" },
|
|
rpm-build |
4f3c61 |
{ "Blah", "blah" },
|
|
rpm-build |
4f3c61 |
{ "Foo", "bar baz" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Req w/ 3 headers, 3rd wrapped", NULL,
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\nConnection: close\r\nBlah: blah\r\nFoo: bar\r\n baz\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "Connection", "close" },
|
|
rpm-build |
4f3c61 |
{ "Blah", "blah" },
|
|
rpm-build |
4f3c61 |
{ "Foo", "bar baz" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Req w/ same header multiple times", NULL,
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\nFoo: bar\r\nFoo: baz\r\nFoo: quux\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "Foo", "bar, baz, quux" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Connection header on HTTP/1.0 message", NULL,
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.0\r\nFoo: bar\r\nConnection: Bar, Quux\r\nBar: baz\r\nQuux: foo\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_0,
|
|
rpm-build |
4f3c61 |
{ { "Foo", "bar" },
|
|
rpm-build |
4f3c61 |
{ "Connection", "Bar, Quux" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "GET with full URI", "667637",
|
|
rpm-build |
4f3c61 |
"GET http://example.com HTTP/1.1\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "http://example.com", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "GET with full URI in upper-case", "667637",
|
|
rpm-build |
4f3c61 |
"GET HTTP://example.com HTTP/1.1\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "HTTP://example.com", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
/* It's better for this to be passed through: this means a SoupServer
|
|
rpm-build |
4f3c61 |
* could implement ftp-over-http proxying, for instance
|
|
rpm-build |
4f3c61 |
*/
|
|
rpm-build |
4f3c61 |
{ "GET with full URI of unrecognised scheme", "667637",
|
|
rpm-build |
4f3c61 |
"GET AbOuT: HTTP/1.1\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "AbOuT:", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
/****************************/
|
|
rpm-build |
4f3c61 |
/*** RECOVERABLE REQUESTS ***/
|
|
rpm-build |
4f3c61 |
/****************************/
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
/* RFC 2616 section 4.1 says we SHOULD accept this */
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Spurious leading CRLF", NULL,
|
|
rpm-build |
4f3c61 |
"\r\nGET / HTTP/1.1\r\nHost: example.com\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "Host", "example.com" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
/* RFC 2616 section 3.1 says we MUST accept this */
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "HTTP/01.01 request", NULL,
|
|
rpm-build |
4f3c61 |
"GET / HTTP/01.01\r\nHost: example.com\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "Host", "example.com" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
/* RFC 2616 section 19.3 says we SHOULD accept these */
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "LF instead of CRLF after header", NULL,
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\nHost: example.com\nConnection: close\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "Host", "example.com" },
|
|
rpm-build |
4f3c61 |
{ "Connection", "close" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "LF instead of CRLF after Request-Line", NULL,
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\nHost: example.com\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "Host", "example.com" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Mixed CRLF/LF", "666316",
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\na: b\r\nc: d\ne: f\r\ng: h\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "a", "b" },
|
|
rpm-build |
4f3c61 |
{ "c", "d" },
|
|
rpm-build |
4f3c61 |
{ "e", "f" },
|
|
rpm-build |
4f3c61 |
{ "g", "h" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Req w/ incorrect whitespace in Request-Line", NULL,
|
|
rpm-build |
4f3c61 |
"GET /\tHTTP/1.1\r\nHost: example.com\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "Host", "example.com" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Req w/ incorrect whitespace after Request-Line", "475169",
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1 \r\nHost: example.com\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "Host", "example.com" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
/* If the request/status line is parseable, then we
|
|
rpm-build |
4f3c61 |
* just ignore any invalid-looking headers after that.
|
|
rpm-build |
4f3c61 |
*/
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Req w/ mangled header", "579318",
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\nHost: example.com\r\nFoo one\r\nBar: two\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "Host", "example.com" },
|
|
rpm-build |
4f3c61 |
{ "Bar", "two" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "First header line is continuation", "666316",
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\n b\r\nHost: example.com\r\nc: d\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "Host", "example.com" },
|
|
rpm-build |
4f3c61 |
{ "c", "d" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Zero-length header name", "666316",
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\na: b\r\n: example.com\r\nc: d\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "a", "b" },
|
|
rpm-build |
4f3c61 |
{ "c", "d" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "CR in header name", "666316",
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\na: b\r\na\rb: cd\r\nx\r: y\r\n\rz: w\r\nc: d\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "a", "b" },
|
|
rpm-build |
4f3c61 |
{ "c", "d" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "CR in header value", "666316",
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\na: b\r\nHost: example\rcom\r\np: \rq\r\ns: t\r\r\nc: d\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "a", "b" },
|
|
rpm-build |
4f3c61 |
{ "Host", "example com" }, /* CR in the middle turns to space */
|
|
rpm-build |
4f3c61 |
{ "p", "q" }, /* CR at beginning is ignored */
|
|
rpm-build |
4f3c61 |
{ "s", "t" }, /* CR at end is ignored */
|
|
rpm-build |
4f3c61 |
{ "c", "d" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Tab in header name", "666316",
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\na: b\r\na\tb: cd\r\nx\t: y\r\np: q\r\n\tz: w\r\nc: d\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "a", "b" },
|
|
rpm-build |
4f3c61 |
/* Tab anywhere in the header name causes it to be
|
|
rpm-build |
4f3c61 |
* ignored... except at beginning of line where it's a
|
|
rpm-build |
4f3c61 |
* continuation line
|
|
rpm-build |
4f3c61 |
*/
|
|
rpm-build |
4f3c61 |
{ "p", "q z: w" },
|
|
rpm-build |
4f3c61 |
{ "c", "d" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Tab in header value", "666316",
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\na: b\r\nab: c\td\r\nx: \ty\r\nz: w\t\r\nc: d\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "a", "b" },
|
|
rpm-build |
4f3c61 |
{ "ab", "c\td" }, /* internal tab preserved */
|
|
rpm-build |
4f3c61 |
{ "x", "y" }, /* leading tab ignored */
|
|
rpm-build |
4f3c61 |
{ "z", "w" }, /* trailing tab ignored */
|
|
rpm-build |
4f3c61 |
{ "c", "d" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "NUL in header name", "760832",
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\nHost\x00: example.com\r\n", 36,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "Host", "example.com" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "NUL in header value", "760832",
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\nHost: example\x00" "com\r\n", 35,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_OK,
|
|
rpm-build |
4f3c61 |
"GET", "/", SOUP_HTTP_1_1,
|
|
rpm-build |
4f3c61 |
{ { "Host", "examplecom" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
/************************/
|
|
rpm-build |
4f3c61 |
/*** INVALID REQUESTS ***/
|
|
rpm-build |
4f3c61 |
/************************/
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "HTTP 0.9 request; not supported", NULL,
|
|
rpm-build |
4f3c61 |
"GET /\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_BAD_REQUEST,
|
|
rpm-build |
4f3c61 |
NULL, NULL, -1,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "HTTP 1.2 request (no such thing)", NULL,
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.2\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_HTTP_VERSION_NOT_SUPPORTED,
|
|
rpm-build |
4f3c61 |
NULL, NULL, -1,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "HTTP 2000 request (no such thing)", NULL,
|
|
rpm-build |
4f3c61 |
"GET / HTTP/2000.0\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_HTTP_VERSION_NOT_SUPPORTED,
|
|
rpm-build |
4f3c61 |
NULL, NULL, -1,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Non-HTTP request", NULL,
|
|
rpm-build |
4f3c61 |
"GET / SOUP/1.1\r\nHost: example.com\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_BAD_REQUEST,
|
|
rpm-build |
4f3c61 |
NULL, NULL, -1,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Junk after Request-Line", NULL,
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1 blah\r\nHost: example.com\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_BAD_REQUEST,
|
|
rpm-build |
4f3c61 |
NULL, NULL, -1,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "NUL in Method", NULL,
|
|
rpm-build |
4f3c61 |
"G\x00T / HTTP/1.1\r\nHost: example.com\r\n", 37,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_BAD_REQUEST,
|
|
rpm-build |
4f3c61 |
NULL, NULL, -1,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "NUL at beginning of Method", "666316",
|
|
rpm-build |
4f3c61 |
"\x00 / HTTP/1.1\r\nHost: example.com\r\n", 35,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_BAD_REQUEST,
|
|
rpm-build |
4f3c61 |
NULL, NULL, -1,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "NUL in Path", NULL,
|
|
rpm-build |
4f3c61 |
"GET /\x00 HTTP/1.1\r\nHost: example.com\r\n", 38,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_BAD_REQUEST,
|
|
rpm-build |
4f3c61 |
NULL, NULL, -1,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "No terminating CRLF", NULL,
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\nHost: example.com", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_BAD_REQUEST,
|
|
rpm-build |
4f3c61 |
NULL, NULL, -1,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Unrecognized expectation", NULL,
|
|
rpm-build |
4f3c61 |
"GET / HTTP/1.1\r\nHost: example.com\r\nExpect: the-impossible\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_STATUS_EXPECTATION_FAILED,
|
|
rpm-build |
4f3c61 |
NULL, NULL, -1,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
};
|
|
rpm-build |
4f3c61 |
static const int num_reqtests = G_N_ELEMENTS (reqtests);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
static struct ResponseTest {
|
|
rpm-build |
4f3c61 |
const char *description;
|
|
rpm-build |
4f3c61 |
const char *bugref;
|
|
rpm-build |
4f3c61 |
const char *response;
|
|
rpm-build |
4f3c61 |
int length;
|
|
rpm-build |
4f3c61 |
SoupHTTPVersion version;
|
|
rpm-build |
4f3c61 |
guint status_code;
|
|
rpm-build |
4f3c61 |
const char *reason_phrase;
|
|
rpm-build |
4f3c61 |
Header headers[10];
|
|
rpm-build |
4f3c61 |
} resptests[] = {
|
|
rpm-build |
4f3c61 |
/***********************/
|
|
rpm-build |
4f3c61 |
/*** VALID RESPONSES ***/
|
|
rpm-build |
4f3c61 |
/***********************/
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "HTTP 1.0 response w/ no headers", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.0 200 ok\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_HTTP_1_0, SOUP_STATUS_OK, "ok",
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "HTTP 1.1 response w/ no headers", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.1 200 ok\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_HTTP_1_1, SOUP_STATUS_OK, "ok",
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Response w/ multi-word Reason-Phrase", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.1 400 bad request\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_HTTP_1_1, SOUP_STATUS_BAD_REQUEST, "bad request",
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Response w/ 1 header", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.1 200 ok\r\nFoo: bar\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_HTTP_1_1, SOUP_STATUS_OK, "ok",
|
|
rpm-build |
4f3c61 |
{ { "Foo", "bar" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Response w/ 2 headers", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.1 200 ok\r\nFoo: bar\r\nBaz: quux\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_HTTP_1_1, SOUP_STATUS_OK, "ok",
|
|
rpm-build |
4f3c61 |
{ { "Foo", "bar" },
|
|
rpm-build |
4f3c61 |
{ "Baz", "quux" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Response w/ same header multiple times", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.1 200 ok\r\nFoo: bar\r\nFoo: baz\r\nFoo: quux\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_HTTP_1_1, SOUP_STATUS_OK, "ok",
|
|
rpm-build |
4f3c61 |
{ { "Foo", "bar, baz, quux" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Response w/ no reason phrase", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.1 200 \r\nFoo: bar\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_HTTP_1_1, SOUP_STATUS_OK, "",
|
|
rpm-build |
4f3c61 |
{ { "Foo", "bar" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Response w/ unknown status code", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.1 999 Request denied\r\nFoo: bar\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_HTTP_1_1, 999, "Request denied",
|
|
rpm-build |
4f3c61 |
{ { "Foo", "bar" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Connection header on HTTP/1.0 message", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.0 200 ok\r\nFoo: bar\r\nConnection: Bar\r\nBar: quux\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_HTTP_1_0, SOUP_STATUS_OK, "ok",
|
|
rpm-build |
4f3c61 |
{ { "Foo", "bar" },
|
|
rpm-build |
4f3c61 |
{ "Connection", "Bar" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
/* Tests from Cockpit */
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Response w/ 3 headers, check case-insensitivity", "722341",
|
|
rpm-build |
4f3c61 |
"HTTP/1.0 200 ok\r\nHeader1: value3\r\nHeader2: field\r\nHead3: Another \r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_HTTP_1_0, SOUP_STATUS_OK, "ok",
|
|
rpm-build |
4f3c61 |
{ { "header1", "value3" },
|
|
rpm-build |
4f3c61 |
{ "Header2", "field" },
|
|
rpm-build |
4f3c61 |
{ "hEAD3", "Another" },
|
|
rpm-build |
4f3c61 |
{ "Something else", NULL },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
/*****************************/
|
|
rpm-build |
4f3c61 |
/*** RECOVERABLE RESPONSES ***/
|
|
rpm-build |
4f3c61 |
/*****************************/
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
/* RFC 2616 section 3.1 says we MUST accept this */
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "HTTP/01.01 response", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/01.01 200 ok\r\nFoo: bar\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_HTTP_1_1, SOUP_STATUS_OK, "ok",
|
|
rpm-build |
4f3c61 |
{ { "Foo", "bar" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
/* RFC 2616 section 19.3 says we SHOULD accept these */
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Response w/ LF instead of CRLF after Status-Line", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.1 200 ok\nFoo: bar\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_HTTP_1_1, SOUP_STATUS_OK, "ok",
|
|
rpm-build |
4f3c61 |
{ { "Foo", "bar" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Response w/ incorrect spacing in Status-Line", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.1 200\tok\r\nFoo: bar\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_HTTP_1_1, SOUP_STATUS_OK, "ok",
|
|
rpm-build |
4f3c61 |
{ { "Foo", "bar" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Response w/ no reason phrase or preceding SP", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.1 200\r\nFoo: bar\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_HTTP_1_1, SOUP_STATUS_OK, "",
|
|
rpm-build |
4f3c61 |
{ { "Foo", "bar" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Response w/ no whitespace after status code", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.1 200ok\r\nFoo: bar\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_HTTP_1_1, SOUP_STATUS_OK, "ok",
|
|
rpm-build |
4f3c61 |
{ { "Foo", "bar" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
/* Shoutcast support */
|
|
rpm-build |
4f3c61 |
{ "Shoutcast server not-quite-HTTP", "502325",
|
|
rpm-build |
4f3c61 |
"ICY 200 OK\r\nFoo: bar\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_HTTP_1_0, SOUP_STATUS_OK, "OK",
|
|
rpm-build |
4f3c61 |
{ { "Foo", "bar" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Response w/ mangled header", "579318",
|
|
rpm-build |
4f3c61 |
"HTTP/1.1 200 ok\r\nFoo: one\r\nBar two:2\r\nBaz: three\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_HTTP_1_1, SOUP_STATUS_OK, "ok",
|
|
rpm-build |
4f3c61 |
{ { "Foo", "one" },
|
|
rpm-build |
4f3c61 |
{ "Baz", "three" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "HTTP 1.1 response with leading line break", "602863",
|
|
rpm-build |
4f3c61 |
"\nHTTP/1.1 200 ok\r\nFoo: bar\r\n", -1,
|
|
rpm-build |
4f3c61 |
SOUP_HTTP_1_1, SOUP_STATUS_OK, "ok",
|
|
rpm-build |
4f3c61 |
{ { "Foo", "bar" },
|
|
rpm-build |
4f3c61 |
{ NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "NUL in header name", "760832",
|
|
rpm-build |
4f3c61 |
"HTTP/1.1 200 OK\r\nF\x00oo: bar\r\n", 28,
|
|
rpm-build |
4f3c61 |
SOUP_HTTP_1_1, SOUP_STATUS_OK, "OK",
|
|
rpm-build |
4f3c61 |
{ { "Foo", "bar" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "NUL in header value", "760832",
|
|
rpm-build |
4f3c61 |
"HTTP/1.1 200 OK\r\nFoo: b\x00" "ar\r\n", 28,
|
|
rpm-build |
4f3c61 |
SOUP_HTTP_1_1, SOUP_STATUS_OK, "OK",
|
|
rpm-build |
4f3c61 |
{ { "Foo", "bar" },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
/********************************/
|
|
rpm-build |
4f3c61 |
/*** VALID CONTINUE RESPONSES ***/
|
|
rpm-build |
4f3c61 |
/********************************/
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
/* Tests from Cockpit project */
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Response w/ 101 Switching Protocols + spaces after new line", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.0 101 Switching Protocols\r\n \r\n", 38,
|
|
rpm-build |
4f3c61 |
SOUP_HTTP_1_0, SOUP_STATUS_SWITCHING_PROTOCOLS, "Switching Protocols",
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Response w/ 101 Switching Protocols missing \\r + spaces", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.0 101 Switching Protocols\r\n \r\n", 40,
|
|
rpm-build |
4f3c61 |
SOUP_HTTP_1_0, SOUP_STATUS_SWITCHING_PROTOCOLS, "Switching Protocols",
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Response w/ 101 Switching Protocols + spaces after & before new line", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.1 101 Switching Protocols \r\n \r\n", 42,
|
|
rpm-build |
4f3c61 |
SOUP_HTTP_1_1, SOUP_STATUS_SWITCHING_PROTOCOLS, "Switching Protocols",
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
/*************************/
|
|
rpm-build |
4f3c61 |
/*** INVALID RESPONSES ***/
|
|
rpm-build |
4f3c61 |
/*************************/
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Invalid HTTP version", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.2 200 OK\r\nFoo: bar\r\n", -1,
|
|
rpm-build |
4f3c61 |
-1, 0, NULL,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Non-HTTP response", NULL,
|
|
rpm-build |
4f3c61 |
"SOUP/1.1 200 OK\r\nFoo: bar\r\n", -1,
|
|
rpm-build |
4f3c61 |
-1, 0, NULL,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Non-numeric status code", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.1 XXX OK\r\nFoo: bar\r\n", -1,
|
|
rpm-build |
4f3c61 |
-1, 0, NULL,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "No status code", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.1 OK\r\nFoo: bar\r\n", -1,
|
|
rpm-build |
4f3c61 |
-1, 0, NULL,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "One-digit status code", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.1 2 OK\r\nFoo: bar\r\n", -1,
|
|
rpm-build |
4f3c61 |
-1, 0, NULL,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Two-digit status code", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.1 20 OK\r\nFoo: bar\r\n", -1,
|
|
rpm-build |
4f3c61 |
-1, 0, NULL,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Four-digit status code", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.1 2000 OK\r\nFoo: bar\r\n", -1,
|
|
rpm-build |
4f3c61 |
-1, 0, NULL,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Status code < 100", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.1 001 OK\r\nFoo: bar\r\n", -1,
|
|
rpm-build |
4f3c61 |
-1, 0, NULL,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Status code > 999", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.1 1000 OK\r\nFoo: bar\r\n", -1,
|
|
rpm-build |
4f3c61 |
-1, 0, NULL,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "NUL at start", "666316",
|
|
rpm-build |
4f3c61 |
"\x00HTTP/1.1 200 OK\r\nFoo: bar\r\n", 28,
|
|
rpm-build |
4f3c61 |
-1, 0, NULL,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "NUL in Reason Phrase", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.1 200 O\x00K\r\nFoo: bar\r\n", 28,
|
|
rpm-build |
4f3c61 |
-1, 0, NULL,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
/* Failing test from Cockpit */
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Partial response stops after HTTP/", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/", -1,
|
|
rpm-build |
4f3c61 |
-1, 0, NULL,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Space before HTTP/", NULL,
|
|
rpm-build |
4f3c61 |
" HTTP/1.0 101 Switching Protocols\r\n ", -1,
|
|
rpm-build |
4f3c61 |
-1, 0, NULL,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Missing reason", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.0 101\r\n ", -1,
|
|
rpm-build |
4f3c61 |
-1, 0, NULL,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Response code containing alphabetic character", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.1 1A01 Switching Protocols \r\n ", -1,
|
|
rpm-build |
4f3c61 |
-1, 0, NULL,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "TESTONE\\r\\n", NULL,
|
|
rpm-build |
4f3c61 |
"TESTONE\r\n ", -1,
|
|
rpm-build |
4f3c61 |
-1, 0, NULL,
|
|
rpm-build |
4f3c61 |
{ { NULL } }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "Response w/ 3 headers truncated", NULL,
|
|
rpm-build |
4f3c61 |
"HTTP/1.0 200 ok\r\nHeader1: value3\r\nHeader2: field\r\nHead3: Anothe", -1,
|
|
rpm-build |
4f3c61 |
-1, 0, NULL,
|
|
rpm-build |
4f3c61 |
{ { NULL }
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
};
|
|
rpm-build |
4f3c61 |
static const int num_resptests = G_N_ELEMENTS (resptests);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
static struct QValueTest {
|
|
rpm-build |
4f3c61 |
const char *header_value;
|
|
rpm-build |
4f3c61 |
const char *acceptable[7];
|
|
rpm-build |
4f3c61 |
const char *unacceptable[2];
|
|
rpm-build |
4f3c61 |
} qvaluetests[] = {
|
|
rpm-build |
4f3c61 |
{ "text/plain; q=0.5, text/html,\t text/x-dvi; q=0.8, text/x-c",
|
|
rpm-build |
4f3c61 |
{ "text/html", "text/x-c", "text/x-dvi", "text/plain", NULL },
|
|
rpm-build |
4f3c61 |
{ NULL },
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "text/*;q=0.3, text/html;q=0.7, text/html;level=1, text/html;level=2;q=0.4, */*;q=0.5",
|
|
rpm-build |
4f3c61 |
{ "text/html;level=1", "text/html", "*/*", "text/html;level=2",
|
|
rpm-build |
4f3c61 |
"text/*", NULL },
|
|
rpm-build |
4f3c61 |
{ NULL }
|
|
rpm-build |
4f3c61 |
},
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
{ "gzip;q=1.0, identity; q=0.5, *;q=0",
|
|
rpm-build |
4f3c61 |
{ "gzip", "identity", NULL },
|
|
rpm-build |
4f3c61 |
{ "*", NULL },
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
};
|
|
rpm-build |
4f3c61 |
static const int num_qvaluetests = G_N_ELEMENTS (qvaluetests);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
static void
|
|
rpm-build |
4f3c61 |
check_headers (Header *headers, SoupMessageHeaders *hdrs)
|
|
rpm-build |
4f3c61 |
{
|
|
rpm-build |
4f3c61 |
GSList *header_names, *h;
|
|
rpm-build |
4f3c61 |
SoupMessageHeadersIter iter;
|
|
rpm-build |
4f3c61 |
const char *name, *value;
|
|
rpm-build |
4f3c61 |
int i;
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
header_names = NULL;
|
|
rpm-build |
4f3c61 |
soup_message_headers_iter_init (&iter, hdrs);
|
|
rpm-build |
4f3c61 |
while (soup_message_headers_iter_next (&iter, &name, &value)) {
|
|
rpm-build |
4f3c61 |
if (!g_slist_find_custom (header_names, name,
|
|
rpm-build |
4f3c61 |
(GCompareFunc)strcmp))
|
|
rpm-build |
4f3c61 |
header_names = g_slist_append (header_names, (char *)name);
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
for (i = 0, h = header_names; headers[i].name && h; i++, h = h->next) {
|
|
rpm-build |
4f3c61 |
g_assert (g_ascii_strcasecmp (h->data, headers[i].name) == 0);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
value = soup_message_headers_get_list (hdrs, headers[i].name);
|
|
rpm-build |
4f3c61 |
g_assert_cmpstr (value, ==, headers[i].value);
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
/* If we have remaining fields to check, they should return NULL */
|
|
rpm-build |
4f3c61 |
for (; headers[i].name; i++) {
|
|
rpm-build |
4f3c61 |
value = soup_message_headers_get_list (hdrs, headers[i].name);
|
|
rpm-build |
4f3c61 |
g_assert_null (value);
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
g_assert_null (headers[i].name);
|
|
rpm-build |
4f3c61 |
g_assert_null (h);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
g_slist_free (header_names);
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
static void
|
|
rpm-build |
4f3c61 |
do_request_tests (void)
|
|
rpm-build |
4f3c61 |
{
|
|
rpm-build |
4f3c61 |
int i, len;
|
|
rpm-build |
4f3c61 |
char *method, *path;
|
|
rpm-build |
4f3c61 |
SoupHTTPVersion version;
|
|
rpm-build |
4f3c61 |
SoupMessageHeaders *headers;
|
|
rpm-build |
4f3c61 |
guint status;
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
for (i = 0; i < num_reqtests; i++) {
|
|
rpm-build |
4f3c61 |
debug_printf (1, "%2d. %s (%s)\n", i + 1, reqtests[i].description,
|
|
rpm-build |
4f3c61 |
soup_status_get_phrase (reqtests[i].status));
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
headers = soup_message_headers_new (SOUP_MESSAGE_HEADERS_REQUEST);
|
|
rpm-build |
4f3c61 |
method = path = NULL;
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
if (reqtests[i].length == -1)
|
|
rpm-build |
4f3c61 |
len = strlen (reqtests[i].request);
|
|
rpm-build |
4f3c61 |
else
|
|
rpm-build |
4f3c61 |
len = reqtests[i].length;
|
|
rpm-build |
4f3c61 |
status = soup_headers_parse_request (reqtests[i].request, len,
|
|
rpm-build |
4f3c61 |
headers, &method, &path,
|
|
rpm-build |
4f3c61 |
&version);
|
|
rpm-build |
4f3c61 |
g_assert_cmpint (status, ==, reqtests[i].status);
|
|
rpm-build |
4f3c61 |
if (SOUP_STATUS_IS_SUCCESSFUL (status)) {
|
|
rpm-build |
4f3c61 |
g_assert_cmpstr (method, ==, reqtests[i].method);
|
|
rpm-build |
4f3c61 |
g_assert_cmpstr (path, ==, reqtests[i].path);
|
|
rpm-build |
4f3c61 |
g_assert_cmpint (version, ==, reqtests[i].version);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
check_headers (reqtests[i].headers, headers);
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
g_free (method);
|
|
rpm-build |
4f3c61 |
g_free (path);
|
|
rpm-build |
4f3c61 |
soup_message_headers_free (headers);
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
static void
|
|
rpm-build |
4f3c61 |
do_response_tests (void)
|
|
rpm-build |
4f3c61 |
{
|
|
rpm-build |
4f3c61 |
int i, len;
|
|
rpm-build |
4f3c61 |
guint status_code;
|
|
rpm-build |
4f3c61 |
char *reason_phrase;
|
|
rpm-build |
4f3c61 |
SoupHTTPVersion version;
|
|
rpm-build |
4f3c61 |
SoupMessageHeaders *headers;
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
for (i = 0; i < num_resptests; i++) {
|
|
rpm-build |
4f3c61 |
debug_printf (1, "%2d. %s (%s)\n", i + 1, resptests[i].description,
|
|
rpm-build |
4f3c61 |
resptests[i].reason_phrase ? "should parse" : "should NOT parse");
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
headers = soup_message_headers_new (SOUP_MESSAGE_HEADERS_RESPONSE);
|
|
rpm-build |
4f3c61 |
reason_phrase = NULL;
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
if (resptests[i].length == -1)
|
|
rpm-build |
4f3c61 |
len = strlen (resptests[i].response);
|
|
rpm-build |
4f3c61 |
else
|
|
rpm-build |
4f3c61 |
len = resptests[i].length;
|
|
rpm-build |
4f3c61 |
if (soup_headers_parse_response (resptests[i].response, len,
|
|
rpm-build |
4f3c61 |
headers, &version,
|
|
rpm-build |
4f3c61 |
&status_code, &reason_phrase)) {
|
|
rpm-build |
4f3c61 |
g_assert_cmpint (version, ==, resptests[i].version);
|
|
rpm-build |
4f3c61 |
g_assert_cmpint (status_code, ==, resptests[i].status_code);
|
|
rpm-build |
4f3c61 |
g_assert_cmpstr (reason_phrase, ==, resptests[i].reason_phrase);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
check_headers (resptests[i].headers, headers);
|
|
rpm-build |
4f3c61 |
} else
|
|
rpm-build |
4f3c61 |
g_assert_null (resptests[i].reason_phrase);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
g_free (reason_phrase);
|
|
rpm-build |
4f3c61 |
soup_message_headers_free (headers);
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
static void
|
|
rpm-build |
4f3c61 |
do_qvalue_tests (void)
|
|
rpm-build |
4f3c61 |
{
|
|
rpm-build |
4f3c61 |
int i, j;
|
|
rpm-build |
4f3c61 |
GSList *acceptable, *unacceptable, *iter;
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
for (i = 0; i < num_qvaluetests; i++) {
|
|
rpm-build |
4f3c61 |
debug_printf (1, "%2d. %s:\n", i + 1, qvaluetests[i].header_value);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
unacceptable = NULL;
|
|
rpm-build |
4f3c61 |
acceptable = soup_header_parse_quality_list (qvaluetests[i].header_value,
|
|
rpm-build |
4f3c61 |
&unacceptable);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
debug_printf (1, " acceptable: ");
|
|
rpm-build |
4f3c61 |
if (acceptable) {
|
|
rpm-build |
4f3c61 |
/* Kludge to deal with the fact that the sort order of the first
|
|
rpm-build |
4f3c61 |
* test is not fully specified.
|
|
rpm-build |
4f3c61 |
*/
|
|
rpm-build |
4f3c61 |
if (i == 0 && acceptable->next &&
|
|
rpm-build |
4f3c61 |
!g_str_equal (acceptable->data, qvaluetests[i].acceptable[0]) &&
|
|
rpm-build |
4f3c61 |
g_str_equal (acceptable->data, qvaluetests[i].acceptable[1])) {
|
|
rpm-build |
4f3c61 |
gpointer tmp = acceptable->data;
|
|
rpm-build |
4f3c61 |
acceptable->data = acceptable->next->data;
|
|
rpm-build |
4f3c61 |
acceptable->next->data = tmp;
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
for (iter = acceptable, j = 0; iter; iter = iter->next, j++) {
|
|
rpm-build |
4f3c61 |
debug_printf (1, "%s ", (char *)iter->data);
|
|
rpm-build |
4f3c61 |
g_assert_cmpstr (iter->data, ==, qvaluetests[i].acceptable[j]);
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
debug_printf (1, "\n");
|
|
rpm-build |
4f3c61 |
soup_header_free_list (acceptable);
|
|
rpm-build |
4f3c61 |
} else
|
|
rpm-build |
4f3c61 |
debug_printf (1, "(none)\n");
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
debug_printf (1, " unacceptable: ");
|
|
rpm-build |
4f3c61 |
if (unacceptable) {
|
|
rpm-build |
4f3c61 |
for (iter = unacceptable, j = 0; iter; iter = iter->next, j++) {
|
|
rpm-build |
4f3c61 |
debug_printf (1, "%s ", (char *)iter->data);
|
|
rpm-build |
4f3c61 |
g_assert_cmpstr (iter->data, ==, qvaluetests[i].unacceptable[j]);
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
debug_printf (1, "\n");
|
|
rpm-build |
4f3c61 |
soup_header_free_list (unacceptable);
|
|
rpm-build |
4f3c61 |
} else
|
|
rpm-build |
4f3c61 |
debug_printf (1, "(none)\n");
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
#define RFC5987_TEST_FILENAME "t\xC3\xA9st.txt"
|
|
rpm-build |
4f3c61 |
#define RFC5987_TEST_FALLBACK_FILENAME "test.txt"
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
#define RFC5987_TEST_HEADER_ENCODED "attachment; filename*=UTF-8''t%C3%A9st.txt"
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
#define RFC5987_TEST_HEADER_UTF8 "attachment; filename*=UTF-8''t%C3%A9st.txt; filename=\"test.txt\""
|
|
rpm-build |
4f3c61 |
#define RFC5987_TEST_HEADER_ISO "attachment; filename=\"test.txt\"; filename*=iso-8859-1''t%E9st.txt"
|
|
rpm-build |
4f3c61 |
#define RFC5987_TEST_HEADER_FALLBACK "attachment; filename*=Unknown''t%FF%FF%FFst.txt; filename=\"test.txt\""
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
static void
|
|
rpm-build |
4f3c61 |
do_content_disposition_tests (void)
|
|
rpm-build |
4f3c61 |
{
|
|
rpm-build |
4f3c61 |
SoupMessageHeaders *hdrs;
|
|
rpm-build |
4f3c61 |
GHashTable *params;
|
|
rpm-build |
4f3c61 |
const char *header, *filename;
|
|
rpm-build |
4f3c61 |
char *disposition;
|
|
rpm-build |
4f3c61 |
SoupBuffer *buffer;
|
|
rpm-build |
4f3c61 |
SoupMultipart *multipart;
|
|
rpm-build |
4f3c61 |
SoupMessageBody *body;
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
hdrs = soup_message_headers_new (SOUP_MESSAGE_HEADERS_MULTIPART);
|
|
rpm-build |
4f3c61 |
params = g_hash_table_new (g_str_hash, g_str_equal);
|
|
rpm-build |
4f3c61 |
g_hash_table_insert (params, "filename", RFC5987_TEST_FILENAME);
|
|
rpm-build |
4f3c61 |
soup_message_headers_set_content_disposition (hdrs, "attachment", params);
|
|
rpm-build |
4f3c61 |
g_hash_table_destroy (params);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
header = soup_message_headers_get_one (hdrs, "Content-Disposition");
|
|
rpm-build |
4f3c61 |
g_assert_cmpstr (header, ==, RFC5987_TEST_HEADER_ENCODED);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
/* UTF-8 decoding */
|
|
rpm-build |
4f3c61 |
soup_message_headers_clear (hdrs);
|
|
rpm-build |
4f3c61 |
soup_message_headers_append (hdrs, "Content-Disposition",
|
|
rpm-build |
4f3c61 |
RFC5987_TEST_HEADER_UTF8);
|
|
rpm-build |
4f3c61 |
if (!soup_message_headers_get_content_disposition (hdrs,
|
|
rpm-build |
4f3c61 |
&disposition,
|
|
rpm-build |
4f3c61 |
¶ms)) {
|
|
rpm-build |
4f3c61 |
soup_test_assert (FALSE, "UTF-8 decoding FAILED");
|
|
rpm-build |
4f3c61 |
return;
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
g_free (disposition);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
filename = g_hash_table_lookup (params, "filename");
|
|
rpm-build |
4f3c61 |
g_assert_cmpstr (filename, ==, RFC5987_TEST_FILENAME);
|
|
rpm-build |
4f3c61 |
g_hash_table_destroy (params);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
/* ISO-8859-1 decoding */
|
|
rpm-build |
4f3c61 |
soup_message_headers_clear (hdrs);
|
|
rpm-build |
4f3c61 |
soup_message_headers_append (hdrs, "Content-Disposition",
|
|
rpm-build |
4f3c61 |
RFC5987_TEST_HEADER_ISO);
|
|
rpm-build |
4f3c61 |
if (!soup_message_headers_get_content_disposition (hdrs,
|
|
rpm-build |
4f3c61 |
&disposition,
|
|
rpm-build |
4f3c61 |
¶ms)) {
|
|
rpm-build |
4f3c61 |
soup_test_assert (FALSE, "iso-8859-1 decoding FAILED");
|
|
rpm-build |
4f3c61 |
return;
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
g_free (disposition);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
filename = g_hash_table_lookup (params, "filename");
|
|
rpm-build |
4f3c61 |
g_assert_cmpstr (filename, ==, RFC5987_TEST_FILENAME);
|
|
rpm-build |
4f3c61 |
g_hash_table_destroy (params);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
/* Fallback */
|
|
rpm-build |
4f3c61 |
soup_message_headers_clear (hdrs);
|
|
rpm-build |
4f3c61 |
soup_message_headers_append (hdrs, "Content-Disposition",
|
|
rpm-build |
4f3c61 |
RFC5987_TEST_HEADER_FALLBACK);
|
|
rpm-build |
4f3c61 |
if (!soup_message_headers_get_content_disposition (hdrs,
|
|
rpm-build |
4f3c61 |
&disposition,
|
|
rpm-build |
4f3c61 |
¶ms)) {
|
|
rpm-build |
4f3c61 |
soup_test_assert (FALSE, "fallback decoding FAILED");
|
|
rpm-build |
4f3c61 |
return;
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
g_free (disposition);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
filename = g_hash_table_lookup (params, "filename");
|
|
rpm-build |
4f3c61 |
g_assert_cmpstr (filename, ==, RFC5987_TEST_FALLBACK_FILENAME);
|
|
rpm-build |
4f3c61 |
g_hash_table_destroy (params);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
soup_message_headers_free (hdrs);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
/* Ensure that soup-multipart always quotes filename */
|
|
rpm-build |
4f3c61 |
g_test_bug ("641280");
|
|
rpm-build |
4f3c61 |
multipart = soup_multipart_new (SOUP_FORM_MIME_TYPE_MULTIPART);
|
|
rpm-build |
4f3c61 |
buffer = soup_buffer_new (SOUP_MEMORY_STATIC, "foo", 3);
|
|
rpm-build |
4f3c61 |
soup_multipart_append_form_file (multipart, "test", "token",
|
|
rpm-build |
4f3c61 |
"text/plain", buffer);
|
|
rpm-build |
4f3c61 |
soup_buffer_free (buffer);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
hdrs = soup_message_headers_new (SOUP_MESSAGE_HEADERS_MULTIPART);
|
|
rpm-build |
4f3c61 |
body = soup_message_body_new ();
|
|
rpm-build |
4f3c61 |
soup_multipart_to_message (multipart, hdrs, body);
|
|
rpm-build |
4f3c61 |
soup_message_headers_free (hdrs);
|
|
rpm-build |
4f3c61 |
soup_multipart_free (multipart);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
buffer = soup_message_body_flatten (body);
|
|
rpm-build |
4f3c61 |
soup_message_body_free (body);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
g_assert_true (strstr (buffer->data, "filename=\"token\""));
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
soup_buffer_free (buffer);
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
#define CONTENT_TYPE_TEST_MIME_TYPE "text/plain"
|
|
rpm-build |
4f3c61 |
#define CONTENT_TYPE_TEST_ATTRIBUTE "charset"
|
|
rpm-build |
4f3c61 |
#define CONTENT_TYPE_TEST_VALUE "US-ASCII"
|
|
rpm-build |
4f3c61 |
#define CONTENT_TYPE_TEST_HEADER "text/plain; charset=US-ASCII"
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
#define CONTENT_TYPE_BAD_HEADER "plain text, not text/html"
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
static void
|
|
rpm-build |
4f3c61 |
do_content_type_tests (void)
|
|
rpm-build |
4f3c61 |
{
|
|
rpm-build |
4f3c61 |
SoupMessageHeaders *hdrs;
|
|
rpm-build |
4f3c61 |
GHashTable *params;
|
|
rpm-build |
4f3c61 |
const char *header, *mime_type;
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
g_test_bug ("576760");
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
hdrs = soup_message_headers_new (SOUP_MESSAGE_HEADERS_MULTIPART);
|
|
rpm-build |
4f3c61 |
params = g_hash_table_new (g_str_hash, g_str_equal);
|
|
rpm-build |
4f3c61 |
g_hash_table_insert (params, CONTENT_TYPE_TEST_ATTRIBUTE,
|
|
rpm-build |
4f3c61 |
CONTENT_TYPE_TEST_VALUE);
|
|
rpm-build |
4f3c61 |
soup_message_headers_set_content_type (hdrs, CONTENT_TYPE_TEST_MIME_TYPE, params);
|
|
rpm-build |
4f3c61 |
g_hash_table_destroy (params);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
header = soup_message_headers_get_one (hdrs, "Content-Type");
|
|
rpm-build |
4f3c61 |
g_assert_cmpstr (header, ==, CONTENT_TYPE_TEST_HEADER);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
soup_message_headers_clear (hdrs);
|
|
rpm-build |
4f3c61 |
soup_message_headers_append (hdrs, "Content-Type",
|
|
rpm-build |
4f3c61 |
CONTENT_TYPE_TEST_MIME_TYPE);
|
|
rpm-build |
4f3c61 |
/* Add a second Content-Type header: should be ignored */
|
|
rpm-build |
4f3c61 |
soup_message_headers_append (hdrs, "Content-Type",
|
|
rpm-build |
4f3c61 |
CONTENT_TYPE_TEST_MIME_TYPE);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
mime_type = soup_message_headers_get_content_type (hdrs, ¶ms);
|
|
rpm-build |
4f3c61 |
g_assert_cmpstr (mime_type, ==, CONTENT_TYPE_TEST_MIME_TYPE);
|
|
rpm-build |
4f3c61 |
g_assert_cmpint (g_hash_table_size (params), ==, 0);
|
|
rpm-build |
4f3c61 |
if (params)
|
|
rpm-build |
4f3c61 |
g_hash_table_destroy (params);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
g_test_bug ("577630");
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
soup_message_headers_clear (hdrs);
|
|
rpm-build |
4f3c61 |
soup_message_headers_append (hdrs, "Content-Type",
|
|
rpm-build |
4f3c61 |
CONTENT_TYPE_BAD_HEADER);
|
|
rpm-build |
4f3c61 |
mime_type = soup_message_headers_get_content_type (hdrs, ¶ms);
|
|
rpm-build |
4f3c61 |
g_assert_null (mime_type);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
soup_message_headers_free (hdrs);
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
struct {
|
|
rpm-build |
4f3c61 |
const char *name, *value;
|
|
rpm-build |
4f3c61 |
} test_params[] = {
|
|
rpm-build |
4f3c61 |
{ "one", "foo" },
|
|
rpm-build |
4f3c61 |
{ "two", "test with spaces" },
|
|
rpm-build |
4f3c61 |
{ "three", "test with \"quotes\" and \\s" },
|
|
rpm-build |
4f3c61 |
{ "four", NULL },
|
|
rpm-build |
4f3c61 |
{ "five", "test with \xC3\xA1\xC3\xA7\xC4\x89\xC3\xA8\xC3\xB1\xC5\xA3\xC5\xA1" }
|
|
rpm-build |
4f3c61 |
};
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
#define TEST_PARAMS_RESULT "one=foo, two=\"test with spaces\", three=\"test with \\\"quotes\\\" and \\\\s\", four, five*=UTF-8''test%20with%20%C3%A1%C3%A7%C4%89%C3%A8%C3%B1%C5%A3%C5%A1"
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
static void
|
|
rpm-build |
4f3c61 |
do_append_param_tests (void)
|
|
rpm-build |
4f3c61 |
{
|
|
rpm-build |
4f3c61 |
GString *params;
|
|
rpm-build |
4f3c61 |
int i;
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
g_test_bug ("577728");
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
params = g_string_new (NULL);
|
|
rpm-build |
4f3c61 |
for (i = 0; i < G_N_ELEMENTS (test_params); i++) {
|
|
rpm-build |
4f3c61 |
if (i > 0)
|
|
rpm-build |
4f3c61 |
g_string_append (params, ", ");
|
|
rpm-build |
4f3c61 |
soup_header_g_string_append_param (params,
|
|
rpm-build |
4f3c61 |
test_params[i].name,
|
|
rpm-build |
4f3c61 |
test_params[i].value);
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
g_assert_cmpstr (params->str, ==, TEST_PARAMS_RESULT);
|
|
rpm-build |
4f3c61 |
g_string_free (params, TRUE);
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
static const struct {
|
|
rpm-build |
4f3c61 |
const char *description, *name, *value;
|
|
rpm-build |
4f3c61 |
} bad_headers[] = {
|
|
rpm-build |
4f3c61 |
{ "Empty name", "", "value" },
|
|
rpm-build |
4f3c61 |
{ "Name with spaces", "na me", "value" },
|
|
rpm-build |
4f3c61 |
{ "Name with colon", "na:me", "value" },
|
|
rpm-build |
4f3c61 |
{ "Name with CR", "na\rme", "value" },
|
|
rpm-build |
4f3c61 |
{ "Name with LF", "na\nme", "value" },
|
|
rpm-build |
4f3c61 |
{ "Name with tab", "na\tme", "value" },
|
|
rpm-build |
4f3c61 |
{ "Value with CR", "name", "val\rue" },
|
|
rpm-build |
4f3c61 |
{ "Value with LF", "name", "val\nue" },
|
|
rpm-build |
4f3c61 |
{ "Value with LWS", "name", "val\r\n ue" }
|
|
rpm-build |
4f3c61 |
};
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
static void
|
|
rpm-build |
4f3c61 |
do_bad_header_tests (void)
|
|
rpm-build |
4f3c61 |
{
|
|
rpm-build |
4f3c61 |
SoupMessageHeaders *hdrs;
|
|
rpm-build |
4f3c61 |
int i;
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
hdrs = soup_message_headers_new (SOUP_MESSAGE_HEADERS_MULTIPART);
|
|
rpm-build |
4f3c61 |
for (i = 0; i < G_N_ELEMENTS (bad_headers); i++) {
|
|
rpm-build |
4f3c61 |
debug_printf (1, " %s\n", bad_headers[i].description);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
g_test_expect_message ("libsoup", G_LOG_LEVEL_CRITICAL,
|
|
rpm-build |
4f3c61 |
"*soup_message_headers_append*assertion*failed*");
|
|
rpm-build |
4f3c61 |
soup_message_headers_append (hdrs, bad_headers[i].name,
|
|
rpm-build |
4f3c61 |
bad_headers[i].value);
|
|
rpm-build |
4f3c61 |
g_test_assert_expected_messages ();
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
soup_message_headers_free (hdrs);
|
|
rpm-build |
4f3c61 |
}
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
int
|
|
rpm-build |
4f3c61 |
main (int argc, char **argv)
|
|
rpm-build |
4f3c61 |
{
|
|
rpm-build |
4f3c61 |
int ret;
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
test_init (argc, argv, NULL);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
g_test_add_func ("/header-parsing/request", do_request_tests);
|
|
rpm-build |
4f3c61 |
g_test_add_func ("/header-parsing/response", do_response_tests);
|
|
rpm-build |
4f3c61 |
g_test_add_func ("/header-parsing/qvalue", do_qvalue_tests);
|
|
rpm-build |
4f3c61 |
g_test_add_func ("/header-parsing/content-disposition", do_content_disposition_tests);
|
|
rpm-build |
4f3c61 |
g_test_add_func ("/header-parsing/content-type", do_content_type_tests);
|
|
rpm-build |
4f3c61 |
g_test_add_func ("/header-parsing/append-param", do_append_param_tests);
|
|
rpm-build |
4f3c61 |
g_test_add_func ("/header-parsing/bad", do_bad_header_tests);
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
ret = g_test_run ();
|
|
rpm-build |
4f3c61 |
|
|
rpm-build |
4f3c61 |
test_cleanup ();
|
|
rpm-build |
4f3c61 |
return ret;
|
|
rpm-build |
4f3c61 |
}
|