diff options
author | Marco Peereboom <marco@conformal.com> | 2011-12-28 15:42:52 -0600 |
---|---|---|
committer | Marco Peereboom <marco@conformal.com> | 2011-12-28 15:42:52 -0600 |
commit | 2cf22fd10091dadcfc8209f4ca58d15d458e90dd (patch) | |
tree | adfd6e972d038edcd552ff07c5106f2ae3ea4235 | |
parent | 6e798a18c65df1340037a6881088990e1fa30d14 (diff) | |
download | xombrero-2cf22fd10091dadcfc8209f4ca58d15d458e90dd.tar.gz |
Add round robin user agents
Fixes FS#65 from Elias Norberg xyzzy@kudzu.se
-rw-r--r-- | settings.c | 56 | ||||
-rw-r--r-- | xxxterm.1 | 4 | ||||
-rw-r--r-- | xxxterm.c | 24 | ||||
-rw-r--r-- | xxxterm.h | 10 |
4 files changed, 89 insertions, 5 deletions
diff --git a/settings.c b/settings.c index 79e4830..6cd208e 100644 --- a/settings.c +++ b/settings.c @@ -70,7 +70,8 @@ char runtime_settings[PATH_MAX]; /* override of settings */ int allow_volatile_cookies = 0; int color_visited_uris = 1; int save_global_history = 0; /* save global history to disk */ -char *user_agent = NULL; +struct user_agent *user_agent = NULL; +int user_agent_roundrobin = 0; /* change user-agent after each request */ int save_rejected_cookies = 0; int session_autosave = 0; int guess_search = 0; @@ -108,6 +109,7 @@ int add_pl_wl(struct settings *, char *); int add_mime_type(struct settings *, char *); int add_alias(struct settings *, char *); int add_kb(struct settings *, char *); +int add_ua(struct settings *, char *); int set_download_dir(struct settings *, char *); int set_default_script(struct settings *, char *); @@ -115,6 +117,7 @@ int set_runtime_dir(struct settings *, char *); int set_tab_style(struct settings *, char *); int set_edit_mode(struct settings *, char *); int set_work_dir(struct settings *, char *); +int set_ua_roundrobin(char *); void walk_mime_type(struct settings *, void (*)(struct settings *, char *, void *), void *); @@ -128,6 +131,8 @@ void walk_pl_wl(struct settings *, void (*)(struct settings *, char *, void *), void *); void walk_kb(struct settings *, void (*)(struct settings *, char *, void *), void *); +void walk_ua(struct settings *, void (*)(struct settings *, char *, + void *), void *); int set_http_proxy(char *proxy) @@ -240,6 +245,12 @@ struct special s_edit_mode = { NULL }; +struct special s_ua = { + add_ua, + NULL, + walk_ua +}; + struct settings rs[] = { { "allow_volatile_cookies", XT_S_INT, 0, &allow_volatile_cookies, NULL, NULL }, { "append_next", XT_S_INT, 0, &append_next, NULL, NULL }, @@ -289,11 +300,11 @@ struct settings rs[] = { { "statusbar_elems", XT_S_STR, 0, NULL, &statusbar_elems, NULL }, { "tab_style", XT_S_STR, 0, NULL, NULL,&s_tab_style }, { "url_regex", XT_S_STR, 0, NULL, &url_regex, NULL }, - { "user_agent", XT_S_STR, 0, NULL, &user_agent, NULL }, { "window_height", XT_S_INT, 0, &window_height, NULL, NULL }, { "window_width", XT_S_INT, 0, &window_width, NULL, NULL }, { "work_dir", XT_S_STR, 0, NULL, NULL,&s_work_dir }, { "xterm_workaround", XT_S_INT, 0, &xterm_workaround, NULL, NULL }, + { "user_agent_roundrobin", XT_S_INT, 0, &user_agent_roundrobin, NULL, NULL, NULL, set_ua_roundrobin }, /* font settings */ { "cmd_font", XT_S_STR, 0, NULL, &cmd_font_name, NULL }, @@ -308,6 +319,7 @@ struct settings rs[] = { { "keybinding", XT_S_STR, XT_SF_RUNTIME, NULL, NULL, &s_kb }, { "mime_type", XT_S_STR, XT_SF_RUNTIME, NULL, NULL, &s_mime }, { "pl_wl", XT_S_STR, XT_SF_RUNTIME, NULL, NULL, &s_pl }, + { "user_agent", XT_S_STR, XT_SF_RUNTIME, NULL, NULL, &s_ua }, }; size_t @@ -924,6 +936,46 @@ add_kb(struct settings *s, char *entry) return (keybinding_add(entry, key, key[0] == '!')); } +int +add_ua(struct settings *s, char *value) +{ + struct user_agent *ua; + + ua = g_malloc0(sizeof *ua); + ua->value = g_strdup(value); + + TAILQ_INSERT_HEAD(&ua_list, ua, entry); + + /* use the last added user agent */ + user_agent = TAILQ_FIRST(&ua_list); + + return (0); +} + + +void +walk_ua(struct settings *s, + void (*cb)(struct settings *, char *, void *), void *cb_args) +{ + struct user_agent *ua; + + if (s == NULL || cb == NULL) { + show_oops(NULL, "walk_ua invalid parameters"); + return; + } + + TAILQ_FOREACH(ua, &ua_list, entry) { + cb(s, ua->value, cb_args); + } +} + +int +set_ua_roundrobin(char *value) +{ + user_agent_roundrobin = atoi(value); + return (0); +} + void setup_proxy(char *uri) { diff --git a/xxxterm.1 b/xxxterm.1 index 28fddc1..04d3ea2 100644 --- a/xxxterm.1 +++ b/xxxterm.1 @@ -1213,7 +1213,9 @@ URL when using .It Cm user_agent Set to override the default .Nm -user-agent string. +user-agent string. May be specified several times for switching between user-agents. +.It Cm user_agent_roundrobin +If enabled, switches between specified user-agents for each new request. .It Cm window_height Set the default height of the browser window. .It Cm window_width diff --git a/xxxterm.c b/xxxterm.c index 09fe44d..61254e8 100644 --- a/xxxterm.c +++ b/xxxterm.c @@ -241,6 +241,7 @@ struct domain_list pl_wl; struct undo_tailq undos; struct keybinding_list kbl; struct sp_list spl; +struct user_agent_list ua_list; struct command_list chl; struct command_list shl; struct command_entry *history_at; @@ -4266,6 +4267,26 @@ webview_npd_cb(WebKitWebView *wv, WebKitWebFrame *wf, return (TRUE); /* we made the decission */ } + /* change user agent */ + if (user_agent_roundrobin ) { + struct user_agent *ua; + + if ((ua = TAILQ_NEXT(user_agent, entry)) == NULL) + user_agent = TAILQ_FIRST(&ua_list); + else + user_agent = ua; + + free(t->user_agent); + t->user_agent = g_strdup(user_agent->value); + + DNPRINTF(XT_D_NAV, "user-agent: %s\n", t->user_agent); + + g_object_set(G_OBJECT(t->settings), + "user-agent", t->user_agent, (char *)NULL); + + webkit_web_view_set_settings(wv, t->settings); + } + /* * This is a little hairy but it comes down to this: * when we run in whitelist mode we have to assist the browser in @@ -5945,7 +5966,7 @@ create_browser(struct tab *t) t->user_agent = g_strdup_printf("%s %s+", strval, version); g_free(strval); } else - t->user_agent = g_strdup(user_agent); + t->user_agent = g_strdup(user_agent->value); t->stylesheet = g_strdup_printf("file://%s/style.css", resource_dir); @@ -7335,6 +7356,7 @@ main(int argc, char *argv[]) TAILQ_INIT(&spl); TAILQ_INIT(&chl); TAILQ_INIT(&shl); + TAILQ_INIT(&ua_list); /* fiddle with ulimits */ if (getrlimit(RLIMIT_NOFILE, &rlp) == -1) diff --git a/xxxterm.h b/xxxterm.h index dee5f6d..5e9f0ec 100644 --- a/xxxterm.h +++ b/xxxterm.h @@ -447,6 +447,12 @@ struct key_binding { }; TAILQ_HEAD(keybinding_list, key_binding); +struct user_agent { + char *value; + TAILQ_ENTRY(user_agent) entry; +}; +TAILQ_HEAD(user_agent_list, user_agent); + struct settings { char *name; int type; @@ -516,7 +522,8 @@ extern char runtime_settings[PATH_MAX]; extern int allow_volatile_cookies; extern int color_visited_uris; extern int save_global_history; -extern char *user_agent; +extern struct user_agent *user_agent; +extern int user_agent_roundrobin; extern int save_rejected_cookies; extern int session_autosave; extern int guess_search; @@ -565,6 +572,7 @@ extern struct alias_list aliases; extern struct mime_type_list mtl; extern struct keybinding_list kbl; extern struct sp_list spl; +extern struct user_agent_list ua_list; extern PangoFontDescription *cmd_font; extern PangoFontDescription *oops_font; |