summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXan Lopez <xan@gnome.org>2009-05-07 23:45:54 +0300
committerXan Lopez <xan@gnome.org>2009-05-07 23:45:54 +0300
commitb0a27affd574e8e2b2673aa9652cd1afcbc04fe0 (patch)
treeb4d844f9842ebdfcb8fa4ee147f39c625e6f5052
parent70afdae62aaca0ce3558df9e2e05ce35404fd788 (diff)
downloadlibsoup-b0a27affd574e8e2b2673aa9652cd1afcbc04fe0.tar.gz
Initial commit for cache support.
-rw-r--r--libsoup/Makefile.am2
-rw-r--r--libsoup/soup-headers.c3
-rw-r--r--libsoup/soup-session-async.c17
-rw-r--r--libsoup/soup-session-private.h2
-rw-r--r--libsoup/soup-session.c16
-rw-r--r--libsoup/soup.h1
6 files changed, 41 insertions, 0 deletions
diff --git a/libsoup/Makefile.am b/libsoup/Makefile.am
index dc9ff551..ef05b729 100644
--- a/libsoup/Makefile.am
+++ b/libsoup/Makefile.am
@@ -55,6 +55,7 @@ soup_headers = \
soup-auth-domain.h \
soup-auth-domain-basic.h \
soup-auth-domain-digest.h \
+ soup-cache.h \
soup-cookie.h \
soup-cookie-jar.h \
soup-cookie-jar-text.h \
@@ -116,6 +117,7 @@ libsoup_2_4_la_SOURCES = \
soup-auth-manager.c \
soup-auth-manager-ntlm.h \
soup-auth-manager-ntlm.c \
+ soup-cache.c \
soup-connection.h \
soup-connection.c \
soup-cookie.c \
diff --git a/libsoup/soup-headers.c b/libsoup/soup-headers.c
index f815db3e..98189536 100644
--- a/libsoup/soup-headers.c
+++ b/libsoup/soup-headers.c
@@ -818,6 +818,9 @@ soup_header_g_string_append_param (GString *string, const char *name,
{
const char *v;
+ g_return_if_fail (name);
+ g_return_if_fail (value);
+
g_string_append (string, name);
if (!value)
return;
diff --git a/libsoup/soup-session-async.c b/libsoup/soup-session-async.c
index a492ee54..97d4f2f1 100644
--- a/libsoup/soup-session-async.c
+++ b/libsoup/soup-session-async.c
@@ -361,10 +361,21 @@ 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);
@@ -377,6 +388,12 @@ queue_message (SoupSession *session, SoupMessage *req,
g_signal_connect_after (req, "finished",
G_CALLBACK (final_finished), item);
+ cache = soup_session_get_cache (session);
+ if (cache && soup_cache_has_response (cache, session, req)) {
+ g_idle_add ((GSourceFunc)had_cache, item);
+ return;
+ }
+
do_idle_run_queue (session);
}
diff --git a/libsoup/soup-session-private.h b/libsoup/soup-session-private.h
index f8b13d5c..015704fa 100644
--- a/libsoup/soup-session-private.h
+++ b/libsoup/soup-session-private.h
@@ -6,6 +6,7 @@
#ifndef SOUP_SESSION_PRIVATE_H
#define SOUP_SESSION_PRIVATE_H 1
+#include "soup-cache.h"
#include "soup-session.h"
#include "soup-connection.h"
#include "soup-message-queue.h"
@@ -24,6 +25,7 @@ SoupConnection *soup_session_get_connection (SoupSession *session,
gboolean soup_session_try_prune_connection (SoupSession *session);
SoupProxyResolver *soup_session_get_proxy_resolver (SoupSession *session);
+SoupCache *soup_session_get_cache (SoupSession *session);
G_END_DECLS
diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c
index cbaa42d6..b8841b30 100644
--- a/libsoup/soup-session.c
+++ b/libsoup/soup-session.c
@@ -18,6 +18,7 @@
#include "soup-auth-basic.h"
#include "soup-auth-digest.h"
#include "soup-auth-manager-ntlm.h"
+#include "soup-cache.h"
#include "soup-connection.h"
#include "soup-marshal.h"
#include "soup-message-private.h"
@@ -65,6 +66,7 @@ typedef struct {
typedef struct {
SoupProxyResolver *proxy_resolver;
+ SoupCache *cache;
char *ssl_ca_file;
SoupSSLCredentials *ssl_creds;
@@ -1494,6 +1496,9 @@ soup_session_add_feature (SoupSession *session, SoupSessionFeature *feature)
if (SOUP_IS_PROXY_RESOLVER (feature))
priv->proxy_resolver = SOUP_PROXY_RESOLVER (feature);
+
+ if (SOUP_IS_CACHE (feature))
+ priv->cache = SOUP_CACHE (feature);
}
/**
@@ -1546,6 +1551,9 @@ soup_session_remove_feature (SoupSession *session, SoupSessionFeature *feature)
if (feature == (SoupSessionFeature *)priv->proxy_resolver)
priv->proxy_resolver = NULL;
+
+ if (feature == (SoupSessionFeature *)priv->cache)
+ priv->cache = NULL;
}
}
@@ -1646,3 +1654,11 @@ soup_session_get_proxy_resolver (SoupSession *session)
return priv->proxy_resolver;
}
+
+SoupCache *
+soup_session_get_cache (SoupSession *session)
+{
+ SoupSessionPrivate *priv = SOUP_SESSION_GET_PRIVATE (session);
+
+ return priv->cache;
+}
diff --git a/libsoup/soup.h b/libsoup/soup.h
index 496a4c1b..4ac09911 100644
--- a/libsoup/soup.h
+++ b/libsoup/soup.h
@@ -15,6 +15,7 @@ extern "C" {
#include <libsoup/soup-auth-domain.h>
#include <libsoup/soup-auth-domain-basic.h>
#include <libsoup/soup-auth-domain-digest.h>
+#include <libsoup/soup-cache.h>
#include <libsoup/soup-cookie.h>
#include <libsoup/soup-cookie-jar.h>
#include <libsoup/soup-cookie-jar-text.h>