|
Packit Service |
ca3877 |
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
|
|
Packit Service |
ca3877 |
/*
|
|
Packit Service |
ca3877 |
* Copyright (C) 2008 Red Hat, Inc.
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
#include "test-utils.h"
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static SoupSession *session;
|
|
Packit Service |
ca3877 |
static SoupURI *base_uri;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
typedef struct {
|
|
Packit Service |
ca3877 |
SoupSession *session;
|
|
Packit Service |
ca3877 |
SoupBuffer *chunks[3];
|
|
Packit Service |
ca3877 |
int next, nwrote, nfreed;
|
|
Packit Service |
ca3877 |
gboolean streaming;
|
|
Packit Service |
ca3877 |
} PutTestData;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
write_next_chunk (SoupMessage *msg, gpointer user_data)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
PutTestData *ptd = user_data;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
debug_printf (2, " writing chunk %d\n", ptd->next);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (ptd->streaming && ptd->next > 0) {
|
|
Packit Service |
ca3877 |
soup_test_assert (ptd->chunks[ptd->next - 1] == NULL,
|
|
Packit Service |
ca3877 |
"next chunk requested before last one freed");
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (ptd->next < G_N_ELEMENTS (ptd->chunks)) {
|
|
Packit Service |
ca3877 |
soup_message_body_append_buffer (msg->request_body,
|
|
Packit Service |
ca3877 |
ptd->chunks[ptd->next]);
|
|
Packit Service |
ca3877 |
soup_buffer_free (ptd->chunks[ptd->next]);
|
|
Packit Service |
ca3877 |
ptd->next++;
|
|
Packit Service |
ca3877 |
} else
|
|
Packit Service |
ca3877 |
soup_message_body_complete (msg->request_body);
|
|
Packit Service |
ca3877 |
soup_session_unpause_message (ptd->session, msg);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* This is not a supported part of the API. Use SOUP_MESSAGE_CAN_REBUILD
|
|
Packit Service |
ca3877 |
* instead.
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
write_next_chunk_streaming_hack (SoupMessage *msg, gpointer user_data)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
PutTestData *ptd = user_data;
|
|
Packit Service |
ca3877 |
SoupBuffer *chunk;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
debug_printf (2, " freeing chunk at %d\n", ptd->nfreed);
|
|
Packit Service |
ca3877 |
chunk = soup_message_body_get_chunk (msg->request_body, ptd->nfreed);
|
|
Packit Service |
ca3877 |
if (chunk) {
|
|
Packit Service |
ca3877 |
ptd->nfreed += chunk->length;
|
|
Packit Service |
ca3877 |
soup_message_body_wrote_chunk (msg->request_body, chunk);
|
|
Packit Service |
ca3877 |
soup_buffer_free (chunk);
|
|
Packit Service |
ca3877 |
} else {
|
|
Packit Service |
ca3877 |
soup_test_assert (chunk,
|
|
Packit Service |
ca3877 |
"written chunk does not exist");
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
write_next_chunk (msg, user_data);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
wrote_body_data (SoupMessage *msg, SoupBuffer *chunk, gpointer user_data)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
PutTestData *ptd = user_data;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
debug_printf (2, " wrote_body_data, %d bytes\n",
|
|
Packit Service |
ca3877 |
(int)chunk->length);
|
|
Packit Service |
ca3877 |
ptd->nwrote += chunk->length;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
clear_buffer_ptr (gpointer data)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupBuffer **buffer_ptr = data;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
debug_printf (2, " clearing chunk\n");
|
|
Packit Service |
ca3877 |
if (*buffer_ptr) {
|
|
Packit Service |
ca3877 |
(*buffer_ptr)->length = 0;
|
|
Packit Service |
ca3877 |
g_free ((char *)(*buffer_ptr)->data);
|
|
Packit Service |
ca3877 |
*buffer_ptr = NULL;
|
|
Packit Service |
ca3877 |
} else {
|
|
Packit Service |
ca3877 |
soup_test_assert (*buffer_ptr,
|
|
Packit Service |
ca3877 |
"chunk is already clear");
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* Put a chunk containing @text into *@buffer, set up so that it will
|
|
Packit Service |
ca3877 |
* clear out *@buffer when the chunk is freed, allowing us to make sure
|
|
Packit Service |
ca3877 |
* the set_accumulate(FALSE) is working.
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
make_put_chunk (SoupBuffer **buffer, const char *text)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
*buffer = soup_buffer_new_with_owner (g_strdup (text), strlen (text),
|
|
Packit Service |
ca3877 |
buffer, clear_buffer_ptr);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
setup_request_body (PutTestData *ptd)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
make_put_chunk (&ptd->chunks[0], "one\r\n");
|
|
Packit Service |
ca3877 |
make_put_chunk (&ptd->chunks[1], "two\r\n");
|
|
Packit Service |
ca3877 |
make_put_chunk (&ptd->chunks[2], "three\r\n");
|
|
Packit Service |
ca3877 |
ptd->next = ptd->nwrote = ptd->nfreed = 0;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
restarted_streaming (SoupMessage *msg, gpointer user_data)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
PutTestData *ptd = user_data;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
debug_printf (2, " --restarting--\n");
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* We're streaming, and we had to restart. So the data need
|
|
Packit Service |
ca3877 |
* to be regenerated.
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
setup_request_body (ptd);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* The 302 redirect will turn it into a GET request and
|
|
Packit Service |
ca3877 |
* reset the body encoding back to "NONE". Fix that.
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
soup_message_headers_set_encoding (msg->request_headers,
|
|
Packit Service |
ca3877 |
SOUP_ENCODING_CHUNKED);
|
|
Packit Service |
ca3877 |
msg->method = SOUP_METHOD_PUT;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
restarted_streaming_hack (SoupMessage *msg, gpointer user_data)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
restarted_streaming (msg, user_data);
|
|
Packit Service |
ca3877 |
soup_message_body_truncate (msg->request_body);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
typedef enum {
|
|
Packit Service |
ca3877 |
HACKY_STREAMING = (1 << 0),
|
|
Packit Service |
ca3877 |
PROPER_STREAMING = (1 << 1),
|
|
Packit Service |
ca3877 |
RESTART = (1 << 2)
|
|
Packit Service |
ca3877 |
} RequestTestFlags;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
do_request_test (gconstpointer data)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
RequestTestFlags flags = GPOINTER_TO_UINT (data);
|
|
Packit Service |
ca3877 |
SoupURI *uri;
|
|
Packit Service |
ca3877 |
PutTestData ptd;
|
|
Packit Service |
ca3877 |
SoupMessage *msg;
|
|
Packit Service |
ca3877 |
const char *client_md5, *server_md5;
|
|
Packit Service |
ca3877 |
GChecksum *check;
|
|
Packit Service |
ca3877 |
int i, length;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (flags & RESTART)
|
|
Packit Service |
ca3877 |
uri = soup_uri_new_with_base (base_uri, "/redirect");
|
|
Packit Service |
ca3877 |
else
|
|
Packit Service |
ca3877 |
uri = soup_uri_copy (base_uri);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
ptd.session = session;
|
|
Packit Service |
ca3877 |
setup_request_body (&ptd);
|
|
Packit Service |
ca3877 |
ptd.streaming = flags & (HACKY_STREAMING | PROPER_STREAMING);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
check = g_checksum_new (G_CHECKSUM_MD5);
|
|
Packit Service |
ca3877 |
length = 0;
|
|
Packit Service |
ca3877 |
for (i = 0; i < 3; i++) {
|
|
Packit Service |
ca3877 |
g_checksum_update (check, (guchar *)ptd.chunks[i]->data,
|
|
Packit Service |
ca3877 |
ptd.chunks[i]->length);
|
|
Packit Service |
ca3877 |
length += ptd.chunks[i]->length;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
client_md5 = g_checksum_get_string (check);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
msg = soup_message_new_from_uri ("PUT", uri);
|
|
Packit Service |
ca3877 |
soup_message_headers_set_encoding (msg->request_headers, SOUP_ENCODING_CHUNKED);
|
|
Packit Service |
ca3877 |
soup_message_body_set_accumulate (msg->request_body, FALSE);
|
|
Packit Service |
ca3877 |
if (flags & HACKY_STREAMING) {
|
|
Packit Service |
ca3877 |
g_signal_connect (msg, "wrote_chunk",
|
|
Packit Service |
ca3877 |
G_CALLBACK (write_next_chunk_streaming_hack), &ptd);
|
|
Packit Service |
ca3877 |
if (flags & RESTART) {
|
|
Packit Service |
ca3877 |
g_signal_connect (msg, "restarted",
|
|
Packit Service |
ca3877 |
G_CALLBACK (restarted_streaming_hack), &ptd);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
} else {
|
|
Packit Service |
ca3877 |
g_signal_connect (msg, "wrote_chunk",
|
|
Packit Service |
ca3877 |
G_CALLBACK (write_next_chunk), &ptd);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (flags & PROPER_STREAMING) {
|
|
Packit Service |
ca3877 |
soup_message_set_flags (msg, SOUP_MESSAGE_CAN_REBUILD);
|
|
Packit Service |
ca3877 |
if (flags & RESTART) {
|
|
Packit Service |
ca3877 |
g_signal_connect (msg, "restarted",
|
|
Packit Service |
ca3877 |
G_CALLBACK (restarted_streaming), &ptd);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_signal_connect (msg, "wrote_headers",
|
|
Packit Service |
ca3877 |
G_CALLBACK (write_next_chunk), &ptd);
|
|
Packit Service |
ca3877 |
g_signal_connect (msg, "wrote_body_data",
|
|
Packit Service |
ca3877 |
G_CALLBACK (wrote_body_data), &ptd);
|
|
Packit Service |
ca3877 |
soup_session_send_message (session, msg);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
soup_test_assert_message_status (msg, SOUP_STATUS_CREATED);
|
|
Packit Service |
ca3877 |
g_assert_null (msg->request_body->data);
|
|
Packit Service |
ca3877 |
g_assert_cmpint (msg->request_body->length, ==, length);
|
|
Packit Service |
ca3877 |
g_assert_cmpint (length, ==, ptd.nwrote);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
server_md5 = soup_message_headers_get_one (msg->response_headers,
|
|
Packit Service |
ca3877 |
"Content-MD5");
|
|
Packit Service |
ca3877 |
g_assert_cmpstr (client_md5, ==, server_md5);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_object_unref (msg);
|
|
Packit Service |
ca3877 |
g_checksum_free (check);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
soup_uri_free (uri);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
typedef struct {
|
|
Packit Service |
ca3877 |
SoupBuffer *current_chunk;
|
|
Packit Service |
ca3877 |
GChecksum *check;
|
|
Packit Service |
ca3877 |
int length;
|
|
Packit Service |
ca3877 |
} GetTestData;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static SoupBuffer *
|
|
Packit Service |
ca3877 |
chunk_allocator (SoupMessage *msg, gsize max_len, gpointer user_data)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
GetTestData *gtd = user_data;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
debug_printf (2, " allocating chunk\n");
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
soup_test_assert (gtd->current_chunk == NULL,
|
|
Packit Service |
ca3877 |
"error: next chunk allocated before last one freed");
|
|
Packit Service |
ca3877 |
gtd->current_chunk = soup_buffer_new_with_owner (g_malloc (6), 6,
|
|
Packit Service |
ca3877 |
>d->current_chunk,
|
|
Packit Service |
ca3877 |
clear_buffer_ptr);
|
|
Packit Service |
ca3877 |
return gtd->current_chunk;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
got_chunk (SoupMessage *msg, SoupBuffer *chunk, gpointer user_data)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
GetTestData *gtd = user_data;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
debug_printf (2, " got chunk, %d bytes\n",
|
|
Packit Service |
ca3877 |
(int)chunk->length);
|
|
Packit Service |
ca3877 |
if (chunk != gtd->current_chunk) {
|
|
Packit Service |
ca3877 |
debug_printf (1, "chunk mismatch! %p vs %p\n",
|
|
Packit Service |
ca3877 |
chunk, gtd->current_chunk);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_checksum_update (gtd->check, (guchar *)chunk->data, chunk->length);
|
|
Packit Service |
ca3877 |
gtd->length += chunk->length;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
do_response_test (void)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
GetTestData gtd;
|
|
Packit Service |
ca3877 |
SoupMessage *msg;
|
|
Packit Service |
ca3877 |
const char *client_md5, *server_md5;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
gtd.current_chunk = NULL;
|
|
Packit Service |
ca3877 |
gtd.length = 0;
|
|
Packit Service |
ca3877 |
gtd.check = g_checksum_new (G_CHECKSUM_MD5);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
msg = soup_message_new_from_uri ("GET", base_uri);
|
|
Packit Service |
ca3877 |
soup_message_body_set_accumulate (msg->response_body, FALSE);
|
|
Packit Service |
ca3877 |
G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
|
|
Packit Service |
ca3877 |
soup_message_set_chunk_allocator (msg, chunk_allocator, >d, NULL);
|
|
Packit Service |
ca3877 |
G_GNUC_END_IGNORE_DEPRECATIONS;
|
|
Packit Service |
ca3877 |
g_signal_connect (msg, "got_chunk",
|
|
Packit Service |
ca3877 |
G_CALLBACK (got_chunk), >d);
|
|
Packit Service |
ca3877 |
soup_session_send_message (session, msg);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
soup_test_assert_message_status (msg, SOUP_STATUS_OK);
|
|
Packit Service |
ca3877 |
g_assert_null (msg->response_body->data);
|
|
Packit Service |
ca3877 |
g_assert_cmpint (soup_message_headers_get_content_length (msg->response_headers), ==, gtd.length);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
client_md5 = g_checksum_get_string (gtd.check);
|
|
Packit Service |
ca3877 |
server_md5 = soup_message_headers_get_one (msg->response_headers,
|
|
Packit Service |
ca3877 |
"Content-MD5");
|
|
Packit Service |
ca3877 |
g_assert_cmpstr (client_md5, ==, server_md5);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_object_unref (msg);
|
|
Packit Service |
ca3877 |
g_checksum_free (gtd.check);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* Make sure TEMPORARY buffers are handled properly with non-accumulating
|
|
Packit Service |
ca3877 |
* message bodies.
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
temp_test_wrote_chunk (SoupMessage *msg, gpointer session)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupBuffer *chunk;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
chunk = soup_message_body_get_chunk (msg->request_body, 5);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
/* When the bug is present, the second chunk will also be
|
|
Packit Service |
ca3877 |
* discarded after the first is written, which will cause
|
|
Packit Service |
ca3877 |
* the I/O to stall since soup-message-io will think it's
|
|
Packit Service |
ca3877 |
* done, but it hasn't written Content-Length bytes yet.
|
|
Packit Service |
ca3877 |
*/
|
|
Packit Service |
ca3877 |
if (chunk)
|
|
Packit Service |
ca3877 |
soup_buffer_free (chunk);
|
|
Packit Service |
ca3877 |
else {
|
|
Packit Service |
ca3877 |
soup_test_assert (chunk, "Lost second chunk");
|
|
Packit Service |
ca3877 |
soup_session_abort (session);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_signal_handlers_disconnect_by_func (msg, temp_test_wrote_chunk, session);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
do_temporary_test (void)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupMessage *msg;
|
|
Packit Service |
ca3877 |
char *client_md5;
|
|
Packit Service |
ca3877 |
const char *server_md5;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_test_bug_base ("https://bugs.webkit.org/");
|
|
Packit Service |
ca3877 |
g_test_bug ("18343");
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
msg = soup_message_new_from_uri ("PUT", base_uri);
|
|
Packit Service |
ca3877 |
soup_message_body_append (msg->request_body, SOUP_MEMORY_TEMPORARY,
|
|
Packit Service |
ca3877 |
"one\r\n", 5);
|
|
Packit Service |
ca3877 |
soup_message_body_append (msg->request_body, SOUP_MEMORY_STATIC,
|
|
Packit Service |
ca3877 |
"two\r\n", 5);
|
|
Packit Service |
ca3877 |
soup_message_body_set_accumulate (msg->request_body, FALSE);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
client_md5 = g_compute_checksum_for_string (G_CHECKSUM_MD5,
|
|
Packit Service |
ca3877 |
"one\r\ntwo\r\n", 10);
|
|
Packit Service |
ca3877 |
g_signal_connect (msg, "wrote_chunk",
|
|
Packit Service |
ca3877 |
G_CALLBACK (temp_test_wrote_chunk), session);
|
|
Packit Service |
ca3877 |
soup_session_send_message (session, msg);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
soup_test_assert_message_status (msg, SOUP_STATUS_CREATED);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
server_md5 = soup_message_headers_get_one (msg->response_headers,
|
|
Packit Service |
ca3877 |
"Content-MD5");
|
|
Packit Service |
ca3877 |
g_assert_cmpstr (client_md5, ==, server_md5);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_free (client_md5);
|
|
Packit Service |
ca3877 |
g_object_unref (msg);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
#define LARGE_CHUNK_SIZE 1000000
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
typedef struct {
|
|
Packit Service |
ca3877 |
SoupBuffer *buf;
|
|
Packit Service |
ca3877 |
gsize offset;
|
|
Packit Service |
ca3877 |
} LargeChunkData;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
large_wrote_body_data (SoupMessage *msg, SoupBuffer *chunk, gpointer user_data)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
LargeChunkData *lcd = user_data;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
soup_assert_cmpmem (chunk->data, chunk->length,
|
|
Packit Service |
ca3877 |
lcd->buf->data + lcd->offset,
|
|
Packit Service |
ca3877 |
chunk->length);
|
|
Packit Service |
ca3877 |
lcd->offset += chunk->length;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
do_large_chunk_test (void)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupMessage *msg;
|
|
Packit Service |
ca3877 |
char *buf_data;
|
|
Packit Service |
ca3877 |
int i;
|
|
Packit Service |
ca3877 |
LargeChunkData lcd;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
msg = soup_message_new_from_uri ("PUT", base_uri);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
buf_data = g_malloc0 (LARGE_CHUNK_SIZE);
|
|
Packit Service |
ca3877 |
for (i = 0; i < LARGE_CHUNK_SIZE; i++)
|
|
Packit Service |
ca3877 |
buf_data[i] = i & 0xFF;
|
|
Packit Service |
ca3877 |
lcd.buf = soup_buffer_new (SOUP_MEMORY_TAKE, buf_data, LARGE_CHUNK_SIZE);
|
|
Packit Service |
ca3877 |
lcd.offset = 0;
|
|
Packit Service |
ca3877 |
soup_message_body_append_buffer (msg->request_body, lcd.buf);
|
|
Packit Service |
ca3877 |
soup_message_body_set_accumulate (msg->request_body, FALSE);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_signal_connect (msg, "wrote_body_data",
|
|
Packit Service |
ca3877 |
G_CALLBACK (large_wrote_body_data), &lcd;;
|
|
Packit Service |
ca3877 |
soup_session_send_message (session, msg);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
soup_test_assert_message_status (msg, SOUP_STATUS_CREATED);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
soup_buffer_free (lcd.buf);
|
|
Packit Service |
ca3877 |
g_object_unref (msg);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
static void
|
|
Packit Service |
ca3877 |
server_callback (SoupServer *server, SoupMessage *msg,
|
|
Packit Service |
ca3877 |
const char *path, GHashTable *query,
|
|
Packit Service |
ca3877 |
SoupClientContext *context, gpointer data)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
SoupMessageBody *md5_body;
|
|
Packit Service |
ca3877 |
char *md5;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (g_str_has_prefix (path, "/redirect")) {
|
|
Packit Service |
ca3877 |
soup_message_set_redirect (msg, SOUP_STATUS_FOUND, "/");
|
|
Packit Service |
ca3877 |
return;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
if (msg->method == SOUP_METHOD_GET) {
|
|
Packit Service |
ca3877 |
soup_message_set_response (msg, "text/plain",
|
|
Packit Service |
ca3877 |
SOUP_MEMORY_STATIC,
|
|
Packit Service |
ca3877 |
"three\r\ntwo\r\none\r\n",
|
|
Packit Service |
ca3877 |
strlen ("three\r\ntwo\r\none\r\n"));
|
|
Packit Service |
ca3877 |
soup_buffer_free (soup_message_body_flatten (msg->response_body));
|
|
Packit Service |
ca3877 |
md5_body = msg->response_body;
|
|
Packit Service |
ca3877 |
soup_message_set_status (msg, SOUP_STATUS_OK);
|
|
Packit Service |
ca3877 |
} else if (msg->method == SOUP_METHOD_PUT) {
|
|
Packit Service |
ca3877 |
soup_message_set_status (msg, SOUP_STATUS_CREATED);
|
|
Packit Service |
ca3877 |
md5_body = msg->request_body;
|
|
Packit Service |
ca3877 |
} else {
|
|
Packit Service |
ca3877 |
soup_message_set_status (msg, SOUP_STATUS_METHOD_NOT_ALLOWED);
|
|
Packit Service |
ca3877 |
return;
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
md5 = g_compute_checksum_for_data (G_CHECKSUM_MD5,
|
|
Packit Service |
ca3877 |
(guchar *)md5_body->data,
|
|
Packit Service |
ca3877 |
md5_body->length);
|
|
Packit Service |
ca3877 |
soup_message_headers_append (msg->response_headers,
|
|
Packit Service |
ca3877 |
"Content-MD5", md5);
|
|
Packit Service |
ca3877 |
g_free (md5);
|
|
Packit Service |
ca3877 |
}
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
int
|
|
Packit Service |
ca3877 |
main (int argc, char **argv)
|
|
Packit Service |
ca3877 |
{
|
|
Packit Service |
ca3877 |
GMainLoop *loop;
|
|
Packit Service |
ca3877 |
SoupServer *server;
|
|
Packit Service |
ca3877 |
int ret;
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
test_init (argc, argv, NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
server = soup_test_server_new (SOUP_TEST_SERVER_IN_THREAD);
|
|
Packit Service |
ca3877 |
soup_server_add_handler (server, NULL,
|
|
Packit Service |
ca3877 |
server_callback, NULL, NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
loop = g_main_loop_new (NULL, TRUE);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
base_uri = soup_test_server_get_uri (server, "http", NULL);
|
|
Packit Service |
ca3877 |
session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC, NULL);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_test_add_data_func ("/chunks/request/unstreamed", GINT_TO_POINTER (0), do_request_test);
|
|
Packit Service |
ca3877 |
g_test_add_data_func ("/chunks/request/proper-streaming", GINT_TO_POINTER (PROPER_STREAMING), do_request_test);
|
|
Packit Service |
ca3877 |
g_test_add_data_func ("/chunks/request/proper-streaming/restart", GINT_TO_POINTER (PROPER_STREAMING | RESTART), do_request_test);
|
|
Packit Service |
ca3877 |
g_test_add_data_func ("/chunks/request/hacky-streaming", GINT_TO_POINTER (HACKY_STREAMING), do_request_test);
|
|
Packit Service |
ca3877 |
g_test_add_data_func ("/chunks/request/hacky-streaming/restart", GINT_TO_POINTER (HACKY_STREAMING | RESTART), do_request_test);
|
|
Packit Service |
ca3877 |
g_test_add_func ("/chunks/response", do_response_test);
|
|
Packit Service |
ca3877 |
g_test_add_func ("/chunks/temporary", do_temporary_test);
|
|
Packit Service |
ca3877 |
g_test_add_func ("/chunks/large", do_large_chunk_test);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
ret = g_test_run ();
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
soup_test_session_abort_unref (session);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
soup_uri_free (base_uri);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
g_main_loop_unref (loop);
|
|
Packit Service |
ca3877 |
soup_test_server_quit_unref (server);
|
|
Packit Service |
ca3877 |
|
|
Packit Service |
ca3877 |
test_cleanup ();
|
|
Packit Service |
ca3877 |
return ret;
|
|
Packit Service |
ca3877 |
}
|