tools: Add support for broken WISPr responses
authorMarcel Holtmann <marcel@holtmann.org>
Mon, 9 May 2011 00:51:39 +0000 (17:51 -0700)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 9 May 2011 00:51:39 +0000 (17:51 -0700)
Some hotspots answer with 404 or 200 responses, but are still in login
stage. If the WISPr XML strings are found, treat all status results the
same to trigger login procedure.

tools/wispr.c

index 7de9dbb..a0002ba 100644 (file)
@@ -530,7 +530,10 @@ static gboolean wispr_result(GWebResult *result, gpointer user_data)
                printf("Logoff URL: %s\n", wispr->msg.logoff_url);
        printf("\n");
 
-       if (status == 302 && wispr->msg.message_type == 100) {
+       if (status != 200 && status != 302 && status != 404)
+               goto done;
+
+       if (wispr->msg.message_type == 100) {
                if (wispr->username == NULL) {
                        user_input("Username", FALSE, username_callback, wispr);
                        return FALSE;
@@ -543,13 +546,30 @@ static gboolean wispr_result(GWebResult *result, gpointer user_data)
 
                g_idle_add(execute_login, wispr);
                return FALSE;
-       } else if (status == 200 && (wispr->msg.message_type == 120 ||
-                                       wispr->msg.message_type == 140)) {
+       } else if (wispr->msg.message_type == 120 ||
+                                       wispr->msg.message_type == 140) {
                int code = wispr->msg.response_code;
                printf("Login process: %s\n",
                                        code == 50 ? "SUCCESS" : "FAILURE");
        }
 
+       if (status == 302) {
+               const char *redirect;
+
+               if (g_web_result_get_header(result, "Location",
+                                                       &redirect) == FALSE)
+                       goto done;
+
+               printf("\n");
+               printf("Redirect URL: %s\n", redirect);
+               printf("\n");
+
+               wispr->request = g_web_request_get(wispr->web, redirect,
+                                                       wispr_result, wispr);
+
+               return FALSE;
+       }
+
 done:
        g_main_loop_quit(main_loop);