From ece5403146cd87be250f57c2119fcbe8666b0a42 Mon Sep 17 00:00:00 2001 From: Daniel Carl Date: Sat, 27 Oct 2012 16:40:53 +0200 Subject: [PATCH] Added cookie support. --- config.mk | 2 +- src/command.c | 2 +- src/command.h | 3 -- src/config.h | 3 ++ src/main.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++- src/main.h | 15 +++++++++- 6 files changed, 98 insertions(+), 7 deletions(-) diff --git a/config.mk b/config.mk index f013fa6..de83bbd 100644 --- a/config.mk +++ b/config.mk @@ -1,5 +1,5 @@ #----------------user/install options---------------- -VERSION = 0.1.0 +VERSION = 0.1.1 PROJECT = vimp PREFIX ?= /usr/local diff --git a/src/command.c b/src/command.c index 8f4769b..0d648f1 100644 --- a/src/command.c +++ b/src/command.c @@ -17,8 +17,8 @@ * along with this program. If not, see http://www.gnu.org/licenses/. */ -#include "command.h" #include "main.h" +#include "command.h" static CommandInfo cmd_list[] = { /* command function arg */ diff --git a/src/command.h b/src/command.h index 88eacaa..f150954 100644 --- a/src/command.h +++ b/src/command.h @@ -20,9 +20,6 @@ #ifndef COMMAND_H #define COMMAND_H -#include "main.h" -#include - typedef gboolean (*Command)(const Arg* arg); typedef struct { diff --git a/src/config.h b/src/config.h index 9c56a22..f669dce 100644 --- a/src/config.h +++ b/src/config.h @@ -22,6 +22,9 @@ #include "stdlib.h" +/* features */ +#define FEATURE_COOKIE + #define START_PAGE "http://sourceforge.net/apps/trac/vimprobable" #define STATUS_BG_COLOR "#000000" /* background color for status bar */ diff --git a/src/main.c b/src/main.c index 33f9b70..e976534 100644 --- a/src/main.c +++ b/src/main.c @@ -34,6 +34,10 @@ static gboolean vp_frame_scrollbar_policy_changed_cb(void); static void vp_inputbox_activate_cb(GtkEntry* entry, gpointer user_data); static gboolean vp_inputbox_keypress_cb(GtkEntry* entry, GdkEventKey* event); static gboolean vp_inputbox_keyrelease_cb(GtkEntry* entry, GdkEventKey* event); +#ifdef FEATURE_COOKIE +static void vp_new_request_cb(SoupSession* session, SoupMessage *message, gpointer data); +static void vp_gotheaders_cb(SoupMessage* message, gpointer data); +#endif /* functions */ static gboolean vp_process_input(const char* input); @@ -46,6 +50,10 @@ static void vp_set_widget_font(GtkWidget* widget, const gchar* font_definition, static void vp_setup_settings(void); static void vp_setup_signals(void); static gboolean vp_load_uri(const Arg* arg); +#ifdef FEATURE_COOKIE +static void vp_set_cookie(SoupCookie* cookie); +static const gchar* vp_get_cookies(SoupURI *uri); +#endif static void vp_clean_up(void); static void vp_webview_load_status_cb(WebKitWebView* view, GParamSpec* pspec, gpointer user_data) @@ -127,6 +135,33 @@ static gboolean vp_inputbox_keyrelease_cb(GtkEntry *entry, GdkEventKey *event) return FALSE; } +#ifdef FEATURE_COOKIE +static void vp_new_request_cb(SoupSession* session, SoupMessage *message, gpointer data) +{ + SoupMessageHeaders* header = message->request_headers; + SoupURI* uri; + const gchar* cookie; + + soup_message_headers_remove(header, "Cookie"); + uri = soup_message_get_uri(message); + if ((cookie = vp_get_cookies(uri))) { + soup_message_headers_append(header, "Cookie", cookie); + } + g_signal_connect_after(G_OBJECT(message), "got-headers", G_CALLBACK(vp_gotheaders_cb), NULL); +} + +static void vp_gotheaders_cb(SoupMessage* message, gpointer data) +{ + GSList* list = NULL; + GSList* p = NULL; + + for(p = list = soup_cookies_from_response(message); p; p = g_slist_next(p)) { + vp_set_cookie((SoupCookie *)p->data); + } + soup_cookies_free(list); +} +#endif + static gboolean vp_process_input(const char* input) { gboolean success; @@ -184,6 +219,33 @@ static gboolean vp_load_uri(const Arg* arg) return TRUE; } +#ifdef FEATURE_COOKIE +static void vp_set_cookie(SoupCookie* cookie) +{ + SoupDate* date; + + SoupCookieJar* jar = soup_cookie_jar_text_new(vp.files[FILES_COOKIE], FALSE); + cookie = soup_cookie_copy(cookie); + if (cookie->expires == NULL && vp.config.cookie_timeout) { + date = soup_date_new_from_time_t(time(NULL) + vp.config.cookie_timeout); + soup_cookie_set_expires(cookie, date); + } + soup_cookie_jar_add_cookie(jar, cookie); + g_object_unref(jar); +} + +static const gchar* vp_get_cookies(SoupURI *uri) +{ + const gchar* cookie; + + SoupCookieJar* jar = soup_cookie_jar_text_new(vp.files[FILES_COOKIE], TRUE); + cookie = soup_cookie_jar_get_cookies(jar, uri, TRUE); + g_object_unref(jar); + + return cookie; +} +#endif + gboolean vp_navigate(const Arg* arg) { if (arg->i <= VP_NAVIG_FORWARD) { @@ -409,6 +471,8 @@ static void vp_init(void) keybind_init(); vp_read_config(); + + vp.config.cookie_timeout = 4800; } static void vp_read_config(void) @@ -463,6 +527,13 @@ static void vp_init_gui(void) /* Create a browser instance */ gui->webview = WEBKIT_WEB_VIEW(webkit_web_view_new()); + /* init soup session */ +#ifdef FEATURE_COOKIE + vp.net.soup_session = webkit_get_default_session(); + soup_session_remove_feature_by_type(vp.net.soup_session, soup_cookie_get_type()); + soup_session_remove_feature_by_type(vp.net.soup_session, soup_cookie_jar_get_type()); +#endif + vp_setup_settings(); /* Create a scrollable area */ @@ -528,6 +599,9 @@ static void vp_init_files(void) vp.files[FILES_CONFIG] = g_build_filename(path, "config", NULL); util_create_file_if_not_exists(vp.files[FILES_CONFIG]); + vp.files[FILES_COOKIE] = g_build_filename(path, "cookies", NULL); + util_create_file_if_not_exists(vp.files[FILES_COOKIE]); + g_free(path); } @@ -570,6 +644,8 @@ static void vp_setup_signals(void) g_signal_connect(G_OBJECT(frame), "scrollbars-policy-changed", G_CALLBACK(vp_frame_scrollbar_policy_changed_cb), NULL); g_signal_connect(G_OBJECT(gui->webview), "notify::load-status", G_CALLBACK(vp_webview_load_status_cb), NULL); g_signal_connect(G_OBJECT(gui->webview), "load-committed", G_CALLBACK(vp_webview_load_commited_cb), NULL); + g_object_set(vp.net.soup_session, "max-conns", SETTING_MAX_CONNS , NULL); + g_object_set(vp.net.soup_session, "max-conns-per-host", SETTING_MAX_CONNS_PER_HOST, NULL); g_object_connect( G_OBJECT(gui->inputbox), @@ -578,7 +654,9 @@ static void vp_setup_signals(void) "signal::key-release-event", G_CALLBACK(vp_inputbox_keyrelease_cb), NULL, NULL ); - +#ifdef FEATURE_COOKIE + g_signal_connect_after(G_OBJECT(vp.net.soup_session), "request-started", G_CALLBACK(vp_new_request_cb), NULL); +#endif } int main(int argc, char* argv[]) diff --git a/src/main.h b/src/main.h index 96dda9b..b9d7748 100644 --- a/src/main.h +++ b/src/main.h @@ -94,6 +94,7 @@ typedef enum { enum { FILES_FIRST = 0, FILES_CONFIG = 0, + FILES_COOKIE, FILES_LAST }; @@ -138,14 +139,26 @@ typedef struct { GHashTable* commands; } Behaviour; +typedef struct { + SoupSession* soup_session; + SoupCookieJar* cookie_jar; +} Network; + +typedef struct { + time_t cookie_timeout; +} Config; + /* core struct */ typedef struct { Gui gui; State state; Behaviour behave; gchar* files[FILES_LAST]; -#if 0 +#ifdef FEATURE_COOKIE Network net; +#endif + Config config; +#if 0 Ssl ssl; Communication comm; Info info; -- 2.20.1