aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/uzbl-core.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/uzbl-core.c')
-rw-r--r--src/uzbl-core.c51
1 files changed, 30 insertions, 21 deletions
diff --git a/src/uzbl-core.c b/src/uzbl-core.c
index 076a32e..ab58a6a 100644
--- a/src/uzbl-core.c
+++ b/src/uzbl-core.c
@@ -2373,16 +2373,15 @@ void handle_authentication (SoupSession *session, SoupMessage *msg, SoupAuth *au
}
}
-void handle_cookies (SoupSession *session, SoupMessage *msg, gpointer user_data){
+void handle_cookies (SoupSession *session, SoupMessage *msg, gpointer user_data) {
(void) session;
(void) user_data;
- //if (!uzbl.behave.cookie_handler)
- // return;
- soup_message_add_header_handler(msg, "got-headers", "Set-Cookie", G_CALLBACK(save_cookies), NULL);
+ soup_message_add_header_handler(msg, "got-headers", "Set-Cookie", G_CALLBACK(save_cookies_http), NULL);
GString *s = g_string_new ("");
SoupURI * soup_uri = soup_message_get_uri(msg);
g_string_printf(s, "GET '%s' '%s' '%s'", soup_uri->scheme, soup_uri->host, soup_uri->path);
+
if(uzbl.behave.cookie_handler)
run_handler(uzbl.behave.cookie_handler, s->str);
@@ -2392,7 +2391,30 @@ 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);
+
+ /* Disconnect to avoid recusion */
+ g_object_disconnect(G_OBJECT(uzbl.net.soup_cookie_jar), "any_signal", G_CALLBACK(save_cookies_js), 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(G_OBJECT(uzbl.net.soup_cookie_jar), "signal::changed", G_CALLBACK(save_cookies_js), NULL, NULL);
+ g_free(cookies);
+ }
}
+
if (uzbl.comm.sync_stdout)
uzbl.comm.sync_stdout = strfree(uzbl.comm.sync_stdout);
@@ -2400,23 +2422,6 @@ void handle_cookies (SoupSession *session, SoupMessage *msg, gpointer user_data)
}
void
-save_cookies (SoupMessage *msg, gpointer user_data){
- (void) user_data;
- GSList *ck;
- char *cookie;
- for (ck = soup_cookies_from_response(msg); ck; ck = ck->next){
- cookie = soup_cookie_to_set_cookie_header(ck->data);
- SoupURI * soup_uri = soup_message_get_uri(msg);
- GString *s = g_string_new ("");
- g_string_printf(s, "PUT '%s' '%s' '%s' '%s'", soup_uri->scheme, soup_uri->host, soup_uri->path, cookie);
- run_handler(uzbl.behave.cookie_handler, s->str);
- g_free (cookie);
- g_string_free(s, TRUE);
- }
- g_slist_free(ck);
-}
-
-void
dump_var_hash(gpointer k, gpointer v, gpointer ud) {
(void) ud;
uzbl_cmdprop *c = v;
@@ -2514,6 +2519,10 @@ initialize(int argc, char *argv[]) {
uzbl.net.soup_session = webkit_get_default_session();
+ 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(G_OBJECT(uzbl.net.soup_cookie_jar), "signal::changed", G_CALLBACK(save_cookies_js), 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));