diff options
author | Jan-Michael Brummer <jan.brummer@tabos.org> | 2023-01-31 16:14:10 +0100 |
---|---|---|
committer | Jan-Michael Brummer <jan.brummer@tabos.org> | 2023-03-27 16:31:58 +0200 |
commit | ebb3ce6c5934933e3115fba6d3ddebff0ce9f92c (patch) | |
tree | 7a722453022da324dd7cdb52c8a06cd7eef957e8 | |
parent | 79b7c5fff8af78dd460e62dd255a6f6ac2bbdbc5 (diff) | |
download | libproxy-git-ebb3ce6c5934933e3115fba6d3ddebff0ce9f92c.tar.gz |
Parse and format PAC response (#36)
Fixes: https://github.com/janbrummer/libproxy2/issues/32
-rw-r--r-- | src/backend/px-manager.c | 54 | ||||
-rw-r--r-- | src/tests/px-manager-test.c | 2 |
2 files changed, 49 insertions, 7 deletions
diff --git a/src/backend/px-manager.c b/src/backend/px-manager.c index ea4411e..9fe2682 100644 --- a/src/backend/px-manager.c +++ b/src/backend/px-manager.c @@ -120,6 +120,8 @@ px_manager_constructed (GObject *object) peas_engine_unload_plugin (self->engine, info); } + self->pac_data = NULL; + self->network_monitor = g_network_monitor_get_default (); g_signal_connect_object (G_OBJECT (self->network_monitor), "network-changed", G_CALLBACK (px_manager_on_network_changed), self, 0); } @@ -337,15 +339,55 @@ px_manager_run_pac (PeasExtensionSet *set, { PxPacRunnerInterface *ifc = PX_PAC_RUNNER_GET_IFACE (extension); struct PacData *pac_data = data; - char *ret; + g_auto (GStrv) proxies_split = NULL; + char *pac_response; - if (!ifc->set_pac (PX_PAC_RUNNER (extension), pac_data->pac)) { + if (!ifc->set_pac (PX_PAC_RUNNER (extension), pac_data->pac)) return; - } - ret = ifc->run (PX_PAC_RUNNER (extension), pac_data->uri); - if (ret) - g_strv_builder_add (pac_data->builder, ret); + pac_response = ifc->run (PX_PAC_RUNNER (extension), pac_data->uri); + + /* Split line to handle multiple proxies */ + proxies_split = g_strsplit (pac_response, ";", -1); + + for (int idx = 0; idx < g_strv_length (proxies_split); idx++) { + char *line = g_strstrip (proxies_split[idx]); + g_auto (GStrv) word_split = g_strsplit (line, " ", -1); + g_autoptr (GUri) uri = NULL; + char *method; + char *server; + + /* Check for syntax "METHOD SERVER" */ + if (g_strv_length (word_split) == 2) { + g_autofree char *uri_string = NULL; + g_autofree char *proxy_string = NULL; + + method = word_split[0]; + server = word_split[1]; + + uri_string = g_strconcat ("http://", server, NULL); + uri = g_uri_parse (uri_string, G_URI_FLAGS_PARSE_RELAXED, NULL); + if (!uri) + continue; + + if (g_ascii_strncasecmp (method, "proxy", 5) == 0) { + proxy_string = g_uri_to_string (uri); + } else if (g_ascii_strncasecmp (method, "socks", 5) == 0) { + proxy_string = g_strconcat ("socks://", server, NULL); + } else if (g_ascii_strncasecmp (method, "socks4", 6) == 0) { + proxy_string = g_strconcat ("socks4://", server, NULL); + } else if (g_ascii_strncasecmp (method, "socks4a", 7) == 0) { + proxy_string = g_strconcat ("socks4a://", server, NULL); + } else if (g_ascii_strncasecmp (method, "socks5", 6) == 0) { + proxy_string = g_strconcat ("socks5://", server, NULL); + } + + g_strv_builder_add (pac_data->builder, proxy_string); + } else { + /* Syntax not found, returning direct */ + g_strv_builder_add (pac_data->builder, "direct://"); + } + } } static gboolean diff --git a/src/tests/px-manager-test.c b/src/tests/px-manager-test.c index afab118..b62c408 100644 --- a/src/tests/px-manager-test.c +++ b/src/tests/px-manager-test.c @@ -142,7 +142,7 @@ get_proxies_pac (gpointer data) config = px_manager_get_proxies_sync (self->manager, "https://www.example.com", NULL); g_assert_nonnull (config); - g_assert_cmpstr (config[0], ==, "PROXY 127.0.0.1:1983"); + g_assert_cmpstr (config[0], ==, "http://127.0.0.1:1983"); g_main_loop_quit (self->loop); |