1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * Copyright (C) 2008 Red Hat, Inc.
13 #include <libsoup/soup.h>
15 #include "test-utils.h"
17 #define RESPONSE_CHUNK_SIZE 1024
19 char *full_response, *full_response_md5;
20 gsize full_response_length;
23 get_full_response (void)
27 if (!g_file_get_contents (SRCDIR "/index.txt",
29 &full_response_length,
31 fprintf (stderr, "Could not read index file %s: %s\n",
32 SRCDIR "/index.txt", error->message);
37 full_response_md5 = g_compute_checksum_for_data (G_CHECKSUM_MD5,
38 (guchar *)full_response,
39 full_response_length);
43 write_next_chunk (SoupMessage *msg, gpointer user_data)
45 gsize *offset = user_data;
48 chunk_length = MIN (RESPONSE_CHUNK_SIZE, full_response_length - *offset);
49 if (chunk_length > 0) {
50 debug_printf (2, " writing chunk\n");
51 soup_message_body_append (msg->response_body,
53 full_response + *offset,
55 *offset += chunk_length;
57 debug_printf (2, " done\n");
58 /* This is only actually needed in the chunked and eof
59 * cases, but it's harmless in the content-length
62 soup_message_body_complete (msg->response_body);
67 free_offset (SoupMessage *msg, gpointer offset)
73 server_callback (SoupServer *server, SoupMessage *msg,
74 const char *path, GHashTable *query,
75 SoupClientContext *context, gpointer data)
79 if (!strcmp (path, "/chunked")) {
80 soup_message_headers_set_encoding (msg->response_headers,
81 SOUP_ENCODING_CHUNKED);
82 } else if (!strcmp (path, "/content-length")) {
83 soup_message_headers_set_encoding (msg->response_headers,
84 SOUP_ENCODING_CONTENT_LENGTH);
85 soup_message_headers_set_content_length (msg->response_headers,
86 full_response_length);
87 } else if (!strcmp (path, "/eof")) {
88 soup_message_headers_set_encoding (msg->response_headers,
91 soup_message_set_status (msg, SOUP_STATUS_NOT_FOUND);
94 soup_message_set_status (msg, SOUP_STATUS_OK);
96 offset = g_new0 (gsize, 1);
97 g_signal_connect (msg, "wrote_headers",
98 G_CALLBACK (write_next_chunk), offset);
99 g_signal_connect (msg, "wrote_chunk",
100 G_CALLBACK (write_next_chunk), offset);
101 g_signal_connect (msg, "finished",
102 G_CALLBACK (free_offset), offset);
106 do_request (SoupSession *session, SoupURI *base_uri, char *path)
112 uri = soup_uri_new_with_base (base_uri, path);
113 msg = soup_message_new_from_uri ("GET", uri);
116 soup_session_send_message (session, msg);
118 if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) {
119 debug_printf (1, " message failed: %d %s\n",
120 msg->status_code, msg->reason_phrase);
124 if (msg->response_body->length != full_response_length) {
125 debug_printf (1, " received length mismatch: expected %d, got %d\n",
126 (int)full_response_length, (int)msg->request_body->length);
130 md5 = g_compute_checksum_for_data (G_CHECKSUM_MD5,
131 (guchar *)msg->response_body->data,
132 msg->response_body->length);
133 if (strcmp (md5, full_response_md5) != 0) {
134 debug_printf (1, " data mismatch: expected %s, got %s\n",
135 full_response_md5, md5);
140 g_object_unref (msg);
144 do_tests (SoupURI *base_uri)
146 SoupSession *session;
148 session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC, NULL);
149 debug_printf (1, "Chunked encoding\n");
150 do_request (session, base_uri, "chunked");
151 debug_printf (1, "\n");
152 debug_printf (1, "Content-Length encoding\n");
153 do_request (session, base_uri, "content-length");
154 debug_printf (1, "\n");
155 debug_printf (1, "EOF encoding\n");
156 do_request (session, base_uri, "eof");
157 soup_test_session_abort_unref (session);
161 main (int argc, char **argv)
168 test_init (argc, argv, NULL);
169 get_full_response ();
171 server = soup_test_server_new (FALSE);
172 soup_server_add_handler (server, NULL,
173 server_callback, NULL, NULL);
174 port = soup_server_get_port (server);
176 loop = g_main_loop_new (NULL, TRUE);
178 base_uri = soup_uri_new ("http://127.0.0.1");
179 soup_uri_set_port (base_uri, port);
181 soup_uri_free (base_uri);
183 g_main_loop_unref (loop);
185 g_free (full_response);
186 g_free (full_response_md5);
187 soup_test_server_quit_unref (server);