diff options
author | Rob <rob.manea@gmail.com> | 2010-03-22 15:36:30 +0100 |
---|---|---|
committer | Rob <rob.manea@gmail.com> | 2010-03-22 15:36:30 +0100 |
commit | b8855c1490a95bb16463b8bf83302fafdf00d869 (patch) | |
tree | 5b6aa4ab5603cff9d06805b59e8b61f4b63bd0c6 /src/uzbl-core.c | |
parent | f406fcdfa4c9ace7fe01e29f6845c70e0fa195c9 (diff) | |
parent | b15176878a1779f8a603797bce5d379770e8fe32 (diff) |
Merge branch 'jscookies' of git://git.cssx.ch/forks/uzbl into experimental
Conflicts:
src/callbacks.c
src/callbacks.h
Diffstat (limited to 'src/uzbl-core.c')
-rw-r--r-- | src/uzbl-core.c | 51 |
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)); |