diff options
author | Dan Winship <danw@gnome.org> | 2013-08-25 10:51:22 -0400 |
---|---|---|
committer | Dan Winship <danw@gnome.org> | 2013-08-26 11:00:42 -0400 |
commit | 4a8b1c0544b168b25cbd3b016b7aedee263515ba (patch) | |
tree | 823f0e9fbc26d311aa3fb6e16f80684407ecb86f /tests/server-test.c | |
parent | 3935e102d8195ec12349e688b87e200df4f33649 (diff) | |
download | libsoup-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.c | 130 |
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; } |