mirror of
https://libwebsockets.org/repo/libwebsockets
synced 2024-12-25 23:00:12 +00:00
108 lines
2.3 KiB
C++
108 lines
2.3 KiB
C++
/*
|
|
* lws-minimal-secure-streams-cpp
|
|
*
|
|
* Written in 2020 by Andy Green <andy@warmcat.com>
|
|
*
|
|
* 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 <libwebsockets.hxx>
|
|
#include <string.h>
|
|
#include <signal.h>
|
|
|
|
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<verb>] [-c<concurrent>]\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;
|
|
}
|