summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan-Michael Brummer <jan.brummer@tabos.org>2023-01-31 16:14:10 +0100
committerJan-Michael Brummer <jan.brummer@tabos.org>2023-03-27 16:31:58 +0200
commitebb3ce6c5934933e3115fba6d3ddebff0ce9f92c (patch)
tree7a722453022da324dd7cdb52c8a06cd7eef957e8
parent79b7c5fff8af78dd460e62dd255a6f6ac2bbdbc5 (diff)
downloadlibproxy-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.c54
-rw-r--r--src/tests/px-manager-test.c2
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);