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

Reply via email to