diff options
author | Timo <6674623+underhood@users.noreply.github.com> | 2020-03-25 09:17:51 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-25 09:17:51 +0100 |
commit | a8e9fcb3630ebdcc92d895a6d8bf3e1c9a588a35 (patch) | |
tree | 0e8ee2f698dcd4e97fa1ed342b45bc59b9a0e2c4 /aclk/aclk_lws_wss_client.c | |
parent | 82211d07b42f6a6dd365cafd34089e48e5411850 (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.c | 82 |
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; |