static void free_connman_wispr_portal_context( struct connman_wispr_portal_context *wp_context) { DBG("context %p", wp_context); if (!wp_context) return; if (wp_context->wispr_portal) { if (wp_context->wispr_portal->ipv4_context == wp_context) wp_context->wispr_portal->ipv4_context = NULL; if (wp_context->wispr_portal->ipv6_context == wp_context) wp_context->wispr_portal->ipv6_context = NULL; } if (wp_context->token > 0) connman_proxy_lookup_cancel(wp_context->token); if (wp_context->request_id > 0) g_web_cancel_request(wp_context->web, wp_context->request_id); if (wp_context->timeout > 0) g_source_remove(wp_context->timeout); if (wp_context->web) g_web_unref(wp_context->web); g_free(wp_context->redirect_url); if (wp_context->wispr_parser) g_web_parser_unref(wp_context->wispr_parser); connman_wispr_message_init(&wp_context->wispr_msg); g_free(wp_context->wispr_username); g_free(wp_context->wispr_password); g_free(wp_context->wispr_formdata); free_wispr_routes(wp_context); connman_service_unref(wp_context->service); g_free(wp_context); }
static void wispr_portal_browser_reply_cb(struct connman_service *service, bool authentication_done, const char *error, void *user_data) { struct connman_wispr_portal_context *wp_context = user_data; DBG(""); if (!service || !wp_context) return; if (!authentication_done) { wispr_portal_error(wp_context); free_wispr_routes(wp_context); return; } /* Restarting the test */ __connman_service_wispr_start(service, wp_context->type); }
static bool wispr_portal_web_result(GWebResult *result, gpointer user_data) { struct connman_wispr_portal_context *wp_context = user_data; const char *redirect = NULL; const guint8 *chunk = NULL; const char *str = NULL; guint16 status; gsize length; DBG(""); if (wp_context->wispr_result != CONNMAN_WISPR_RESULT_ONLINE) { g_web_result_get_chunk(result, &chunk, &length); if (length > 0) { g_web_parser_feed_data(wp_context->wispr_parser, chunk, length); return true; } g_web_parser_end_data(wp_context->wispr_parser); if (wp_context->wispr_msg.message_type >= 0) { if (wispr_manage_message(result, wp_context)) goto done; } } status = g_web_result_get_status(result); DBG("status: %03u", status); switch (status) { case 000: __connman_agent_request_browser(wp_context->service, wispr_portal_browser_reply_cb, wp_context->status_url, wp_context); break; case 200: if (wp_context->wispr_msg.message_type >= 0) break; if (g_web_result_get_header(result, "X-ConnMan-Status", &str)) { portal_manage_status(result, wp_context); return false; } else __connman_agent_request_browser(wp_context->service, wispr_portal_browser_reply_cb, wp_context->redirect_url, wp_context); break; case 302: if (!g_web_supports_tls() || !g_web_result_get_header(result, "Location", &redirect)) { __connman_agent_request_browser(wp_context->service, wispr_portal_browser_reply_cb, wp_context->status_url, wp_context); break; } DBG("Redirect URL: %s", redirect); wp_context->redirect_url = g_strdup(redirect); wp_context->request_id = g_web_request_get(wp_context->web, redirect, wispr_portal_web_result, wispr_route_request, wp_context); goto done; case 400: case 404: if (__connman_service_online_check_failed(wp_context->service, wp_context->type) == 0) { wispr_portal_error(wp_context); free_connman_wispr_portal_context(wp_context); return false; } break; case 505: __connman_agent_request_browser(wp_context->service, wispr_portal_browser_reply_cb, wp_context->status_url, wp_context); break; default: break; } free_wispr_routes(wp_context); wp_context->request_id = 0; done: wp_context->wispr_msg.message_type = -1; return false; }
static bool wispr_portal_web_result(GWebResult *result, gpointer user_data) { struct connman_wispr_portal_context *wp_context = user_data; const char *redirect = NULL; const guint8 *chunk = NULL; const char *str = NULL; guint16 status; gsize length; bool skip_failed = false; DBG(""); if (wp_context->wispr_result != CONNMAN_WISPR_RESULT_ONLINE) { g_web_result_get_chunk(result, &chunk, &length); if (length > 0) { g_web_parser_feed_data(wp_context->wispr_parser, chunk, length); return true; } g_web_parser_end_data(wp_context->wispr_parser); // if (wp_context->wispr_msg.message_type >= 0) { // if (wispr_manage_message(result, wp_context)) // goto done; // } } status = g_web_result_get_status(result); DBG("status: %03u", status); switch (status) { case 200: // if (wp_context->wispr_msg.message_type >= 0) // break; if (g_web_result_get_header(result, "X-ConnMan-Status", &str)) { // Cancel browser requests if useragent has not returned anything connman_agent_cancel(wp_context->service); portal_manage_status(result, wp_context); return false; } else __connman_agent_request_browser(wp_context->service, wispr_portal_browser_reply_cb, wp_context->redirect_url, wp_context); break; case 204: // Cancel browser requests if useragent has not returned anything connman_agent_cancel(wp_context->service); portal_manage_status(result, wp_context); return false; case 302: DBG("tls %d, Location header %d",(!g_web_supports_tls() ), (!g_web_result_get_header(result, "Location", &redirect))); if (!g_web_supports_tls() || !g_web_result_get_header(result, "Location", &redirect)) { __connman_agent_request_browser(wp_context->service, wispr_portal_browser_reply_cb, wp_context->status_url, wp_context); break; } DBG("Redirect URL: %s", redirect); DBG("Status url URL: %s", wp_context->status_url); wp_context->redirect_url = g_strdup(redirect); wp_context->request_id = g_web_request_get(wp_context->web, redirect, wispr_portal_web_result, wispr_route_request, wp_context); skip_failed = true; break; case 000: DBG("Redirect URL: %s", redirect); DBG("Status url URL: %s", wp_context->status_url); __connman_agent_request_browser(wp_context->service, wispr_portal_browser_reply_cb, wp_context->status_url, wp_context); break; case 400: case 404: break; case 505: DBG("HTTP version not supported, handling over to the browser"); DBG("Redirect URL: %s", redirect); DBG("Status url URL: %s", wp_context->status_url); __connman_agent_request_browser(wp_context->service, wispr_portal_browser_reply_cb, wp_context->status_url, wp_context); break; default: break; } if (!skip_failed && __connman_service_online_check_failed(wp_context->service, wp_context->type) == 0) { wispr_portal_error(wp_context); free_connman_wispr_portal_context(wp_context); return false; } free_wispr_routes(wp_context); wp_context->request_id = 0; wp_context->wispr_msg.message_type = -1; return false; }