summaryrefslogtreecommitdiff
path: root/libsoup/soup-session-async.c
diff options
context:
space:
mode:
authorXan Lopez <xan@gnome.org>2009-08-07 14:27:47 +0300
committerXan Lopez <xan@gnome.org>2009-08-07 14:28:29 +0300
commitf7ab5d4ac3c47dfed086ff5810d7a60957c5bc09 (patch)
treea69fb2aad2ec63c64ed6f8784ef4b8eab379a4e8 /libsoup/soup-session-async.c
parent8759ed475e7a8759251ccd7bb750c119ef923fe2 (diff)
downloadlibsoup-cache.tar.gz
Initial attempt to implement cache validation.cache
Diffstat (limited to 'libsoup/soup-session-async.c')
-rw-r--r--libsoup/soup-session-async.c80
1 files changed, 63 insertions, 17 deletions
diff --git a/libsoup/soup-session-async.c b/libsoup/soup-session-async.c
index e01f8883..6d3f70ad 100644
--- a/libsoup/soup-session-async.c
+++ b/libsoup/soup-session-async.c
@@ -10,6 +10,7 @@
#endif
#include "soup-address.h"
+#include "soup-cache.h"
#include "soup-session-async.h"
#include "soup-session-private.h"
#include "soup-address.h"
@@ -291,6 +292,50 @@ got_connection (SoupConnection *conn, guint status, gpointer session)
}
static void
+update_headers (const char *name, const char *value, SoupMessageHeaders *headers)
+{
+ if (soup_message_headers_get (headers, name))
+ soup_message_headers_replace (headers, name, value);
+ else
+ soup_message_headers_append (headers, name, value);
+}
+
+static void
+conditional_get_ready_cb (SoupSession *session, SoupMessage *msg, SoupMessage *original)
+{
+ if (msg->status_code == SOUP_STATUS_NOT_MODIFIED) {
+ SoupCache *cache;
+
+ cache = soup_session_get_cache (session);
+ soup_cache_send_response (cache, original);
+ } else {
+ SoupBuffer *buffer;
+ goffset offset;
+
+ soup_message_set_status (original, msg->status_code);
+ soup_message_headers_foreach (msg->response_headers,
+ (SoupMessageHeadersForeachFunc)update_headers,
+ original->response_headers);
+ soup_message_got_headers (original);
+ soup_message_body_free (original->response_body);
+ original->response_body = soup_message_body_new ();
+
+ offset = 0;
+ while (offset <= msg->response_body->length) {
+ buffer = soup_message_body_get_chunk (msg->response_body, offset);
+ if (!buffer) break;
+ soup_message_body_append_buffer (original->response_body, buffer);
+ soup_message_got_chunk (original, buffer);
+ offset += buffer->length;
+ soup_buffer_free (buffer);
+ }
+
+ soup_message_got_body (original);
+ soup_message_finished (original);
+ }
+}
+
+static void
run_queue (SoupSessionAsync *sa)
{
SoupSession *session = SOUP_SESSION (sa);
@@ -310,12 +355,6 @@ run_queue (SoupSessionAsync *sa)
item = soup_message_queue_next (queue, item)) {
msg = item->msg;
- if (cache && soup_cache_has_response (cache, msg)) {
- soup_message_set_io_status (msg, SOUP_MESSAGE_IO_STATUS_RUNNING);
- soup_cache_send_response (cache, msg);
- continue;
- }
-
/* CONNECT messages are handled specially */
if (msg->method == SOUP_METHOD_CONNECT)
continue;
@@ -324,6 +363,24 @@ run_queue (SoupSessionAsync *sa)
soup_message_io_in_progress (msg))
continue;
+ if (cache) {
+ SoupCacheResponse response;
+
+ response = soup_cache_has_response (cache, msg);
+ if (response == SOUP_CACHE_RESPONSE_FRESH) {
+ soup_message_set_io_status (msg, SOUP_MESSAGE_IO_STATUS_RUNNING);
+ soup_cache_send_response (cache, msg);
+ continue;
+ } else if (response == SOUP_CACHE_RESPONSE_NEEDS_VALIDATION) {
+ SoupMessage *conditional_msg;
+
+ soup_message_set_io_status (msg, SOUP_MESSAGE_IO_STATUS_RUNNING); /* ? */
+ conditional_msg = soup_cache_generate_conditional_request (cache, msg);
+ soup_session_queue_message (session, conditional_msg, conditional_get_ready_cb, msg);
+ continue;
+ }
+ }
+
if (proxy_resolver && !item->resolved_proxy_addr) {
resolve_proxy_addr (item, proxy_resolver);
continue;
@@ -412,21 +469,10 @@ do_idle_run_queue (SoupSession *session)
}
}
-static gboolean
-had_cache (SoupMessageQueueItem *item)
-{
- SoupCache *cache;
-
- cache = soup_session_get_cache (item->session);
- soup_cache_send_response (cache, item->session, item->msg);
- return FALSE;
-}
-
static void
queue_message (SoupSession *session, SoupMessage *req,
SoupSessionCallback callback, gpointer user_data)
{
- SoupCache *cache;
SoupMessageQueueItem *item;
SOUP_SESSION_CLASS (soup_session_async_parent_class)->queue_message (session, req, callback, user_data);