/* * lws-minimal-secure-streams-cpp * * Written in 2020 by Andy Green * * This file is made available under the Creative Commons CC0 1.0 * Universal Public Domain Dedication. * * This demonstrates a minimal http client using secure streams C++ api to * fetch files over https to the local filesystem */ #include #include #include static int interrupted, bad = 1, concurrent = 1, completed; static int lss_completion(lss *lss, lws_ss_constate_t state, void *arg) { lssFile *lf = (lssFile *)lss; if (state == LWSSSCS_QOS_ACK_REMOTE) { lwsl_notice("%s: %s: len %llu, done OK %dms\n", __func__, lf->path.c_str(), (unsigned long long)lf->rxlen, (int)((lws_now_usecs() - lf->us_start) / 1000)); } else lwsl_notice("%s: %s: failed\n", __func__, lf->path.c_str()); if (++completed == concurrent) { interrupted = 1; bad = 0; } return 0; } static void sigint_handler(int sig) { interrupted = 1; } int main(int argc, const char **argv) { struct lws_context_creation_info info; struct lws_context *context; const char *p; signal(SIGINT, sigint_handler); memset(&info, 0, sizeof info); lws_cmdline_option_handle_builtin(argc, argv, &info); if ((p = lws_cmdline_option(argc, argv, "-c"))) concurrent = atoi(p); if (concurrent > 12) concurrent = 12; lwsl_user("LWS secure streams cpp test client " "[-d] [-c]\n"); info.fd_limit_per_thread = 1 + 12 + 1; info.port = CONTEXT_PORT_NO_LISTEN; info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; /* create the context */ context = lws_create_context(&info); if (!context) { lwsl_err("lws init failed\n"); return 1; } try { for (int n = 0; n < concurrent; n++) { std::string url, filepath; url = "https://warmcat.com/test-"; url += ('a' + n); url += ".bin"; filepath = "/tmp/test-"; filepath += ('a' + n); filepath += ".bin"; new lssFile(context, url, filepath, lss_completion, 0); } } catch (std::exception &e) { lwsl_err("%s: failed to create ss: %s\n", __func__, e.what()); interrupted = 1; } /* the event loop */ while (!interrupted && lws_service(context, 0) >= 0) ; lws_context_destroy(context); lwsl_user("Completed: %s\n", bad ? "failed" : "OK"); return bad; }