Hi, here is a patch which provides configurable IPv4/6-status urls for ConnMan together with support for using http-status response code 204 instead of the default "X-ConnMan-Status: online"-check.
Why? Unfortunately there are numerous of ISP's or organizations which want to modify/strip X-ConnMan-Status-header away from the http-responses even the connection is otherwise just fine (eg. no portals). However they do not modify http-status response codes and that's when the "204" comes in handy. With this patch ConnMan-users can use alternative way to check whether their devices are actually "online". Until ipv4.connman.net and ipv6.connman.net provides urls which return 204, you can try this with these two: http://ipv4.jolla.com/return_204 http://ipv6.jolla.com/return_204 Br, Pasi Sjöholm --- diff --git a/include/setting.h b/include/setting.h index a882021..32ccf56 100644 --- a/include/setting.h +++ b/include/setting.h @@ -28,6 +28,9 @@ extern "C" { #endif +#define CONF_STATUS_URL_IPV6 "Ipv6StatusUrl" +#define CONF_STATUS_URL_IPV4 "Ipv4StatusUrl" + bool connman_setting_get_bool(const char *key); char **connman_setting_get_string_list(const char *key); unsigned int *connman_setting_get_uint_list(const char *key); diff --git a/src/6to4.c b/src/6to4.c index 0e3a7a1..c32cef9 100644 --- a/src/6to4.c +++ b/src/6to4.c @@ -53,8 +53,6 @@ static unsigned int newlink_watch; static unsigned int newlink_flags; static int newlink_timeout_id; -#define STATUS_URL "http://ipv6.connman.net/online/status.html" - #ifndef IP_DF #define IP_DF 0x4000 /* Flag: "Don't Fragment" */ #endif @@ -317,7 +315,9 @@ static void tun_newlink(unsigned flags, unsigned change, void *user_data) if (getenv("CONNMAN_WEB_DEBUG")) g_web_set_debug(web, web_debug, "6to4"); - web_request_id = g_web_request_get(web, STATUS_URL, + const char *url = connman_option_get_string(CONF_STATUS_URL_IPV6); + + web_request_id = g_web_request_get(web, url, web_result, NULL, NULL); newlink_timeout(NULL); diff --git a/src/main.c b/src/main.c index 4f635de..0151d39 100644 --- a/src/main.c +++ b/src/main.c @@ -73,6 +73,8 @@ static struct { bool single_tech; char **tethering_technologies; bool persistent_tethering_mode; + char *ipv6_status_url; + char *ipv4_status_url; } connman_settings = { .bg_scan = true, .pref_timeservers = NULL, @@ -86,6 +88,8 @@ static struct { .single_tech = false, .tethering_technologies = NULL, .persistent_tethering_mode = false, + .ipv4_status_url = NULL, + .ipv6_status_url = NULL, }; #define CONF_BG_SCAN "BackgroundScanning" @@ -98,8 +102,10 @@ static struct { #define CONF_BLACKLISTED_INTERFACES "NetworkInterfaceBlacklist" #define CONF_ALLOW_HOSTNAME_UPDATES "AllowHostnameUpdates" #define CONF_SINGLE_TECH "SingleConnectedTechnology" -#define CONF_TETHERING_TECHNOLOGIES "TetheringTechnologies" +#define CONF_TETHERING_TECHNOLOGIES "TetheringTechnologies" #define CONF_PERSISTENT_TETHERING_MODE "PersistentTetheringMode" +#define CONF_STATUS_URL_IPV6 "Ipv6StatusUrl" +#define CONF_STATUS_URL_IPV4 "Ipv4StatusUrl" static const char *supported_options[] = { CONF_BG_SCAN, @@ -114,6 +120,8 @@ static const char *supported_options[] = { CONF_SINGLE_TECH, CONF_TETHERING_TECHNOLOGIES, CONF_PERSISTENT_TETHERING_MODE, + CONF_STATUS_URL_IPV4, + CONF_STATUS_URL_IPV6, NULL }; @@ -236,6 +244,8 @@ static void parse_config(GKeyFile *config) char **interfaces; char **str_list; char **tethering; + char *ipv4url; + char *ipv6url; gsize len; int timeout; @@ -354,6 +364,23 @@ static void parse_config(GKeyFile *config) connman_settings.persistent_tethering_mode = boolean; g_clear_error(&error); + + ipv4url = __connman_config_get_string(config, "General", CONF_STATUS_URL_IPV4, &error); + if (!error) + connman_settings.ipv4_status_url = ipv4url; + else + connman_settings.ipv4_status_url = "http://ipv4.connman.net/online/status.html"; + + g_clear_error(&error); + + ipv6url = __connman_config_get_string(config, "General", CONF_STATUS_URL_IPV6, &error); + if (!error) + connman_settings.ipv6_status_url = ipv6url; + else + connman_settings.ipv6_status_url = "http://ipv6.connman.net/online/status.html"; + + g_clear_error(&error); + } static int config_init(const char *file) @@ -510,6 +537,11 @@ const char *connman_option_get_string(const char *key) else return option_wifi; } + if (g_str_equal(key, CONF_STATUS_URL_IPV4) == TRUE) { + return connman_settings.ipv4_status_url; + } + if (g_str_equal(key, CONF_STATUS_URL_IPV6) == TRUE) + return connman_settings.ipv6_status_url; return NULL; } diff --git a/src/main.conf b/src/main.conf index 93c7a50..3b04f36 100644 --- a/src/main.conf +++ b/src/main.conf @@ -95,3 +95,8 @@ # re-enabling a technology, and after restarts and reboots. # Default value is false. # PersistentTetheringMode = false + +# Set the online status url which either returns "X-ConnMan-Status: online" HTTP-header +# or HTTP-status code 204. +Ipv4StatusUrl = http://ipv4.connman.net/online/status.html +Ipv6StatusUrl = http://ipv6.connman.net/online/status.html diff --git a/src/wispr.c b/src/wispr.c index dcce93c..27d5162 100644 --- a/src/wispr.c +++ b/src/wispr.c @@ -30,9 +30,6 @@ #include "connman.h" -#define STATUS_URL_IPV4 "http://ipv4.connman.net/online/status.html" -#define STATUS_URL_IPV6 "http://ipv6.connman.net/online/status.html" - struct connman_wispr_message { bool has_error; const char *current_element; @@ -260,6 +257,8 @@ static const char *response_code_to_string(int response_code) return "Proxy detection/repeat operation"; case 201: return "Authentication pending"; + case 204: + return "Walled garden check"; case 255: return "Access gateway internal error"; } @@ -725,6 +724,9 @@ static bool wispr_portal_web_result(GWebResult *result, gpointer user_data) wp_context->redirect_url, wp_context); break; + case 204: + portal_manage_status(result, wp_context); + return false; case 302: if (!g_web_supports_tls() || !g_web_result_get_header(result, "Location", @@ -872,10 +874,10 @@ static int wispr_portal_detect(struct connman_wispr_portal_context *wp_context) if (wp_context->type == CONNMAN_IPCONFIG_TYPE_IPV4) { g_web_set_address_family(wp_context->web, AF_INET); - wp_context->status_url = STATUS_URL_IPV4; + wp_context->status_url = connman_option_get_string(CONF_STATUS_URL_IPV4); } else { g_web_set_address_family(wp_context->web, AF_INET6); - wp_context->status_url = STATUS_URL_IPV6; + wp_context->status_url = connman_option_get_string(CONF_STATUS_URL_IPV6); } for (i = 0; nameservers[i]; i++) _______________________________________________ connman mailing list connman@connman.net https://lists.connman.net/mailman/listinfo/connman