summaryrefslogtreecommitdiff
path: root/tests/server-test.c
diff options
context:
space:
mode:
authorDan Winship <danw@gnome.org>2013-08-25 10:51:22 -0400
committerDan Winship <danw@gnome.org>2013-08-26 11:00:42 -0400
commit4a8b1c0544b168b25cbd3b016b7aedee263515ba (patch)
tree823f0e9fbc26d311aa3fb6e16f80684407ecb86f /tests/server-test.c
parent3935e102d8195ec12349e688b87e200df4f33649 (diff)
downloadlibsoup-4a8b1c0544b168b25cbd3b016b7aedee263515ba.tar.gz
SoupServer: add :http-aliases and :https-aliases properties
Add :http-aliases and :https-aliases properties to SoupServer, to allow it to handle requests like: GET daap://host:port/path HTTP/1.1 https://bugzilla.gnome.org/show_bug.cgi?id=703694
Diffstat (limited to 'tests/server-test.c')
-rw-r--r--tests/server-test.c130
1 files changed, 128 insertions, 2 deletions
diff --git a/tests/server-test.c b/tests/server-test.c
index 3cad5c52..3ff7cadd 100644
--- a/tests/server-test.c
+++ b/tests/server-test.c
@@ -5,8 +5,8 @@
#include "test-utils.h"
-SoupServer *server;
-SoupURI *base_uri;
+SoupServer *server, *ssl_server;
+SoupURI *base_uri, *ssl_base_uri;
static void
server_callback (SoupServer *server, SoupMessage *msg,
@@ -120,6 +120,109 @@ do_star_test (void)
}
static void
+do_one_server_aliases_test (SoupURI *uri,
+ const char *alias,
+ gboolean succeed)
+{
+ GSocketClient *client;
+ GSocketConnectable *addr;
+ GSocketConnection *conn;
+ GInputStream *in;
+ GOutputStream *out;
+ GError *error = NULL;
+ GString *req;
+ static char buf[1024];
+
+ debug_printf (1, " %s via %s\n", alias, uri->scheme);
+
+ /* There's no way to make libsoup's client side send an absolute
+ * URI (to a non-proxy server), so we have to fake this.
+ */
+
+ client = g_socket_client_new ();
+ if (uri->scheme == SOUP_URI_SCHEME_HTTPS) {
+ g_socket_client_set_tls (client, TRUE);
+ g_socket_client_set_tls_validation_flags (client, 0);
+ }
+ addr = g_network_address_new (uri->host, uri->port);
+
+ conn = g_socket_client_connect (client, addr, NULL, &error);
+ g_object_unref (addr);
+ g_object_unref (client);
+ if (!conn) {
+ debug_printf (1, " error connecting to server: %s\n",
+ error->message);
+ g_error_free (error);
+ errors++;
+ return;
+ }
+
+ in = g_io_stream_get_input_stream (G_IO_STREAM (conn));
+ out = g_io_stream_get_output_stream (G_IO_STREAM (conn));
+
+ req = g_string_new (NULL);
+ g_string_append_printf (req, "GET %s://%s:%d HTTP/1.1\r\n",
+ alias, uri->host, uri->port);
+ g_string_append_printf (req, "Host: %s:%d\r\n",
+ uri->host, uri->port);
+ g_string_append (req, "Connection: close\r\n\r\n");
+
+ if (!g_output_stream_write_all (out, req->str, req->len, NULL, NULL, &error)) {
+ debug_printf (1, " error sending request: %s\n",
+ error->message);
+ g_error_free (error);
+ errors++;
+ g_object_unref (conn);
+ g_string_free (req, TRUE);
+ return;
+ }
+ g_string_free (req, TRUE);
+
+ if (!g_input_stream_read_all (in, buf, sizeof (buf), NULL, NULL, &error)) {
+ debug_printf (1, " error reading response: %s\n",
+ error->message);
+ g_error_free (error);
+ errors++;
+ g_object_unref (conn);
+ return;
+ }
+
+ if ((succeed && !g_str_has_prefix (buf, "HTTP/1.1 200 ")) ||
+ (!succeed && !g_str_has_prefix (buf, "HTTP/1.1 400 "))) {
+ debug_printf (1, " unexpected response: %.*s\n",
+ (int) strcspn (buf, "\r\n"), buf);
+ errors++;
+ }
+
+ g_io_stream_close (G_IO_STREAM (conn), NULL, NULL);
+ g_object_unref (conn);
+}
+
+static void
+do_server_aliases_test (void)
+{
+ char *http_good[] = { "http", "dav", NULL };
+ char *http_bad[] = { "https", "davs", "fred", NULL };
+ char *https_good[] = { "https", "davs", NULL };
+ char *https_bad[] = { "http", "dav", "fred", NULL };
+ int i;
+
+ debug_printf (1, "\nserver aliases test\n");
+
+ for (i = 0; http_good[i]; i++)
+ do_one_server_aliases_test (base_uri, http_good[i], TRUE);
+ for (i = 0; http_bad[i]; i++)
+ do_one_server_aliases_test (base_uri, http_bad[i], FALSE);
+
+ if (tls_available) {
+ for (i = 0; https_good[i]; i++)
+ do_one_server_aliases_test (ssl_base_uri, https_good[i], TRUE);
+ for (i = 0; https_bad[i]; i++)
+ do_one_server_aliases_test (ssl_base_uri, https_bad[i], FALSE);
+ }
+}
+
+static void
do_dot_dot_test (void)
{
SoupSession *session;
@@ -232,6 +335,9 @@ do_ipv6_test (void)
int
main (int argc, char **argv)
{
+ char *http_aliases[] = { "dav", NULL };
+ char *https_aliases[] = { "davs", NULL };
+
test_init (argc, argv, NULL);
server = soup_test_server_new (TRUE);
@@ -239,13 +345,33 @@ main (int argc, char **argv)
base_uri = soup_uri_new ("http://127.0.0.1/");
soup_uri_set_port (base_uri, soup_server_get_port (server));
+ g_object_set (G_OBJECT (server),
+ SOUP_SERVER_HTTP_ALIASES, http_aliases,
+ NULL);
+
+ if (tls_available) {
+ ssl_server = soup_test_server_new_ssl (TRUE);
+ soup_server_add_handler (ssl_server, NULL, server_callback, NULL, NULL);
+ ssl_base_uri = soup_uri_new ("https://127.0.0.1/");
+ soup_uri_set_port (ssl_base_uri, soup_server_get_port (ssl_server));
+ g_object_set (G_OBJECT (ssl_server),
+ SOUP_SERVER_HTTPS_ALIASES, https_aliases,
+ NULL);
+ }
+
do_star_test ();
+ do_server_aliases_test ();
do_dot_dot_test ();
do_ipv6_test ();
soup_uri_free (base_uri);
soup_test_server_quit_unref (server);
+ if (tls_available) {
+ soup_uri_free (ssl_base_uri);
+ soup_test_server_quit_unref (ssl_server);
+ }
+
test_cleanup ();
return errors != 0;
}