aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Cedric Staub <cs.staub@cssx.ch>2010-02-17 12:20:03 +0100
committerGravatar Cedric Staub <cs.staub@cssx.ch>2010-02-17 12:20:03 +0100
commitecda3bd031607a9dc11819c7c3f8e41419618c37 (patch)
treeceb61f350f3a18fab4c00aee35ccb1c5c905e4db /src
parent7bfb3b5b56e30b157cfb750657de104055fe6da3 (diff)
Use SoupCookieJar to handle JavaScript cookies
Diffstat (limited to 'src')
-rw-r--r--src/callbacks.c17
-rw-r--r--src/callbacks.h2
-rw-r--r--src/uzbl-core.c25
-rw-r--r--src/uzbl-core.h1
4 files changed, 45 insertions, 0 deletions
diff --git a/src/callbacks.c b/src/callbacks.c
index 9b90d3c..97ee52a 100644
--- a/src/callbacks.c
+++ b/src/callbacks.c
@@ -779,3 +779,20 @@ populate_popup_cb(WebKitWebView *v, GtkMenu *m, void *c) {
}
}
+void
+cookie_handler_cb(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie, gpointer user_data) {
+ (void) jar;
+ (void) user_data;
+ (void) old_cookie;
+ char *scheme;
+ GString *s;
+
+ if(new_cookie != NULL) {
+ scheme = (new_cookie->secure == TRUE) ? "https" : "http";
+
+ s = g_string_new("");
+ g_string_printf(s, "PUT '%s' '%s' '%s' '%s=%s'", scheme, new_cookie->domain, new_cookie->path, new_cookie->name, new_cookie->value);
+ run_handler(uzbl.behave.cookie_handler, s->str);
+ g_string_free(s, TRUE);
+ }
+}
diff --git a/src/callbacks.h b/src/callbacks.h
index 6ed8986..07c286a 100644
--- a/src/callbacks.h
+++ b/src/callbacks.h
@@ -208,3 +208,5 @@ button_release_cb (GtkWidget* window, GdkEventButton* event);
gboolean
focus_cb(GtkWidget* window, GdkEventFocus* event, void *ud);
+void
+cookie_handler_cb(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie, gpointer user_data);
diff --git a/src/uzbl-core.c b/src/uzbl-core.c
index ebd8ef8..5834f8b 100644
--- a/src/uzbl-core.c
+++ b/src/uzbl-core.c
@@ -2412,6 +2412,27 @@ void handle_cookies (SoupSession *session, SoupMessage *msg, gpointer user_data)
if ( p != NULL ) *p = '\0';
soup_message_headers_replace (msg->request_headers, "Cookie", (const char *) uzbl.comm.sync_stdout);
+ int len = strlen(uzbl.comm.sync_stdout);
+
+ if(len > 0) {
+ SoupCookie *soup_cookie;
+ char *cookies = (char *) g_malloc(len+1);
+ strncpy(cookies, uzbl.comm.sync_stdout, len+1);
+
+ g_object_disconnect((GObject*)uzbl.net.soup_cookie_jar, "any_signal", (GCallback)cookie_handler_cb, NULL, NULL);
+
+ p = cookies - 1;
+ while(p != NULL) {
+ p = p + 1;
+ soup_cookie = soup_cookie_parse((const char *) p, soup_uri);
+ if(soup_cookie->domain == NULL) soup_cookie->domain = soup_uri->host;
+ soup_cookie_jar_add_cookie(uzbl.net.soup_cookie_jar, soup_cookie);
+ p = strchr(p, ';');
+ }
+
+ g_object_connect((GObject*)uzbl.net.soup_cookie_jar, "signal::changed", (GCallback)cookie_handler_cb, NULL, NULL);
+ g_free(cookies);
+ }
}
if (uzbl.comm.sync_stdout)
uzbl.comm.sync_stdout = strfree(uzbl.comm.sync_stdout);
@@ -2535,6 +2556,10 @@ initialize(int argc, char *argv[]) {
uzbl.net.soup_session = webkit_get_default_session();
uzbl.state.keycmd = g_strdup("");
+ uzbl.net.soup_cookie_jar = soup_cookie_jar_new();
+ soup_session_add_feature(uzbl.net.soup_session, SOUP_SESSION_FEATURE(uzbl.net.soup_cookie_jar));
+ g_object_connect((GObject*)uzbl.net.soup_cookie_jar, "signal::changed", (GCallback)cookie_handler_cb, NULL, NULL);
+
for(i=0; sigs[i]; i++) {
if(setup_signal(sigs[i], catch_signal) == SIG_ERR)
fprintf(stderr, "uzbl: error hooking %d: %s\n", sigs[i], strerror(errno));
diff --git a/src/uzbl-core.h b/src/uzbl-core.h
index 23072e4..b5a527a 100644
--- a/src/uzbl-core.h
+++ b/src/uzbl-core.h
@@ -106,6 +106,7 @@ typedef struct {
/* networking */
typedef struct {
SoupSession *soup_session;
+ SoupCookieJar *soup_cookie_jar;
SoupLogger *soup_logger;
char *proxy_url;
char *useragent;