static void wispr_portal_request_portal( struct connman_wispr_portal_context *wp_context) { DBG(""); wp_context->request_id = g_web_request_get(wp_context->web, wp_context->status_url, wispr_portal_web_result, wispr_route_request, wp_context); if (wp_context->request_id == 0) wispr_portal_error(wp_context); }
int main(int argc, char *argv[]) { GOptionContext *context; GError *error = NULL; struct sigaction sa; struct wispr_session wispr; int index = 0; context = g_option_context_new(NULL); g_option_context_add_main_entries(context, options, NULL); if (g_option_context_parse(context, &argc, &argv, &error) == FALSE) { if (error != NULL) { g_printerr("%s\n", error->message); g_error_free(error); } else g_printerr("An unknown error occurred\n"); return 1; } g_option_context_free(context); memset(&wispr, 0, sizeof(wispr)); wispr_msg_init(&wispr.msg); wispr.web = g_web_new(index); if (wispr.web == NULL) { fprintf(stderr, "Failed to create web service\n"); return 1; } if (option_debug == TRUE) g_web_set_debug(wispr.web, web_debug, "WEB"); main_loop = g_main_loop_new(NULL, FALSE); if (option_nameserver != NULL) { g_web_add_nameserver(wispr.web, option_nameserver); g_free(option_nameserver); } g_web_set_accept(wispr.web, NULL); g_web_set_user_agent(wispr.web, "SmartClient/%s wispr", VERSION); g_web_set_close_connection(wispr.web, TRUE); if (option_url == NULL) option_url = g_strdup(DEFAULT_URL); wispr.username = option_username; wispr.password = option_password; wispr.originurl = option_url; timer = g_timer_new(); wispr.parser = g_web_parser_new("<WISPAccessGatewayParam", "WISPAccessGatewayParam>", parser_callback, &wispr); wispr.request = g_web_request_get(wispr.web, option_url, wispr_result, &wispr); if (wispr.request == 0) { fprintf(stderr, "Failed to start request\n"); return 1; } memset(&sa, 0, sizeof(sa)); sa.sa_handler = sig_term; sigaction(SIGINT, &sa, NULL); sigaction(SIGTERM, &sa, NULL); g_main_loop_run(main_loop); g_timer_destroy(timer); if (wispr.request > 0) g_web_cancel_request(wispr.web, wispr.request); g_web_parser_unref(wispr.parser); g_web_unref(wispr.web); g_main_loop_unref(main_loop); g_free(wispr.username); g_free(wispr.password); g_free(wispr.originurl); return 0; }
static gboolean wispr_result(GWebResult *result, gpointer user_data) { struct wispr_session *wispr = user_data; const guint8 *chunk; gsize length; guint16 status; gdouble elapsed; g_web_result_get_chunk(result, &chunk, &length); if (length > 0) { //printf("%s\n", (char *) chunk); g_web_parser_feed_data(wispr->parser, chunk, length); return TRUE; } g_web_parser_end_data(wispr->parser); status = g_web_result_get_status(result); g_print("status: %03u\n", status); elapsed = g_timer_elapsed(timer, NULL); g_print("elapse: %f seconds\n", elapsed); if (wispr->msg.message_type < 0) { const char *redirect; if (status != 302) goto done; if (g_web_result_get_header(result, "Location", &redirect) == FALSE) goto done; printf("Redirect URL: %s\n", redirect); printf("\n"); wispr->request = g_web_request_get(wispr->web, redirect, wispr_result, wispr); return FALSE; } printf("Message type: %s (%d)\n", message_type_to_string(wispr->msg.message_type), wispr->msg.message_type); printf("Response code: %s (%d)\n", response_code_to_string(wispr->msg.response_code), wispr->msg.response_code); if (wispr->msg.access_procedure != NULL) printf("Access procedure: %s\n", wispr->msg.access_procedure); if (wispr->msg.access_location != NULL) printf("Access location: %s\n", wispr->msg.access_location); if (wispr->msg.location_name != NULL) printf("Location name: %s\n", wispr->msg.location_name); if (wispr->msg.login_url != NULL) printf("Login URL: %s\n", wispr->msg.login_url); if (wispr->msg.abort_login_url != NULL) printf("Abort login URL: %s\n", wispr->msg.abort_login_url); if (wispr->msg.logoff_url != NULL) printf("Logoff URL: %s\n", wispr->msg.logoff_url); printf("\n"); 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; } if (wispr->password == NULL) { user_input("Password", TRUE, password_callback, wispr); return FALSE; } g_idle_add(execute_login, wispr); return FALSE; } 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); 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; 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; }