summaryrefslogtreecommitdiffstats
path: root/aclk/aclk_lws_wss_client.c
diff options
context:
space:
mode:
authorTimo <6674623+underhood@users.noreply.github.com>2020-03-25 09:17:51 +0100
committerGitHub <noreply@github.com>2020-03-25 09:17:51 +0100
commita8e9fcb3630ebdcc92d895a6d8bf3e1c9a588a35 (patch)
tree0e8ee2f698dcd4e97fa1ed342b45bc59b9a0e2c4 /aclk/aclk_lws_wss_client.c
parent82211d07b42f6a6dd365cafd34089e48e5411850 (diff)
HTTP proxy support + some cleanup (#8418)
* HTTP proxy support + some cleanup * fix unrelated compiler warnings with -Wextra * minor - log proxy setting * run changed code trough .clang-format * fix case when url ends by / * update README
Diffstat (limited to 'aclk/aclk_lws_wss_client.c')
-rw-r--r--aclk/aclk_lws_wss_client.c82
1 files changed, 49 insertions, 33 deletions
diff --git a/aclk/aclk_lws_wss_client.c b/aclk/aclk_lws_wss_client.c
index 6af19d922a..06f8d2451a 100644
--- a/aclk/aclk_lws_wss_client.c
+++ b/aclk/aclk_lws_wss_client.c
@@ -208,42 +208,81 @@ void aclk_lws_wss_client_destroy()
#endif
}
-int aclk_wss_set_socks(struct lws_vhost *vhost, const char *socks) {
+static int aclk_wss_set_socks(struct lws_vhost *vhost, const char *socks)
+{
char *proxy = strstr(socks, ACLK_PROXY_PROTO_ADDR_SEPARATOR);
- if(!proxy)
+ if (!proxy)
return -1;
proxy += strlen(ACLK_PROXY_PROTO_ADDR_SEPARATOR);
- if(!*proxy)
+ if (!*proxy)
return -1;
return lws_set_socks(vhost, proxy);
}
+void aclk_wss_set_proxy(struct lws_vhost *vhost)
+{
+ const char *proxy;
+ ACLK_PROXY_TYPE proxy_type;
+ char *log;
+
+ proxy = aclk_get_proxy(&proxy_type);
+
+ lws_set_socks(vhost, ":");
+ lws_set_proxy(vhost, ":");
+
+ if (proxy_type == PROXY_TYPE_UNKNOWN) {
+ error("Unknown proxy type");
+ return;
+ }
+
+ if (proxy_type == PROXY_TYPE_SOCKS5 || proxy_type == PROXY_TYPE_HTTP) {
+ log = strdupz(proxy);
+ safe_log_proxy_censor(log);
+ info("Connecting using %s proxy:\"%s\"", aclk_proxy_type_to_s(&proxy_type), log);
+ freez(log);
+ }
+ if (proxy_type == PROXY_TYPE_SOCKS5) {
+ if (aclk_wss_set_socks(vhost, proxy))
+ error("LWS failed to accept socks proxy.");
+ return;
+ }
+ if (proxy_type == PROXY_TYPE_HTTP) {
+ if (lws_set_proxy(vhost, proxy))
+ error("LWS failed to accept http proxy.");
+ return;
+ }
+ if (proxy_type != PROXY_DISABLED)
+ error("Unknown proxy type");
+}
+
// Return code indicates if connection attempt has started async.
int aclk_lws_wss_connect(char *host, int port)
{
struct lws_client_connect_info i;
struct lws_vhost *vhost;
- static const char *proxy = NULL;
- static ACLK_PROXY_TYPE proxy_type = PROXY_NOT_SET;
- char *log;
if (!engine_instance) {
return aclk_lws_wss_client_init(host, port);
// PROTOCOL_INIT callback will call again.
}
- if(proxy_type == PROXY_NOT_SET)
- proxy = aclk_lws_wss_get_proxy_setting(&proxy_type);
-
if (engine_instance->lws_wsi) {
error("Already Connected. Only one connection supported at a time.");
return 0;
}
+ memset(&i, 0, sizeof(i));
+ i.context = engine_instance->lws_context;
+ i.port = engine_instance->port;
+ i.address = engine_instance->host;
+ i.path = "/mqtt";
+ i.host = engine_instance->host;
+ i.protocol = "mqtt";
+
// from LWS docu:
// If option LWS_SERVER_OPTION_EXPLICIT_VHOSTS is given, no vhost is
// created; you're expected to create your own vhosts afterwards using
@@ -253,30 +292,7 @@ int aclk_lws_wss_connect(char *host, int port)
if(!vhost)
fatal("Could not find the default LWS vhost.");
- memset(&i, 0, sizeof(i));
- i.context = engine_instance->lws_context;
- i.port = engine_instance->port;
- i.address = engine_instance->host;
- i.path = "/mqtt";
- i.host = engine_instance->host;
- i.protocol = "mqtt";
-
- switch (proxy_type) {
- case PROXY_DISABLED:
- lws_set_socks(vhost, ":");
- lws_set_proxy(vhost, ":");
- break;
- case PROXY_TYPE_SOCKS5:
- log = strdupz(proxy);
- safe_log_proxy_censor(log);
- info("Connecting using SOCKS5 proxy:\"%s\"", log);
- freez(log);
- if(aclk_wss_set_socks(vhost, proxy))
- error("LWS failed to accept socks proxy.");
- break;
- default:
- error("The proxy could not be set. Unknown proxy type.");
- }
+ aclk_wss_set_proxy(vhost);
#ifdef ACLK_SSL_ALLOW_SELF_SIGNED
i.ssl_connection = LCCSCF_USE_SSL | LCCSCF_ALLOW_SELFSIGNED | LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK;