From 8fd1ea61809599531662f964d97ef091a97ce92c Mon Sep 17 00:00:00 2001 From: Andy Green Date: Sat, 18 Sep 2021 09:34:36 +0100 Subject: [PATCH] examples: move existing to m-e-lowlevel and start repoulating m-e with SS --- CMakeLists.txt | 7 +- README.md | 78 +++++++ READMEs/README.ctest.md | 4 +- doc-assets/ss-api1.png | Bin 0 -> 33944 bytes doc-assets/ss-api2.png | Bin 0 -> 40138 bytes doc-assets/ss-api3.png | Bin 0 -> 44886 bytes include/libwebsockets/lws-context-vhost.h | 13 ++ include/libwebsockets/lws-misc.h | 2 +- .../libwebsockets/lws-secure-streams-client.h | 4 + include/libwebsockets/lws-secure-streams.h | 22 ++ lib/core-net/vhost.c | 8 +- lib/core/libwebsockets.c | 93 +++++++- lib/core/private-lib-core.h | 1 + lib/secure-streams/policy-json.c | 7 +- lib/secure-streams/protocols/ss-h1.c | 4 +- lib/secure-streams/secure-streams.c | 3 +- .../serialized/client/sspc-transport.c | 7 +- lib/secure-streams/serialized/client/sspc.c | 14 +- lib/tls/tls-network.c | 4 +- minimal-examples-lowlevel/CMakeLists.txt | 50 ++++ minimal-examples-lowlevel/README.md | 100 ++++++++ .../protocols/smtp-client/CMakeLists.txt | 0 .../abstract/protocols/smtp-client/README.md | 0 .../abstract/protocols/smtp-client/main.c | 0 .../api-tests/README.md | 0 .../api-test-async-dns/CMakeLists.txt | 2 +- .../api-tests/api-test-async-dns/main.c | 0 .../api-tests/api-test-cose/CMakeLists.txt | 0 .../api-tests/api-test-cose/README.md | 0 .../api-tests/api-test-cose/keys.c | 0 .../api-tests/api-test-cose/main.c | 0 .../api-tests/api-test-cose/sign.c | 0 .../api-tests/api-test-dhcpc/CMakeLists.txt | 0 .../api-tests/api-test-dhcpc/README.md | 0 .../api-tests/api-test-dhcpc/main.c | 0 .../api-tests/api-test-fts/CMakeLists.txt | 0 .../api-tests/api-test-fts/README.md | 0 .../api-tests/api-test-fts/canned-1.txt | 0 .../api-tests/api-test-fts/canned-2.txt | 0 .../api-tests/api-test-fts/les-mis-utf8.txt | 0 .../api-tests/api-test-fts/main.c | 0 .../the-picture-of-dorian-gray.txt | 0 .../api-test-gencrypto/CMakeLists.txt | 0 .../api-tests/api-test-gencrypto/README.md | 0 .../api-tests/api-test-gencrypto/lws-genaes.c | 0 .../api-tests/api-test-gencrypto/lws-genec.c | 0 .../api-tests/api-test-gencrypto/main.c | 0 .../api-tests/api-test-jose/CMakeLists.txt | 0 .../api-tests/api-test-jose/README.md | 0 .../api-tests/api-test-jose/jwe.c | 0 .../api-tests/api-test-jose/jwk.c | 0 .../api-tests/api-test-jose/jws.c | 0 .../api-tests/api-test-jose/main.c | 0 .../api-tests/api-test-lecp/CMakeLists.txt | 0 .../api-tests/api-test-lecp/README.md | 0 .../api-tests/api-test-lecp/main.c | 0 .../api-tests/api-test-lejp/CMakeLists.txt | 0 .../api-tests/api-test-lejp/main.c | 0 .../api-test-lws_cache/CMakeLists.txt | 0 .../api-tests/api-test-lws_cache/README.md | 0 .../api-tests/api-test-lws_cache/main.c | 0 .../api-tests/api-test-lws_cache/text1.txt | 0 .../api-tests/api-test-lws_dsh/CMakeLists.txt | 0 .../api-tests/api-test-lws_dsh/README.md | 0 .../api-tests/api-test-lws_dsh/main.c | 0 .../api-tests/api-test-lws_map/CMakeLists.txt | 0 .../api-tests/api-test-lws_map/main.c | 0 .../api-test-lws_sequencer/CMakeLists.txt | 0 .../libwebsockets.org.cer | 0 .../api-tests/api-test-lws_sequencer/main.c | 0 .../api-tests/api-test-lws_smd/CMakeLists.txt | 2 +- .../api-tests/api-test-lws_smd/main.c | 0 .../api-test-lws_struct-json/CMakeLists.txt | 0 .../api-test-lws_struct-json/README.md | 0 .../api-tests/api-test-lws_struct-json/main.c | 0 .../api-test-lws_struct-json/test2.c | 0 .../api-test-lws_struct_sqlite/CMakeLists.txt | 0 .../api-test-lws_struct_sqlite/README.md | 0 .../api-test-lws_struct_sqlite/main.c | 0 .../api-test-lws_tokenize/CMakeLists.txt | 0 .../api-tests/api-test-lws_tokenize/README.md | 0 .../api-tests/api-test-lws_tokenize/main.c | 0 .../api-tests/api-test-lwsac/CMakeLists.txt | 0 .../api-tests/api-test-lwsac/README.md | 0 .../api-tests/api-test-lwsac/main.c | 0 .../api-test-secure-streams/CMakeLists.txt | 2 +- .../api-test-secure-streams/README.md | 0 .../api-tests/api-test-secure-streams/main.c | 0 .../api-test-smtp_client/CMakeLists.txt | 0 .../api-tests/api-test-smtp_client/README.md | 0 .../api-tests/api-test-smtp_client/main.c | 0 .../client-server/README.md | 0 .../minimal-ws-proxy/CMakeLists.txt | 0 .../client-server/minimal-ws-proxy/README.md | 0 .../minimal-ws-proxy/minimal-ws-proxy.c | 0 .../minimal-ws-proxy/mount-origin/example.js | 0 .../minimal-ws-proxy/mount-origin/favicon.ico | Bin .../minimal-ws-proxy/mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../minimal-ws-proxy/protocol_lws_minimal.c | 0 .../crypto/README.md | 0 .../minimal-crypto-cose-key/CMakeLists.txt | 2 +- .../crypto/minimal-crypto-cose-key/README.md | 0 .../crypto/minimal-crypto-cose-key/main.c | 0 .../crypto/minimal-crypto-cose-key/set1.cks | Bin .../minimal-crypto-cose-key/sign1_pass01.sig | Bin .../minimal-crypto-cose-key/sign1_pass02.sig | 0 .../minimal-crypto-cose-key/sign1_pass03.sig | 0 .../minimal-crypto-cose-key/sign_pass01.sig | 0 .../minimal-crypto-cose-key/sign_pass02.sig | 0 .../minimal-crypto-cose-key/sign_pass03.sig | 0 .../minimal-crypto-cose-sign/CMakeLists.txt | 2 +- .../crypto/minimal-crypto-cose-sign/README.md | 0 .../crypto/minimal-crypto-cose-sign/main.c | 0 .../minimal-crypto-cose-sign/payload.txt | 0 .../minimal-crypto-cose-sign/rsa-4096.ck | Bin .../crypto/minimal-crypto-cose-sign/set1.cks | Bin .../minimal-crypto-cose-sign/sign-rsa4096.sig | Bin .../minimal-crypto-cose-sign/sign1_pass01.sig | Bin .../minimal-crypto-cose-sign/sign1_pass02.sig | 0 .../minimal-crypto-cose-sign/sign1_pass03.sig | 0 .../minimal-crypto-cose-sign/sign_pass01.sig | 0 .../minimal-crypto-cose-sign/sign_pass02.sig | 0 .../minimal-crypto-cose-sign/sign_pass03.sig | 0 .../crypto/minimal-crypto-jwe/CMakeLists.txt | 0 .../crypto/minimal-crypto-jwe/README.md | 0 .../minimal-crypto-jwe/key-rsa-4096.private | 0 .../minimal-crypto-jwe/key-rsa-4096.pub | 0 .../crypto/minimal-crypto-jwe/main.c | 0 .../crypto/minimal-crypto-jwk/CMakeLists.txt | 0 .../crypto/minimal-crypto-jwk/README.md | 0 .../crypto/minimal-crypto-jwk/main.c | 0 .../crypto/minimal-crypto-jws/CMakeLists.txt | 0 .../crypto/minimal-crypto-jws/README.md | 0 .../crypto/minimal-crypto-jws/main.c | 0 .../crypto/minimal-crypto-x509/CMakeLists.txt | 0 .../crypto/minimal-crypto-x509/README.md | 0 .../crypto/minimal-crypto-x509/main.c | 0 .../dbus-client/README.md | 0 .../minimal-dbus-client/CMakeLists.txt | 0 .../dbus-client/minimal-dbus-client/README.md | 0 .../minimal-dbus-client/minimal-dbus-client.c | 0 .../CMakeLists.txt | 0 .../README.md | 0 .../minimal-dbus-ws-proxy-testclient.c | 0 .../dbus-server/README.md | 0 .../minimal-dbus-server/CMakeLists.txt | 0 .../dbus-server/minimal-dbus-server/README.md | 0 .../dbus-server/minimal-dbus-server/main.c | 0 .../minimal-dbus-ws-proxy/CMakeLists.txt | 0 .../minimal-dbus-ws-proxy/README.md | 0 .../dbus-server/minimal-dbus-ws-proxy/main.c | 0 .../org.libwebsockets.wsclientproxy.conf | 0 .../protocol_lws_minimal_dbus_ws_proxy.c | 0 .../gtk/minimal-gtk/CMakeLists.txt | 0 .../gtk/minimal-gtk/README.md | 0 .../gtk/minimal-gtk/main.c | 0 .../gtk/minimal-gtk/warmcat.com.cer | 0 .../http-client/README.md | 0 .../minimal-http-client-attach/CMakeLists.txt | 0 .../minimal-http-client-attach/README.md | 0 .../minimal-http-client-attach.c | 0 .../CMakeLists.txt | 0 .../README.md | 0 .../minimal-http-client-captive-portal.c | 0 .../CMakeLists.txt | 0 .../minimal-http-client-certinfo/README.md | 0 .../minimal-http-client-certinfo.c | 0 .../warmcat.com.cer | 0 .../CMakeLists.txt | 0 .../README.md | 0 .../minimal-http-client-custom-headers.c | 0 .../warmcat.com.cer | 0 .../CMakeLists.txt | 2 +- .../minimal-http-client-h2-rxflow/README.md | 0 .../minimal-http-client.c | 0 .../warmcat.com.cer | 0 .../CMakeLists.txt | 2 +- .../minimal-http-client-hugeurl/README.md | 0 .../minimal-http-client-hugeurl.c | 0 .../warmcat.com.cer | 0 .../CMakeLists.txt | 2 +- .../minimal-http-client-jit-trust/README.md | 0 .../minimal-http-client.c | 0 .../trust_blob.h | 0 .../warmcat.com.cer | 0 .../minimal-http-client-multi/CMakeLists.txt | 6 +- .../minimal-http-client-multi/README.md | 0 .../minimal-http-client-multi.c | 0 .../minimal-http-client-multi/warmcat.com.cer | 0 .../minimal-http-client-post/CMakeLists.txt | 2 +- .../minimal-http-client-post/README.md | 0 .../libwebsockets.org.cer | 0 .../minimal-http-client-post.c | 0 .../minimal-http-client/CMakeLists.txt | 9 +- .../http-client/minimal-http-client/README.md | 0 .../minimal-http-client/minimal-http-client.c | 0 .../minimal-http-client/warmcat.com.cer | 0 .../http-client/minimal-http-client/wrong.cer | 0 .../http-server/README.md | 0 .../CMakeLists.txt | 0 .../minimal-http-server-basicauth/README.md | 0 .../ba-passwords | 0 .../minimal-http-server-basicauth.c | 0 .../mount-origin/404.html | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../mount-secret-origin/index.html | 0 .../libwebsockets.org-logo.svg | 0 .../minimal-http-server-cgi/CMakeLists.txt | 0 .../minimal-http-server-cgi/README.md | 0 .../minimal-http-server.c | 0 .../minimal-http-server-cgi/my-cgi-script.sh | 0 .../CMakeLists.txt | 0 .../README.md | 0 .../localhost-100y.cert | 0 .../localhost-100y.key | 0 .../minimal-http-server-custom-headers.c | 0 .../mount-origin/404.html | 0 .../mount-origin/error.css | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../CMakeLists.txt | 0 .../minimal-http-server-deaddrop/README.md | 0 .../minimal-http-server-deaddrop/ba-passwords | 0 .../localhost-100y.cert | 0 .../localhost-100y.key | 0 .../minimal-http-server-deaddrop.c | 0 .../mount-origin/404.html | 0 .../mount-origin/deaddrop.css | 0 .../mount-origin/deaddrop.js | 0 .../mount-origin/drop.svg | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../uploads/user1/placeholder.txt | 0 .../CMakeLists.txt | 0 .../minimal-http-server-dynamic/README.md | 0 .../localhost-100y.cert | 0 .../localhost-100y.key | 0 .../minimal-http-server-dynamic.c | 0 .../mount-origin/404.html | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../CMakeLists.txt | 0 .../README.md | 0 .../minimal-http-server.c | 0 .../mount-origin/404.html | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../mount-origin/symlink.html | 0 .../CMakeLists.txt | 0 .../README.md | 0 .../localhost-100y.cert | 0 .../localhost-100y.key | 0 .../minimal-http-server-eventlib-demos.c | 0 .../mount-origin/404.html | 0 .../mount-origin/candide-uncompressed.zip | Bin .../mount-origin/candide.zip | Bin .../mount-origin/favicon.ico | Bin .../mount-origin/http2.png | Bin .../mount-origin/leaf.jpg | Bin .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/lws-common.js | 0 .../mount-origin/strict-csp.svg | 0 .../mount-origin/test.css | 0 .../mount-origin/test.html | 0 .../mount-origin/test.js | 0 .../mount-origin/wss-over-h2.png | Bin .../CMakeLists.txt | 12 +- .../README.md | 0 .../glib.c | 0 .../libev.c | 0 .../libevent.c | 0 .../libsdevent.c | 0 .../libuv.c | 0 .../localhost-100y.cert | 0 .../localhost-100y.key | 0 .../minimal-http-server-eventlib-foreign.c | 0 .../mount-origin/404.html | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../private.h | 0 .../uloop.c | 0 .../CMakeLists.txt | 0 .../README.md | 0 .../localhost-100y.cert | 0 .../localhost-100y.key | 0 .../minimal-http-server-eventlib-smp.c | 0 .../mount-origin/404.html | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../CMakeLists.txt | 0 .../minimal-http-server-eventlib/README.md | 0 .../localhost-100y.cert | 0 .../localhost-100y.key | 0 .../minimal-http-server-eventlib.c | 0 .../mount-origin/404.html | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../CMakeLists.txt | 0 .../minimal-http-server-form-get/README.md | 0 .../minimal-http-server-form-get.c | 0 .../mount-origin/404.html | 0 .../mount-origin/after-form1.html | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../CMakeLists.txt | 0 .../README.md | 0 .../minimal-http-server-form-post-file.c | 0 .../mount-origin/404.html | 0 .../mount-origin/after-form1.html | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../CMakeLists.txt | 0 .../README.md | 0 .../localhost-100y.cert | 0 .../localhost-100y.key | 0 .../minimal-http-server-form-post.c | 0 .../CMakeLists.txt | 0 .../minimal-http-server-form-post/README.md | 0 .../localhost-100y.cert | 0 .../localhost-100y.key | 0 .../minimal-http-server-form-post.c | 0 .../mount-origin/404.html | 0 .../mount-origin/after-form1.html | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../CMakeLists.txt | 0 .../README.md | 0 .../lws-fts.index | Bin .../minimal-http-server.c | 0 .../mount-origin/404.html | 0 .../mount-origin/dorian-gray-wikipedia.jpg | Bin .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/lws-fts.css | 0 .../mount-origin/lws-fts.js | 0 .../mount-origin/strict-csp.svg | 0 .../the-picture-of-dorian-gray.txt | 0 .../CMakeLists.txt | 0 .../README.md | 0 .../localhost-100y.cert | 0 .../localhost-100y.key | 0 .../minimal-http-server.c | 0 .../CMakeLists.txt | 0 .../minimal-http-server-mimetypes/README.md | 0 .../minimal-http-server-mimetypes.c | 0 .../mount-origin/404.html | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../mount-origin/test.tar.bz2 | Bin .../CMakeLists.txt | 0 .../minimal-http-server-multivhost/README.md | 0 .../minimal-http-server.c | 0 .../mount-origin-localhost1/404.html | 0 .../mount-origin-localhost1/favicon.ico | Bin .../mount-origin-localhost1/index.html | 0 .../libwebsockets.org-logo.svg | 0 .../mount-origin-localhost1/strict-csp.svg | 0 .../mount-origin-localhost2/404.html | 0 .../mount-origin-localhost2/favicon.ico | Bin .../mount-origin-localhost2/index.html | 0 .../libwebsockets.org-logo.svg | 0 .../mount-origin-localhost2/strict-csp.svg | 0 .../mount-origin-localhost3/404.html | 0 .../mount-origin-localhost3/favicon.ico | Bin .../mount-origin-localhost3/index.html | 0 .../libwebsockets.org-logo.svg | 0 .../mount-origin-localhost3/strict-csp.svg | 0 .../minimal-http-server-proxy/CMakeLists.txt | 0 .../localhost-100y.cert | 0 .../localhost-100y.key | 0 .../minimal-http-server-proxy.c | 0 .../mount-origin/404.html | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/http2.png | Bin .../mount-origin/index.html | 0 .../minimal-http-server-smp/CMakeLists.txt | 0 .../minimal-http-server-smp/README.md | 0 .../localhost-100y.cert | 0 .../localhost-100y.key | 0 .../minimal-http-server-smp.c | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../CMakeLists.txt | 0 .../minimal-http-server-sse-ring/README.md | 0 .../minimal-http-server-sse-ring.c | 0 .../mount-origin/404.html | 0 .../mount-origin/example.js | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../minimal-http-server-sse/CMakeLists.txt | 0 .../minimal-http-server-sse/README.md | 0 .../localhost-100y.cert | 0 .../localhost-100y.key | 0 .../minimal-http-server-sse.c | 0 .../mount-origin/404.html | 0 .../mount-origin/example.js | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../minimal-http-server-tls-80/CMakeLists.txt | 0 .../minimal-http-server-tls-80/README.md | 0 .../localhost-100y.cert | 0 .../localhost-100y.key | 0 .../minimal-http-server-tls-80.c | 0 .../mount-origin/404.html | 0 .../mount-origin/example.js | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/http2.png | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../CMakeLists.txt | 0 .../minimal-http-server-tls-mem/README.md | 0 .../minimal-http-server-tls-mem.c | 0 .../mount-origin/404.html | 0 .../mount-origin/example.js | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/http2.png | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../minimal-http-server-tls/CMakeLists.txt | 0 .../minimal-http-server-tls/README.md | 0 .../localhost-100y.cert | 0 .../localhost-100y.key | 0 .../minimal-http-server-tls.c | 0 .../mount-origin/404.html | 0 .../mount-origin/example.js | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/http2.png | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../minimal-http-server/CMakeLists.txt | 0 .../http-server/minimal-http-server/README.md | 0 .../minimal-http-server/minimal-http-server.c | 0 .../minimal-http-server/mount-origin/404.html | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../mqtt-client/README.md | 0 .../minimal-mqtt-client-multi/CMakeLists.txt | 0 .../minimal-mqtt-client-multi/README.md | 0 .../minimal-mqtt-client-multi.c | 0 .../selftest.sh.broken-on-travis | 0 .../minimal-mqtt-client-multi/warmcat.com.cer | 0 .../minimal-mqtt-client-multi/wget-log | 0 .../minimal-mqtt-client/CMakeLists.txt | 0 .../mqtt-client/minimal-mqtt-client/README.md | 0 .../minimal-mqtt-client/minimal-mqtt-client.c | 0 .../minimal-mqtt-client/mosq-ca.crt | 0 .../minimal-mqtt-client/mosq-server.crt | 0 .../minimal-mqtt-client/mosq-server.key | 0 .../raw/README.md | 0 .../raw/minimal-raw-adopt-tcp/CMakeLists.txt | 0 .../raw/minimal-raw-adopt-tcp/README.md | 0 .../minimal-raw-adopt-tcp.c | 0 .../raw/minimal-raw-adopt-udp/CMakeLists.txt | 0 .../raw/minimal-raw-adopt-udp/README.md | 0 .../minimal-raw-adopt-udp.c | 0 .../raw/minimal-raw-audio/CMakeLists.txt | 0 .../raw/minimal-raw-audio/README.md | 0 .../raw/minimal-raw-audio/audio.c | 0 .../CMakeLists.txt | 0 .../README.md | 0 .../localhost-100y.cert | 0 .../localhost-100y.key | 0 .../minimal-raw-fallback-http-server.c | 0 .../mount-origin/404.html | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../raw/minimal-raw-file/CMakeLists.txt | 0 .../raw/minimal-raw-file/README.md | 0 .../raw/minimal-raw-file/minimal-raw-file.c | 0 .../raw/minimal-raw-netcat/CMakeLists.txt | 0 .../raw/minimal-raw-netcat/README.md | 0 .../minimal-raw-netcat/minimal-raw-netcat.c | 0 .../minimal-raw-proxy-fallback/CMakeLists.txt | 0 .../raw/minimal-raw-proxy-fallback/README.md | 0 .../localhost-100y.cert | 0 .../localhost-100y.key | 0 .../minimal-raw-proxy-fallback.c | 0 .../mount-origin/404.html | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../raw/minimal-raw-proxy/CMakeLists.txt | 0 .../raw/minimal-raw-proxy/README.md | 0 .../raw/minimal-raw-proxy/minimal-raw-proxy.c | 0 .../raw/minimal-raw-serial/CMakeLists.txt | 0 .../raw/minimal-raw-serial/README.md | 0 .../raw/minimal-raw-serial/minimal-raw-file.c | 0 .../raw/minimal-raw-vhost/CMakeLists.txt | 0 .../raw/minimal-raw-vhost/README.md | 0 .../raw/minimal-raw-vhost/localhost-100y.cert | 0 .../raw/minimal-raw-vhost/localhost-100y.key | 0 .../raw/minimal-raw-vhost/minimal-raw-vhost.c | 0 .../secure-streams/README.md | 0 .../CMakeLists.txt | 0 .../minimal-secure-streams-alexa/README.md | 0 .../minimal-secure-streams-alexa/alexa.c | 0 .../alexa_linux.ppn | Bin .../minimal-secure-streams-alexa/audio.c | 0 .../minimal-secure-streams-alexa/main.c | 0 .../porcupine_params.pv | Bin .../minimal-secure-streams-alexa/private.h | 0 .../minimal-secure-streams-avs/CMakeLists.txt | 0 .../minimal-secure-streams-avs/avs.c | 0 .../minimal-secure-streams-avs/main-client.c | 0 .../minimal-secure-streams-avs/main.c | 0 .../minimal-secure-streams-avs/year.wav | Bin .../CMakeLists.txt | 0 .../minimal-secure-streams-binance/README.md | 0 .../minimal-secure-streams-binance/main.c | 0 .../policy.json | 0 .../CMakeLists.txt | 4 +- .../minimal-secure-streams-blob/README.md | 0 .../minimal-secure-streams.c | 0 .../CMakeLists.txt | 2 +- .../README.md | 0 .../minimal-secure-streams-client-tx.c | 0 .../minimal-secure-streams-cpp/CMakeLists.txt | 2 +- .../minimal-secure-streams-cpp/main.cxx | 0 .../CMakeLists.txt | 0 .../README.md | 0 .../app-event-loop.c | 0 .../binance-ss.c | 0 .../main.c | 0 .../policy.json | 0 .../private.h | 0 .../system.c | 0 .../transport-serial.c | 0 .../CMakeLists.txt | 4 +- .../minimal-secure-streams-hugeurl/README.md | 0 .../minimal-secure-streams.c | 0 .../CMakeLists.txt | 0 .../minimal-secure-streams-metadata/README.md | 0 .../minimal-secure-streams.c | 0 .../metrics-proxy-policy.json | 0 .../CMakeLists.txt | 4 +- .../minimal-secure-streams-perf/README.md | 0 .../minimal-secure-streams.c | 0 .../CMakeLists.txt | 0 .../minimal-secure-streams-policy2c/README.md | 0 .../minimal-secure-streams.c | 0 .../CMakeLists.txt | 2 +- .../minimal-secure-streams-post/README.md | 0 .../minimal-secure-streams-post.c | 0 .../CMakeLists.txt | 0 .../minimal-secure-streams-proxy}/README.md | 0 .../minimal-secure-streams-proxy/main.c | 0 .../minimal-secure-streams-seq/CMakeLists.txt | 0 .../minimal-secure-streams-seq/README.md | 0 .../minimal-secure-streams.c | 0 .../CMakeLists.txt | 0 .../README.md | 0 .../minimal-secure-streams-server-raw/main.c | 0 .../ss-server.c | 0 .../CMakeLists.txt | 0 .../minimal-secure-streams-server/README.md | 0 .../minimal-secure-streams-server/main.c | 0 .../minimal-secure-streams-server/ss-client.c | 0 .../minimal-secure-streams-server/ss-server.c | 0 .../CMakeLists.txt | 4 +- .../minimal-secure-streams-sigv4/README.md | 0 .../minimal-secure-streams-sigv4/policy.json | 0 .../minimal-secure-streams-sigv4/ss-s3-main.c | 0 .../minimal-secure-streams-sigv4/ss-s3-put.h | 0 .../minimal-secure-streams-sigv4/ss-s3-ss.c | 0 .../static_policy.h | 0 .../minimal-secure-streams-smd/CMakeLists.txt | 8 +- .../minimal-secure-streams-smd/README.md | 0 .../minimal-secure-streams-smd.c | 0 .../minimal-secure-streams-smd/multi.c | 0 .../CMakeLists.txt | 0 .../README.md | 0 .../minimal-secure-streams.c | 0 .../static-policy.h | 0 .../static-policy.json | 0 .../CMakeLists.txt | 32 +-- .../minimal-secure-streams-stress/README.md | 0 .../minimal-secure-streams.c | 0 .../CMakeLists.txt | 4 +- .../README.md | 0 .../minimal-secure-streams-testsfail.c | 0 .../CMakeLists.txt | 4 +- .../minimal-secure-streams-threads/README.md | 0 .../minimal-secure-streams-threads.c | 0 .../minimal-secure-streams/CMakeLists.txt | 6 +- .../minimal-secure-streams/README.md | 0 .../minimal-secure-streams.c | 0 .../ws-client/README.md | 0 .../minimal-ws-client-binance/CMakeLists.txt | 0 .../minimal-ws-client-binance/README.md | 0 .../minimal-ws-client-binance/main.c | 0 .../minimal-ws-client-echo/CMakeLists.txt | 0 .../minimal-ws-client-echo/README.md | 0 .../minimal-ws-client-echo.c | 0 .../protocol_lws_minimal_client_echo.c | 0 .../minimal-ws-client-ping/CMakeLists.txt | 0 .../minimal-ws-client-ping/README.md | 0 .../libwebsockets.org.cer | 0 .../minimal-ws-client-ping.c | 0 .../minimal-ws-client-pmd-bulk/CMakeLists.txt | 0 .../minimal-ws-client-pmd-bulk/README.md | 0 .../minimal-ws-client-pmd-bulk.c | 0 .../protocol_lws_minimal_pmd_bulk.c | 0 .../minimal-ws-client-rx/CMakeLists.txt | 2 +- .../ws-client/minimal-ws-client-rx/README.md | 0 .../libwebsockets.org.cer | 0 .../minimal-ws-client-rx/minimal-ws-client.c | 0 .../CMakeLists.txt | 0 .../libwebsockets.org.cer | 0 .../minimal-ws-client.c | 0 .../minimal-ws-client-spam/CMakeLists.txt | 2 +- .../minimal-ws-client-spam/README.md | 0 .../libwebsockets.org.cer | 0 .../minimal-ws-client-spam.c | 0 .../minimal-ws-client-tx/CMakeLists.txt | 0 .../ws-client/minimal-ws-client-tx/README.md | 0 .../minimal-ws-client-tx/minimal-ws-client.c | 0 .../minimal-ws-client/CMakeLists.txt | 0 .../ws-client/minimal-ws-client/README.md | 0 .../minimal-ws-client/libwebsockets.org.cer | 0 .../minimal-ws-client/minimal-ws-client.c | 0 .../ws-server/README.md | 0 .../minimal-ws-broker/CMakeLists.txt | 0 .../ws-server/minimal-ws-broker/README.md | 0 .../minimal-ws-broker/minimal-ws-broker.c | 0 .../minimal-ws-broker/mount-origin/example.js | 0 .../mount-origin/favicon.ico | Bin .../minimal-ws-broker/mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../minimal-ws-broker/protocol_lws_minimal.c | 0 .../minimal-ws-raw-proxy/CMakeLists.txt | 0 .../ws-server/minimal-ws-raw-proxy/README.md | 0 .../minimal-ws-raw-proxy/localhost-100y.cert | 0 .../minimal-ws-raw-proxy/localhost-100y.key | 0 .../minimal-ws-raw-proxy.c | 0 .../mount-origin/example.js | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../minimal-ws-server-echo/CMakeLists.txt | 0 .../minimal-ws-server-echo/README.md | 0 .../minimal-ws-server-echo.c | 0 .../protocol_lws_minimal_server_echo.c | 0 .../minimal-ws-server-pmd-bulk/CMakeLists.txt | 0 .../minimal-ws-server-pmd-bulk/README.md | 0 .../minimal-ws-server-pmd-bulk.c | 0 .../mount-origin/example.js | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../protocol_lws_minimal_pmd_bulk.c | 0 .../CMakeLists.txt | 0 .../minimal-ws-server-pmd-corner/README.md | 0 .../minimal-ws-server-pmd-corner.c | 0 .../mount-origin/example.js | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../protocol_lws_minimal.c | 0 .../minimal-ws-server-pmd/CMakeLists.txt | 0 .../ws-server/minimal-ws-server-pmd/README.md | 0 .../minimal-ws-server-pmd.c | 0 .../mount-origin/example.js | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../protocol_lws_minimal.c | 0 .../minimal-ws-server-ring/CMakeLists.txt | 0 .../minimal-ws-server-ring/README.md | 0 .../minimal-ws-server-ring.c | 0 .../mount-origin/example.js | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../protocol_lws_minimal.c | 0 .../CMakeLists.txt | 0 .../minimal-ws-server-threadpool/README.md | 0 .../minimal-ws-server-threadpool.c | 0 .../mount-origin/example.js | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../protocol_lws_minimal_threadpool.c | 0 .../CMakeLists.txt | 0 .../README.md | 0 .../minimal-ws-server.c | 0 .../mount-origin/example.js | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../protocol_lws_minimal.c | 0 .../CMakeLists.txt | 0 .../minimal-ws-server-threads-smp/README.md | 0 .../minimal-ws-server.c | 0 .../mount-origin/example.js | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../protocol_lws_minimal.c | 0 .../minimal-ws-server-threads/CMakeLists.txt | 0 .../minimal-ws-server-threads/README.md | 0 .../minimal-ws-server.c | 0 .../mount-origin/example.js | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../protocol_lws_minimal.c | 0 .../minimal-ws-server-timer/CMakeLists.txt | 0 .../minimal-ws-server-timer/README.md | 0 .../localhost-100y.cert | 0 .../localhost-100y.key | 0 .../minimal-ws-server.c | 0 .../mount-origin/example.js | 0 .../mount-origin/favicon.ico | Bin .../mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../minimal-ws-server/CMakeLists.txt | 0 .../ws-server/minimal-ws-server/README.md | 0 .../minimal-ws-server/localhost-100y.cert | 0 .../minimal-ws-server/localhost-100y.key | 0 .../minimal-ws-server/minimal-ws-server.c | 0 .../minimal-ws-server/mount-origin/example.js | 0 .../mount-origin/favicon.ico | Bin .../minimal-ws-server/mount-origin/index.html | 0 .../mount-origin/libwebsockets.org-logo.svg | 0 .../mount-origin/strict-csp.svg | 0 .../minimal-ws-server/protocol_lws_minimal.c | 0 minimal-examples/CMakeLists.txt | 3 +- minimal-examples/README.md | 90 +------- .../client/binance/CMakeLists.txt | 53 +++++ minimal-examples/client/binance/README.md | 56 +++++ minimal-examples/client/binance/binance-ss.c | 203 +++++++++++++++++ .../client/binance/example-policy.json | 38 ++++ minimal-examples/client/binance/main.c | 79 +++++++ .../client/hello_world/CMakeLists.txt | 193 ++++++++++++++++ minimal-examples/client/hello_world/README.md | 45 ++++ .../client/hello_world/example-policy.json | 39 ++++ .../client/hello_world/hello_world-ss.c | 71 ++++++ minimal-examples/client/hello_world/main.c | 60 +++++ .../client/http-post/CMakeLists.txt | 198 ++++++++++++++++ minimal-examples/client/http-post/README.md | 45 ++++ .../client/http-post/example-policy.json | 42 ++++ .../client/http-post/http-post-ss.c | 214 ++++++++++++++++++ minimal-examples/client/http-post/main.c | 60 +++++ .../client/ws-echo/CMakeLists.txt | 194 ++++++++++++++++ minimal-examples/client/ws-echo/README.md | 44 ++++ .../client/ws-echo/example-policy.json | 40 ++++ minimal-examples/client/ws-echo/main.c | 60 +++++ minimal-examples/client/ws-echo/ws-echo-ss.c | 134 +++++++++++ .../embedded/pico/pico-sspc-binance/README.md | 7 +- .../pico/pico-sspc-binance/binance-ss.c | 14 +- .../embedded/pico/pico-sspc-binance/get-ss.c | 30 +-- .../embedded/pico/pico-sspc-binance/main.c | 4 +- .../embedded/pico/pico-sspc-binance/private.h | 4 +- .../server/hello_world/CMakeLists.txt | 52 +++++ minimal-examples/server/hello_world/README.md | 72 ++++++ .../server/hello_world/example-policy.json | 33 +++ minimal-examples/server/hello_world/main.c | 65 ++++++ .../server/hello_world/ss-server.c | 87 +++++++ .../CMakeLists.txt | 16 +- .../ssproxy-custom-transport-uart/README.md | 158 +++++++++++++ .../ssproxy-custom-transport-uart}/main.c | 135 +---------- .../ssproxy-custom-transport-uart}/private.h | 0 .../transport-serial.c | 2 +- .../ssproxy/ssproxy-socket/CMakeLists.txt | 32 +++ .../ssproxy-socket}/README.md | 0 .../ssproxy/ssproxy-socket/main.c | 198 ++++++++++++++++ 819 files changed, 3074 insertions(+), 342 deletions(-) create mode 100644 doc-assets/ss-api1.png create mode 100644 doc-assets/ss-api2.png create mode 100644 doc-assets/ss-api3.png create mode 100644 minimal-examples-lowlevel/CMakeLists.txt create mode 100644 minimal-examples-lowlevel/README.md rename {minimal-examples => minimal-examples-lowlevel}/abstract/protocols/smtp-client/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/abstract/protocols/smtp-client/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/abstract/protocols/smtp-client/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-async-dns/CMakeLists.txt (89%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-async-dns/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-cose/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-cose/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-cose/keys.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-cose/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-cose/sign.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-dhcpc/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-dhcpc/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-dhcpc/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-fts/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-fts/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-fts/canned-1.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-fts/canned-2.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-fts/les-mis-utf8.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-fts/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-fts/the-picture-of-dorian-gray.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-gencrypto/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-gencrypto/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-gencrypto/lws-genaes.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-gencrypto/lws-genec.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-gencrypto/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-jose/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-jose/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-jose/jwe.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-jose/jwk.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-jose/jws.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-jose/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lecp/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lecp/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lecp/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lejp/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lejp/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lws_cache/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lws_cache/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lws_cache/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lws_cache/text1.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lws_dsh/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lws_dsh/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lws_dsh/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lws_map/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lws_map/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lws_sequencer/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lws_sequencer/libwebsockets.org.cer (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lws_sequencer/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lws_smd/CMakeLists.txt (90%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lws_smd/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lws_struct-json/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lws_struct-json/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lws_struct-json/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lws_struct-json/test2.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lws_struct_sqlite/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lws_struct_sqlite/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lws_struct_sqlite/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lws_tokenize/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lws_tokenize/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lws_tokenize/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lwsac/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lwsac/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-lwsac/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-secure-streams/CMakeLists.txt (89%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-secure-streams/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-secure-streams/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-smtp_client/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-smtp_client/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/api-tests/api-test-smtp_client/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/client-server/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/client-server/minimal-ws-proxy/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/client-server/minimal-ws-proxy/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/client-server/minimal-ws-proxy/minimal-ws-proxy.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/client-server/minimal-ws-proxy/mount-origin/example.js (100%) rename {minimal-examples => minimal-examples-lowlevel}/client-server/minimal-ws-proxy/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/client-server/minimal-ws-proxy/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/client-server/minimal-ws-proxy/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/client-server/minimal-ws-proxy/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/client-server/minimal-ws-proxy/protocol_lws_minimal.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-cose-key/CMakeLists.txt (95%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-cose-key/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-cose-key/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-cose-key/set1.cks (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-cose-key/sign1_pass01.sig (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-cose-key/sign1_pass02.sig (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-cose-key/sign1_pass03.sig (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-cose-key/sign_pass01.sig (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-cose-key/sign_pass02.sig (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-cose-key/sign_pass03.sig (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-cose-sign/CMakeLists.txt (98%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-cose-sign/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-cose-sign/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-cose-sign/payload.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-cose-sign/rsa-4096.ck (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-cose-sign/set1.cks (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-cose-sign/sign-rsa4096.sig (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-cose-sign/sign1_pass01.sig (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-cose-sign/sign1_pass02.sig (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-cose-sign/sign1_pass03.sig (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-cose-sign/sign_pass01.sig (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-cose-sign/sign_pass02.sig (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-cose-sign/sign_pass03.sig (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-jwe/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-jwe/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-jwe/key-rsa-4096.private (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-jwe/key-rsa-4096.pub (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-jwe/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-jwk/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-jwk/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-jwk/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-jws/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-jws/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-jws/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-x509/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-x509/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/crypto/minimal-crypto-x509/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/dbus-client/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/dbus-client/minimal-dbus-client/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/dbus-client/minimal-dbus-client/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/dbus-client/minimal-dbus-client/minimal-dbus-client.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/dbus-client/minimal-dbus-ws-proxy-testclient/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/dbus-client/minimal-dbus-ws-proxy-testclient/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/dbus-client/minimal-dbus-ws-proxy-testclient/minimal-dbus-ws-proxy-testclient.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/dbus-server/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/dbus-server/minimal-dbus-server/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/dbus-server/minimal-dbus-server/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/dbus-server/minimal-dbus-server/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/dbus-server/minimal-dbus-ws-proxy/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/dbus-server/minimal-dbus-ws-proxy/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/dbus-server/minimal-dbus-ws-proxy/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/dbus-server/minimal-dbus-ws-proxy/org.libwebsockets.wsclientproxy.conf (100%) rename {minimal-examples => minimal-examples-lowlevel}/dbus-server/minimal-dbus-ws-proxy/protocol_lws_minimal_dbus_ws_proxy.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/gtk/minimal-gtk/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/gtk/minimal-gtk/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/gtk/minimal-gtk/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/gtk/minimal-gtk/warmcat.com.cer (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-attach/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-attach/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-attach/minimal-http-client-attach.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-captive-portal/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-captive-portal/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-captive-portal/minimal-http-client-captive-portal.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-certinfo/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-certinfo/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-certinfo/minimal-http-client-certinfo.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-certinfo/warmcat.com.cer (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-custom-headers/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-custom-headers/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-custom-headers/minimal-http-client-custom-headers.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-custom-headers/warmcat.com.cer (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-h2-rxflow/CMakeLists.txt (91%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-h2-rxflow/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-h2-rxflow/minimal-http-client.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-h2-rxflow/warmcat.com.cer (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-hugeurl/CMakeLists.txt (92%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-hugeurl/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-hugeurl/minimal-http-client-hugeurl.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-hugeurl/warmcat.com.cer (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-jit-trust/CMakeLists.txt (98%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-jit-trust/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-jit-trust/minimal-http-client.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-jit-trust/trust_blob.h (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-jit-trust/warmcat.com.cer (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-multi/CMakeLists.txt (96%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-multi/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-multi/minimal-http-client-multi.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-multi/warmcat.com.cer (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-post/CMakeLists.txt (96%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-post/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-post/libwebsockets.org.cer (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client-post/minimal-http-client-post.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client/CMakeLists.txt (96%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client/minimal-http-client.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client/warmcat.com.cer (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-client/minimal-http-client/wrong.cer (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-basicauth/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-basicauth/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-basicauth/ba-passwords (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-basicauth/minimal-http-server-basicauth.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-basicauth/mount-origin/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-basicauth/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-basicauth/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-basicauth/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-basicauth/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-basicauth/mount-secret-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-basicauth/mount-secret-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-cgi/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-cgi/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-cgi/minimal-http-server.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-cgi/my-cgi-script.sh (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-custom-headers/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-custom-headers/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-custom-headers/localhost-100y.cert (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-custom-headers/localhost-100y.key (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-custom-headers/minimal-http-server-custom-headers.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-custom-headers/mount-origin/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-custom-headers/mount-origin/error.css (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-custom-headers/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-custom-headers/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-custom-headers/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-custom-headers/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-deaddrop/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-deaddrop/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-deaddrop/ba-passwords (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-deaddrop/localhost-100y.cert (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-deaddrop/localhost-100y.key (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-deaddrop/minimal-http-server-deaddrop.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-deaddrop/mount-origin/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-deaddrop/mount-origin/deaddrop.css (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-deaddrop/mount-origin/deaddrop.js (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-deaddrop/mount-origin/drop.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-deaddrop/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-deaddrop/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-deaddrop/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-deaddrop/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-deaddrop/uploads/user1/placeholder.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-dynamic/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-dynamic/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-dynamic/localhost-100y.cert (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-dynamic/localhost-100y.key (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-dynamic/minimal-http-server-dynamic.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-dynamic/mount-origin/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-dynamic/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-dynamic/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-dynamic/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-dynamic/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-custom/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-custom/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-custom/minimal-http-server.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-custom/mount-origin/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-custom/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-custom/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-custom/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-custom/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-custom/mount-origin/symlink.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-demos/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-demos/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-demos/localhost-100y.cert (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-demos/localhost-100y.key (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-demos/minimal-http-server-eventlib-demos.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-demos/mount-origin/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-demos/mount-origin/candide-uncompressed.zip (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-demos/mount-origin/candide.zip (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-demos/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-demos/mount-origin/http2.png (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-demos/mount-origin/leaf.jpg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-demos/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-demos/mount-origin/lws-common.js (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-demos/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-demos/mount-origin/test.css (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-demos/mount-origin/test.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-demos/mount-origin/test.js (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-demos/mount-origin/wss-over-h2.png (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-foreign/CMakeLists.txt (90%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-foreign/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-foreign/glib.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-foreign/libev.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-foreign/libevent.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-foreign/libsdevent.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-foreign/libuv.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-foreign/localhost-100y.cert (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-foreign/localhost-100y.key (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-foreign/minimal-http-server-eventlib-foreign.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-foreign/mount-origin/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-foreign/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-foreign/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-foreign/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-foreign/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-foreign/private.h (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-foreign/uloop.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-smp/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-smp/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-smp/localhost-100y.cert (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-smp/localhost-100y.key (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-smp/minimal-http-server-eventlib-smp.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-smp/mount-origin/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-smp/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-smp/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-smp/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib-smp/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib/localhost-100y.cert (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib/localhost-100y.key (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib/minimal-http-server-eventlib.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib/mount-origin/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-eventlib/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-get/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-get/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-get/minimal-http-server-form-get.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-get/mount-origin/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-get/mount-origin/after-form1.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-get/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-get/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-get/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-get/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-post-file/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-post-file/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-post-file/minimal-http-server-form-post-file.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-post-file/mount-origin/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-post-file/mount-origin/after-form1.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-post-file/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-post-file/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-post-file/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-post-file/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-post-lwsac/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-post-lwsac/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-post-lwsac/localhost-100y.cert (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-post-lwsac/localhost-100y.key (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-post-lwsac/minimal-http-server-form-post.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-post/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-post/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-post/localhost-100y.cert (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-post/localhost-100y.key (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-post/minimal-http-server-form-post.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-post/mount-origin/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-post/mount-origin/after-form1.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-post/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-post/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-post/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-form-post/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-fulltext-search/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-fulltext-search/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-fulltext-search/lws-fts.index (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-fulltext-search/minimal-http-server.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-fulltext-search/mount-origin/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-fulltext-search/mount-origin/dorian-gray-wikipedia.jpg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-fulltext-search/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-fulltext-search/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-fulltext-search/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-fulltext-search/mount-origin/lws-fts.css (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-fulltext-search/mount-origin/lws-fts.js (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-fulltext-search/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-fulltext-search/the-picture-of-dorian-gray.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-h2-long-poll/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-h2-long-poll/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-h2-long-poll/localhost-100y.cert (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-h2-long-poll/localhost-100y.key (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-h2-long-poll/minimal-http-server.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-mimetypes/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-mimetypes/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-mimetypes/minimal-http-server-mimetypes.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-mimetypes/mount-origin/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-mimetypes/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-mimetypes/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-mimetypes/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-mimetypes/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-mimetypes/mount-origin/test.tar.bz2 (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-multivhost/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-multivhost/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-multivhost/minimal-http-server.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-multivhost/mount-origin-localhost1/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-multivhost/mount-origin-localhost1/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-multivhost/mount-origin-localhost1/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-multivhost/mount-origin-localhost1/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-multivhost/mount-origin-localhost1/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-multivhost/mount-origin-localhost2/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-multivhost/mount-origin-localhost2/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-multivhost/mount-origin-localhost2/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-multivhost/mount-origin-localhost2/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-multivhost/mount-origin-localhost2/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-multivhost/mount-origin-localhost3/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-multivhost/mount-origin-localhost3/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-multivhost/mount-origin-localhost3/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-multivhost/mount-origin-localhost3/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-multivhost/mount-origin-localhost3/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-proxy/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-proxy/localhost-100y.cert (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-proxy/localhost-100y.key (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-proxy/minimal-http-server-proxy.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-proxy/mount-origin/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-proxy/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-proxy/mount-origin/http2.png (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-proxy/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-smp/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-smp/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-smp/localhost-100y.cert (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-smp/localhost-100y.key (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-smp/minimal-http-server-smp.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-smp/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-smp/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-smp/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-smp/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-sse-ring/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-sse-ring/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-sse-ring/minimal-http-server-sse-ring.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-sse-ring/mount-origin/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-sse-ring/mount-origin/example.js (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-sse-ring/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-sse-ring/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-sse-ring/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-sse-ring/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-sse/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-sse/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-sse/localhost-100y.cert (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-sse/localhost-100y.key (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-sse/minimal-http-server-sse.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-sse/mount-origin/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-sse/mount-origin/example.js (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-sse/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-sse/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-sse/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-sse/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls-80/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls-80/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls-80/localhost-100y.cert (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls-80/localhost-100y.key (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls-80/minimal-http-server-tls-80.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls-80/mount-origin/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls-80/mount-origin/example.js (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls-80/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls-80/mount-origin/http2.png (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls-80/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls-80/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls-80/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls-mem/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls-mem/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls-mem/minimal-http-server-tls-mem.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls-mem/mount-origin/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls-mem/mount-origin/example.js (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls-mem/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls-mem/mount-origin/http2.png (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls-mem/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls-mem/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls-mem/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls/localhost-100y.cert (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls/localhost-100y.key (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls/minimal-http-server-tls.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls/mount-origin/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls/mount-origin/example.js (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls/mount-origin/http2.png (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server-tls/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server/minimal-http-server.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server/mount-origin/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/http-server/minimal-http-server/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/mqtt-client/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/mqtt-client/minimal-mqtt-client-multi/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/mqtt-client/minimal-mqtt-client-multi/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/mqtt-client/minimal-mqtt-client-multi/minimal-mqtt-client-multi.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/mqtt-client/minimal-mqtt-client-multi/selftest.sh.broken-on-travis (100%) rename {minimal-examples => minimal-examples-lowlevel}/mqtt-client/minimal-mqtt-client-multi/warmcat.com.cer (100%) rename {minimal-examples => minimal-examples-lowlevel}/mqtt-client/minimal-mqtt-client-multi/wget-log (100%) rename {minimal-examples => minimal-examples-lowlevel}/mqtt-client/minimal-mqtt-client/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/mqtt-client/minimal-mqtt-client/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/mqtt-client/minimal-mqtt-client/minimal-mqtt-client.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/mqtt-client/minimal-mqtt-client/mosq-ca.crt (100%) rename {minimal-examples => minimal-examples-lowlevel}/mqtt-client/minimal-mqtt-client/mosq-server.crt (100%) rename {minimal-examples => minimal-examples-lowlevel}/mqtt-client/minimal-mqtt-client/mosq-server.key (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-adopt-tcp/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-adopt-tcp/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-adopt-tcp/minimal-raw-adopt-tcp.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-adopt-udp/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-adopt-udp/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-adopt-udp/minimal-raw-adopt-udp.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-audio/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-audio/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-audio/audio.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-fallback-http-server/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-fallback-http-server/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-fallback-http-server/localhost-100y.cert (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-fallback-http-server/localhost-100y.key (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-fallback-http-server/minimal-raw-fallback-http-server.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-fallback-http-server/mount-origin/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-fallback-http-server/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-fallback-http-server/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-fallback-http-server/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-fallback-http-server/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-file/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-file/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-file/minimal-raw-file.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-netcat/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-netcat/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-netcat/minimal-raw-netcat.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-proxy-fallback/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-proxy-fallback/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-proxy-fallback/localhost-100y.cert (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-proxy-fallback/localhost-100y.key (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-proxy-fallback/minimal-raw-proxy-fallback.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-proxy-fallback/mount-origin/404.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-proxy-fallback/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-proxy-fallback/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-proxy-fallback/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-proxy-fallback/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-proxy/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-proxy/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-proxy/minimal-raw-proxy.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-serial/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-serial/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-serial/minimal-raw-file.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-vhost/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-vhost/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-vhost/localhost-100y.cert (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-vhost/localhost-100y.key (100%) rename {minimal-examples => minimal-examples-lowlevel}/raw/minimal-raw-vhost/minimal-raw-vhost.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-alexa/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-alexa/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-alexa/alexa.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-alexa/alexa_linux.ppn (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-alexa/audio.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-alexa/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-alexa/porcupine_params.pv (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-alexa/private.h (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-avs/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-avs/avs.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-avs/main-client.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-avs/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-avs/year.wav (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-binance/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-binance/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-binance/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-binance/policy.json (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-blob/CMakeLists.txt (95%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-blob/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-blob/minimal-secure-streams.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-client-tx/CMakeLists.txt (95%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-client-tx/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-client-tx/minimal-secure-streams-client-tx.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-cpp/CMakeLists.txt (93%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-cpp/main.cxx (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-custom-client-transport/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-custom-client-transport/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-custom-client-transport/app-event-loop.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-custom-client-transport/binance-ss.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-custom-client-transport/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-custom-client-transport/policy.json (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-custom-client-transport/private.h (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-custom-client-transport/system.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-custom-client-transport/transport-serial.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-hugeurl/CMakeLists.txt (95%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-hugeurl/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-hugeurl/minimal-secure-streams.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-metadata/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-metadata/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-metadata/minimal-secure-streams.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-metrics-proxy/metrics-proxy-policy.json (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-perf/CMakeLists.txt (95%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-perf/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-perf/minimal-secure-streams.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-policy2c/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-policy2c/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-policy2c/minimal-secure-streams.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-post/CMakeLists.txt (94%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-post/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-post/minimal-secure-streams-post.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-proxy/CMakeLists.txt (100%) rename {minimal-examples/secure-streams/minimal-secure-streams-custom-proxy-transport => minimal-examples-lowlevel/secure-streams/minimal-secure-streams-proxy}/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-proxy/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-seq/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-seq/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-seq/minimal-secure-streams.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-server-raw/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-server-raw/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-server-raw/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-server-raw/ss-server.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-server/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-server/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-server/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-server/ss-client.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-server/ss-server.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-sigv4/CMakeLists.txt (93%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-sigv4/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-sigv4/policy.json (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-sigv4/ss-s3-main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-sigv4/ss-s3-put.h (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-sigv4/ss-s3-ss.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-sigv4/static_policy.h (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-smd/CMakeLists.txt (94%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-smd/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-smd/minimal-secure-streams-smd.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-smd/multi.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-staticpolicy/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-staticpolicy/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-staticpolicy/minimal-secure-streams.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-staticpolicy/static-policy.h (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-staticpolicy/static-policy.json (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-stress/CMakeLists.txt (82%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-stress/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-stress/minimal-secure-streams.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-testsfail/CMakeLists.txt (93%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-testsfail/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-testsfail/minimal-secure-streams-testsfail.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-threads/CMakeLists.txt (95%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-threads/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams-threads/minimal-secure-streams-threads.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams/CMakeLists.txt (94%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/secure-streams/minimal-secure-streams/minimal-secure-streams.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-binance/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-binance/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-binance/main.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-echo/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-echo/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-echo/minimal-ws-client-echo.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-echo/protocol_lws_minimal_client_echo.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-ping/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-ping/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-ping/libwebsockets.org.cer (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-ping/minimal-ws-client-ping.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-pmd-bulk/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-pmd-bulk/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-pmd-bulk/minimal-ws-client-pmd-bulk.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-pmd-bulk/protocol_lws_minimal_pmd_bulk.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-rx/CMakeLists.txt (89%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-rx/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-rx/libwebsockets.org.cer (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-rx/minimal-ws-client.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-spam-tx-rx/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-spam-tx-rx/libwebsockets.org.cer (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-spam-tx-rx/minimal-ws-client.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-spam/CMakeLists.txt (96%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-spam/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-spam/libwebsockets.org.cer (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-spam/minimal-ws-client-spam.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-tx/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-tx/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client-tx/minimal-ws-client.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client/libwebsockets.org.cer (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-client/minimal-ws-client/minimal-ws-client.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-broker/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-broker/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-broker/minimal-ws-broker.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-broker/mount-origin/example.js (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-broker/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-broker/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-broker/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-broker/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-broker/protocol_lws_minimal.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-raw-proxy/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-raw-proxy/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-raw-proxy/localhost-100y.cert (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-raw-proxy/localhost-100y.key (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-raw-proxy/minimal-ws-raw-proxy.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-raw-proxy/mount-origin/example.js (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-raw-proxy/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-raw-proxy/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-raw-proxy/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-raw-proxy/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-echo/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-echo/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-echo/minimal-ws-server-echo.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-echo/protocol_lws_minimal_server_echo.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd-bulk/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd-bulk/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd-bulk/minimal-ws-server-pmd-bulk.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd-bulk/mount-origin/example.js (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd-bulk/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd-bulk/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd-bulk/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd-bulk/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd-bulk/protocol_lws_minimal_pmd_bulk.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd-corner/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd-corner/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd-corner/minimal-ws-server-pmd-corner.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd-corner/mount-origin/example.js (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd-corner/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd-corner/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd-corner/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd-corner/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd-corner/protocol_lws_minimal.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd/minimal-ws-server-pmd.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd/mount-origin/example.js (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-pmd/protocol_lws_minimal.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-ring/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-ring/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-ring/minimal-ws-server-ring.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-ring/mount-origin/example.js (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-ring/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-ring/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-ring/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-ring/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-ring/protocol_lws_minimal.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threadpool/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threadpool/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threadpool/minimal-ws-server-threadpool.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threadpool/mount-origin/example.js (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threadpool/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threadpool/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threadpool/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threadpool/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threadpool/protocol_lws_minimal_threadpool.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads-foreign-libuv-smp/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads-foreign-libuv-smp/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads-foreign-libuv-smp/minimal-ws-server.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/example.js (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads-foreign-libuv-smp/protocol_lws_minimal.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads-smp/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads-smp/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads-smp/minimal-ws-server.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads-smp/mount-origin/example.js (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads-smp/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads-smp/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads-smp/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads-smp/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads-smp/protocol_lws_minimal.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads/minimal-ws-server.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads/mount-origin/example.js (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-threads/protocol_lws_minimal.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-timer/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-timer/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-timer/localhost-100y.cert (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-timer/localhost-100y.key (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-timer/minimal-ws-server.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-timer/mount-origin/example.js (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-timer/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-timer/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-timer/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server-timer/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server/CMakeLists.txt (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server/README.md (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server/localhost-100y.cert (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server/localhost-100y.key (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server/minimal-ws-server.c (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server/mount-origin/example.js (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server/mount-origin/favicon.ico (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server/mount-origin/index.html (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server/mount-origin/libwebsockets.org-logo.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server/mount-origin/strict-csp.svg (100%) rename {minimal-examples => minimal-examples-lowlevel}/ws-server/minimal-ws-server/protocol_lws_minimal.c (100%) create mode 100644 minimal-examples/client/binance/CMakeLists.txt create mode 100644 minimal-examples/client/binance/README.md create mode 100644 minimal-examples/client/binance/binance-ss.c create mode 100644 minimal-examples/client/binance/example-policy.json create mode 100644 minimal-examples/client/binance/main.c create mode 100644 minimal-examples/client/hello_world/CMakeLists.txt create mode 100644 minimal-examples/client/hello_world/README.md create mode 100644 minimal-examples/client/hello_world/example-policy.json create mode 100644 minimal-examples/client/hello_world/hello_world-ss.c create mode 100644 minimal-examples/client/hello_world/main.c create mode 100644 minimal-examples/client/http-post/CMakeLists.txt create mode 100644 minimal-examples/client/http-post/README.md create mode 100644 minimal-examples/client/http-post/example-policy.json create mode 100644 minimal-examples/client/http-post/http-post-ss.c create mode 100644 minimal-examples/client/http-post/main.c create mode 100644 minimal-examples/client/ws-echo/CMakeLists.txt create mode 100644 minimal-examples/client/ws-echo/README.md create mode 100644 minimal-examples/client/ws-echo/example-policy.json create mode 100644 minimal-examples/client/ws-echo/main.c create mode 100644 minimal-examples/client/ws-echo/ws-echo-ss.c create mode 100644 minimal-examples/server/hello_world/CMakeLists.txt create mode 100644 minimal-examples/server/hello_world/README.md create mode 100644 minimal-examples/server/hello_world/example-policy.json create mode 100644 minimal-examples/server/hello_world/main.c create mode 100644 minimal-examples/server/hello_world/ss-server.c rename minimal-examples/{secure-streams/minimal-secure-streams-custom-proxy-transport => ssproxy/ssproxy-custom-transport-uart}/CMakeLists.txt (69%) create mode 100644 minimal-examples/ssproxy/ssproxy-custom-transport-uart/README.md rename minimal-examples/{secure-streams/minimal-secure-streams-custom-proxy-transport => ssproxy/ssproxy-custom-transport-uart}/main.c (62%) rename minimal-examples/{secure-streams/minimal-secure-streams-custom-proxy-transport => ssproxy/ssproxy-custom-transport-uart}/private.h (100%) rename minimal-examples/{secure-streams/minimal-secure-streams-custom-proxy-transport => ssproxy/ssproxy-custom-transport-uart}/transport-serial.c (98%) create mode 100644 minimal-examples/ssproxy/ssproxy-socket/CMakeLists.txt rename minimal-examples/{secure-streams/minimal-secure-streams-proxy => ssproxy/ssproxy-socket}/README.md (100%) create mode 100644 minimal-examples/ssproxy/ssproxy-socket/main.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 3565589f5..e00317bd0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -942,7 +942,7 @@ endif() if (LWS_HAVE_LIBCAP) find_library(LIBCAP_LIBRARIES NAMES cap) - list(APPEND LIB_LIST ${LIBCAP_LIBRARIES} ) + list(APPEND LIB_LIST_AT_END ${LIBCAP_LIBRARIES} ) endif() if (LWS_WITH_PLUGINS_BUILTIN) @@ -1006,7 +1006,10 @@ set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") message("DIR ${libwebsockets_DIR} CMP ${CMAKE_MODULE_PATH}") if (LWS_WITH_MINIMAL_EXAMPLES) - add_subdirectory(minimal-examples) + if (LWS_WITH_SECURE_STREAMS) + add_subdirectory(minimal-examples) + endif() + add_subdirectory(minimal-examples-lowlevel) endif() if (NOT LWS_WITHOUT_TESTAPPS) diff --git a/README.md b/README.md index 552603f38..f44e2e425 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,84 @@ sdevent, glib and uloop, as well as custom event libs. News ---- +## Lws examples switching to Secure Streams + +![Secure Streams direct](./doc-assets/ss-api1.png) + +**Secure Streams** support in lws was introduced a couple of years ago, it's a +higher-level interface to lws `wsi`-level apis that simplifies connectivity by +segregating connection policy like protocol and endpoint information into a +separate [JSON policy file](./minimal-examples/client/hello_world/example-policy.json), and just having the [code deal with payloads](./minimal-examples/clients/hello_world/hello_world-ss.c); as many +details of the wire protocol as possible are hidden or moved to the policy, so +user code is almost identical even if the wire protocol changes. + +The user code just asks to create a SS by "streamtype name", it is created +according to the details (protocol, endpoint, etc) under the same name in the +policy. + +Key policy entries like endpoint can contain `${metadata-name}` string +substitutions to handle runtime adaptations via metadata. h1, h2, ws and mqtt +are supported. + +As a layer on top of the `wsi` apis, SS provides a higher-level way to access +the existing wsi-level capabilities, both kinds of API will remain supported. +Secure Streams are longer-lived than a single wsi, so an SS can coordinate +retries by itself. SS-based user code is typically significantly smaller and +more maintainable than wsi layer. + +In main branch I have moved the older examples into `./minimal-examples-lowlevel` +and am starting to port more cases from there into SS-based examples. + +### Comparison between wsi and SS level lws usage + +|Feature|"low-level" wsi way|Secure Streams way| +|---|---|---| +|Create context|code|same| +|Loop support, sul scheduler|default, event libs|same| +|Supports comms mode|Client, Server, Raw|same| +|Supports protocols|h1, h2, ws, mqtt (client)|same| +|TLS support|mbedtls (including v3), openssl (including v3), wolfssl, boringssl, libressl|same| +|Serializable, proxiable, muxable, transportable|No|Yes| +|Auto-allocated per-connection user object|pss specified in lws_protocols|Specified in ss info struct| +|Connection User API|Protocol-specific lws_protocols cbs (> 100)|SS API (rx, tx, state callbacks only)| +|Sending adaptation|lws_callback_on_writeable() + WRITEABLE|lws_ss_request_write() + tx() cb| +|Sending buffer|User-chosen + malloc'd partial handling|SS-provided, no partials| +|Create vhosts|code|**JSON policy**| +|TLS validation|cert bundle or code|**JSON policy**, or cert bundle| +|Connection retry / backoff|code|**JSON policy**, Auto| +|Nailing up|code|**JSON policy**, Auto| +|Endpoint and protocol details|spread around the code|**JSON policy**| +|Protocol selection, pipeline / stream sharing|code|**JSON policy**| +|ws subprotocol selection|code|**JSON policy**| +|ws binary / text|code|**JSON policy**| +|Protocol-specific metadata|Protocol-specific apis in code (eg, lws_hdr)|**JSON policy**, generic metadata apis in code| +|Connection validity rules|struct|**JSON policy**, Auto| +|Stream as Long Poll|code|**JSON policy**| +|Auth|code|**JSON policy** + automatic rotation if provider supported, else code| + +### Serialized Secure Streams + +![Secure Streams direct](./doc-assets/ss-api2.png) + +Secure Streams APIs are also **serializable**, the exact same client code can +fulfil the connection directly in the same process as you would expect, or +forward the actions, metadata and payloads to an [SS Proxy](./minimal-examples/ssproxy/ssproxy-socket) that owns the policy +over a Unix Domain or TCP socket connection to be fulfilled centrally. This +allows, eg, h2 streams from different processes sharing a single connection. + +![Secure Streams direct](./doc-assets/ss-api3.png) + +The serialized SS can also travel over generic transports like UART, an [example +is provided implementing the Binance example on an RPi Pico](./minimal-examples/embedded/pico/pico-sspc-binance) with a UART transport +to a [UART transport SS proxy](./minimal-examples/ssproxy/ssproxy-custom-transport-uart), where the pico itself has no network stack, tls, compression or +wss stack, but can send and receive to and from the endpoint as if it did. + +The optional `lws_trasport_mux` is used to interpose between the UART transport +and the SSPC layer, allowing a single pipe to carry many separate SS connections. + +The user SS code is identical however it is transported, muxed and fulfilled. + + ## v4.3 is released See the [changelog](https://libwebsockets.org/git/libwebsockets/tree/changelog) diff --git a/READMEs/README.ctest.md b/READMEs/README.ctest.md index 0ed8a8400..9fdb1ee7b 100644 --- a/READMEs/README.ctest.md +++ b/READMEs/README.ctest.md @@ -282,7 +282,7 @@ named fixture "hcm_srv", itself with an 800s timeout ``` set_tests_properties(st_hcm_srv PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/http-server/minimal-http-server-tls + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-server/minimal-http-server-tls FIXTURES_SETUP hcm_srv TIMEOUT 800) set_tests_properties(ki_hcm_srv PROPERTIES @@ -296,7 +296,7 @@ test (http-client-multi) we are testing set_tests_properties(http-client-multi PROPERTIES FIXTURES_REQUIRED "hcm_srv" - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/http-client/minimal-http-client-multi + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-client/minimal-http-client-multi TIMEOUT 50) ``` diff --git a/doc-assets/ss-api1.png b/doc-assets/ss-api1.png new file mode 100644 index 0000000000000000000000000000000000000000..8acdf065cbc14a9b76c2f8797ae64fe08ac09250 GIT binary patch literal 33944 zcmdqIgLh=z^F7>2CN?HECbn%S6Wg|J+vbE5Ol(Xz;l#FWP3-qRpYQtp6YpIst9x~l zd-~L^s$FN-t|-Otl8A7)a3Bx}QCdn&83Y2?1cAWNVW5CdPEkECffrauDJ>Te2(9+N zAFu(HD`a2OiWzq0p*MM3f^d* z8HQz0gO#kT#=qA+*Pm9avEMj3PrQ2cz1Z6y_w&l^oUe`qj&O*Rq{z{t#7O`D{BkO~ zX9)r9a$vFzf+EORhzTY6qZ0-tQD6xAdcj8l7bWL|52p=zT|Qu4`V$9|uch$<_+#lL za9Pr%HgMbma7COlC^vHRiT*&XBvOsd)3F;)NTo82~aC=r|97|X> z=uCNv0a3D&~NZ+)V_*PlZpChv2Efy z_+{{O2|7WU|9cWt!GhD!Pf+!Dr7nLY>FRJjaq44%Rdiua{v=D0TmQj221AhhJjvLC zfO_&lQRfK!X9fX7e<|yzux2GdH}3NaWz*>&pj%LAc&l5~0zi|7qnmFi26n z(6{j_z21?Z`g}XtMNV2f=yI@1W^7M+xFm-XY$I5QpcxNSkRe6>Jr+X~FhWur*pEO| zA;yM=7dq0WHpXU~FG{WEsMZ?DMcQe7p=q!Mno15jtJbLl!&YMYaYx3c_>@xu+xuCs zxqPpI@EIo3@(WrnQuK9Ln&5PhgsZdqQDQ|1%7)V9Xp)M!*l8ayjr(x|o0n`=8nNkd zqL!Onp@(t7undPL$auGddq3IY^V)_tMO#^kTCX&97f8T%7G4NZsTcvHfBB!$lbgUc zzj%|Ls$_{32fZ}M%(m-M^R&{6r-c9U^!mNBAmxMVM4e8*=1}K#=H`ALM?%89kldON z-VN?AyttJtrJC@+eQtV!-h-lqOk6g%FAlyBw@`Rh=xFh@GKxo`7|c01vk+32)VmlU z1bh$-p2lgkyRF$yxWYf-W+qU1(d87x&y%7!yoastF{*F|V z^2Ce{L{)ezD<1dD7^A@#+Nw>@w2sH|3Z-lqx-SA?_R9-GQDVl-|1*ouUih`o7f1}9@qCH3>fPUYb$@2WFe#~Kw&}<5z~yxlB0bk zhD;YDt*3wpObDv*Li~5>m#D(IeogzivQUJz;g*uQ&8w8fe$6JTCXHX-&GW#*Ac?eEkW~tT9k<56Qe|Yx{ zT^haxDg_fH&Q=GOh5p~NBghmegq24qvLQpzVNd@KkF)tWf3k#uUo3d6+|QgC&IQc) za$J$WB5iQ6zo9S@&Lm5cCQ<#LmucroG&NACuLTx~cY3+F$`A2rAPO2FAJEZ)-db;= zR0R1)3r#$3aZ5!p=m?P4RR)-%#K5J3fRLgqL#qQFC$0td1?6>emtvYos!{eDz|r~? z&ix4wD0Z?ZLJDkZsM!fqK+Y<%7PfG$M}ju7}q5F8oasEl(Nk+Jl&WtCb|pZ>UK zD_C*3deQ-=YTqvxWbF4v0i@6)?PI-&V}~cGqAlR7)-#*mgQv8yO$0g?kT`;RB{x^8ir*L#Ngz~+B@sJ3;CG5U%OE+VLs@>g1OE_*>Xjwu zkjz7a=SV{>qA`&_LcR8S5#3zCv>gSf4J;jUPlvfVSX-Gmc`&syt4`J&UnrOC7T&GSU_-1hXRqSx=9xWX9@8Jp~~9QsIsP9 z_1O$@Z-b?_NE4-o!LUEb`cA7%{x{~r$2him^9BrxY!X%nbu0ociacKmS^due>$V-b ziD_Y9@Ni`>KCz@7WPl*DK+b9;R=AqdCQXz)m;0#znZd?j)@{24xUE=ZHP=B^vXn0R z$sd}`c}V|(yU!ksBCqoR_g1N0%k?0}AY^9cq%P|ck+*vv$=^+kC2dA%YpB}m8K@yN zF7!M>=oXiFc*>B+P;XHfT4>VUiQtvnJModtR5nA)5RnIcy0={v3_*g|&`f>HlY~D; z>kf||Qt2stpnrqs5!&CKsHZ1W_^vd(Ls_lj(*_s9FfMY4Nkap13+WtHx6O>U)5S6f zAqKG}<%3J+#5EY$6ZkEhcYT9h&Zk2FeRw_@CzxThTeKDD-#;Y#0dm|m0_Z#O0c#-V z!zYzZ1c&iDM(YM=ARb59R_>gpf<7eZa4h<_rb6;RmZI~1j8QqHi7DA{%KY5=TOCTo zsr`!t7CV>^ONtybg=|q|ca|^CYuB3aU+C#+DulbSm~I&6`#_E@_`nnstB+IZ_cCX?JPSPQ3O)@RN@hWrYTH zRhtsp@Xo=>P@w)ny9;Af|L`U5r8|T-ghrrAG#+IV7xjOepT=Ld8EVVxh2mW^rltsd zh^)9>2!az*A_hrGU`TaA=0bmmSPSy&HIc-wbRGrqq6GBYvQ_BB-uJi{SfV-{R412* zuiPpyn;oK>bTq*zEIN#8lP7Uea$9dm>82Z*$7;oR52&FqVK|96SET-%^o$tyYid$%odimcm!`>FXU} zZg!lr^mH)i`h5-?Zr?j41Xs6?+9FLp89Lf?iiWoXs|y`0A8P}L-_*nHg$6DMl7I-a zbsbmfrR-IPtC@zApo3pzS)XY!gH``n&I1K_^_U?7iG5Pf_ixl3a+@nf{F(=$N}(_D z*D+|tMs1X@qmW#yVwIY0&WQ>d!CUsj z@vcdk(CgnUkRKpSP$sJ3(LP|D7M2|)%UVh_Z%lMLyG*%C+sVmG8|*v~{sV&R`VM@4 zFJuD)lYSQ>3O#UV^>DTj*bPUGqg&ago0g56ZP_c6* zn|lAoeG&7WBr_Wykq{NriBE=`>L66A<`LfUN;{<8X77)a$NkdibdvG~>ThP{`t<)n z#m7DM1AbeYU4Cr>ugYfCSS914qqLFP-&pS9Eas!OdOeGv^uU>JUNmW82{^i?GCIeF zfy}gC5Tq^hPXf}qP4#;9^aiY*4VQ(O{T4Ok%13ws1R_rcxow+Gz?$Yp-wJ_pwIxFc&& z)Noxq>W-D<#~)>;iMu0&+wABjI&9yxpk#8^SJB4TN>AY9#oJ#(D$VeAxw-m~j!` zp3hSFRwPcyHE!E{7^7r0c0I9kL=+RTzK%gsEuLDgtV-n(bc`+6s0js#$0kat##V(K ztnOPL+Jv6Dx01#v)GO*fzj!Lvi;&2qUQ^P`k3IaDac4mcR0n`!;URb6dn!~n=elOI zG709SpGY(<#O0=J(b_h>S2S%PSl4Lfciobo)>@r+;DYb|N&UlD=Ct6ahoyzmA%=NG z+F2G*sskGv{+~}letlf7cQy6neg2W2RpRbBx};9v`&LWMC*ddVn72XoaLdXNTv178 zCvZk#Tt2Q`AfJbg0>34-yEB!js6D*d0(}^J`(2Y4Dw43G63pom6|Y75tE}e_{}9eP zBNfw2bPdMQLcNe{DTCcCCM&GZ*9T4e{sd5*BLibPULB;87B4ygyY3Fh68AJ=1SV-R z($WjF&nE%PK1>crH90xq*8x5ir&k_tcYfjBogwfUdvfvBdi;@F-8P~NG7qxz^70Ea zUfY7)r=egsz!qRSlM-k^A)JBuNVl@ z&g3}Dly-ugE)|DWdw*}a=$3vhR-bZ*-((Sx<6t&Eu)1&kiphrmf023ht?2-?lL4~IgQO`-UD;>yn+Y%~>XVg+vn zIdO+pFt8n3qbShQ$RN{g_DqJbDZZ#vj-&fzF_W!%NX(TVT+LhG(fUC<7#{zf;CuX+ zKJLV6FR&Ye^U7+V;9tp1Lejkwe{gUxX~Ei%tF+}Ckb7NR%8wNZ(zAH7w+wU$wC(X6 zLF@KqmHpKTc_dsG!dXTrQpxUc-)e?le4mHkhj&G^{~>w?SF-i{JyV*9pru}X0o}{()W>;p9j%Tn@Naakq zuoE2CzukW737p%P#qoC&{R+{v(V|`VyL->l6Id4XFJ##U(BRe#D|)!7Yw2-U-Il`j zMb`53uJ}2v5-!(~USnoJrR5%{*AUtT?a*lU8s|%3a*(f)$=8k4T(NSs$LAq|?tb27 zbxeN?(GAJ7r|T346mm)6W6jd8O<*TY4W`%ozkKAPX;EbT_coV@Y69|yfcoC0-==Om zA_bq{KPM5zVAGGcGV(p=>YSWGU=WQpuhFzl8+*1E{Ks0Fa}!R5>7|Fn>oE=m)AXF> zTRxd){fA6<0&tqB5UgERGyDp7xBqF*Q4CaJ;T=5SQ{aLtcFs{^VO;$zkptf2H-^+R zsWrdbA&7>)xjae5$NtoX74*(==n({qtg2nfhok4b=rYInj@-FXN1e>>eWOz&Q(v?> zp1t~a#=JcFj1zsi`>6EUVfxqbN&~M&c%It%x<$_3zW8H&iPvurFOv>)u+tIjL@5j* z0Q3%na7@m-(pAymad`wi6HRZL?N*0h+x`Wqm4 zs9j1qNywLT>pFsmUnZ0={c0`+UK0?YAQU=>>}3OWQ_EZ8X8G~=g?oVNAE z5rFg<3_w*JcWc!{H)+n-^}L`-xG7;phdhR-Lg$d2@*olWi*rGAx) zQ2bvHEm>8^YTlVK{fS(RptP4L8v=(ih-cRgQUcn`UEA^n|KmktsJ zHZ+7Eq&6_gfqemIWApJwo80l(Fnm^4YW;lw=prL`r3h5hz5?`;ufkD;!&NA*_#x+c@LoE05fON(QY_YCnNrhUs9~Vk{v=j`SZ60yj0g(sdOl4I56VRH!dn`Qb!J zXfKyDD;IS_Fbdyaq1f>|JB5HC<~wvojppUxo7alCvI+rF%tBQX_kFPZTv5HV86~jv z_>Y+Z&6rYw^2U`8F=LmXz0P)o#=j9nop{$0JsLUj6kFtoQ@)u)di1;;x+l->SxE5f zq#VkNUf2cqQz{#g_ zKs|7qbd=IsM~dwd1FQJSsVz2nP_Fs73kVoY*oXAwQ-T6M+_E5JzOw`bSw`#~mhPOj zUtHh0P9(g9);F6@(4r3rHk9*8a(t5)91qbvgY#XDX1I`@tFxc+B`CHVLu+yr+L_0> z;^^%si@>WSn^t!+Ax8^yny8EyBT|{^Dyh3-*>vl*KauVFtx+Jk!~{xCnajNUAOs0~ zoD;X&M_Jh{(GAfu&evzaB9XOaBG<;2|M$2P5)$qYK7dooej4nnl#IKsM4<$Pf&cs$ zMp_57w|BlLV{i01hzp^TI-xuq!=}F1VVO061c(E?E8!Oxoda<|>#$cb7q_{q{10p)IRxg081eqZbqlKJK9c9(f7!&gIOR{Wu#OV;Syj5d%tq&)$}>;ZZu zuZaQeJ_=Da%0pI*RH3zkHs($@D#*x)TLCMxh0NYp-TK3sT)yBZgUM}N%7*O%hhKiL zb=*DL`{3Vod1Rxg>!&XN_M=Qvu&}slZE?Jz{+`zjFJu^K!NGiZo=Uefb~~l&)P(ar zD5FfL`z+*QGazQMi^J(sq$;keA$JFYw%%BY7Y^Dxo4p(0#TFU8lKuH(hlHsmo*Teo zv2B}p`o&7@03uKf@XKMq*;gky_K$xg8Ca__j-HvES#;-dmhnm;oAEIG+!veGy_ z^Y^2f;rHX7S;^vR!R!{ejOXaLDp#WT6dz#Jiz>FelIO6}Gojz$O+TEk5$Jpoaf^n+ zap+U5D(6HWn%~`@6liiNiT{$|p5n$IX(#lZeHw^sF=r!JwkYXR_sS{~AiYnT2 z>OjSX3an{nOYvtN78%rtcU-z+hc^oEgSNWuJT|g%3J!-iWq^J6PzDiaiIfoqkGvTr z;4S$IHsh2kxK7u92^jRE_5dC-IL2G0U4%I94B7&7RSn)u=9#&`!z;b!cU6xTL?>+L zF?J<6+N(0k7j>foe9}cKm>Cc^!#gVCGL3jS!mjZ##1rZ2`~XCKq>zK8(WKhoCiod@ z9WJ(gOb9<~Ij)_K1^33c@0)2BF2}89=S3zF4W8b=m1=B>9lB-`t%$CsY@%y}dhCoU z5tj|yb_RFU%+Axo5YEwu-iYipTpu3Ulg^htVjL_uJv3eH0B@qt4&@@}oyHyN(VbH? z1Vez>?B`SH5ZhI4J4G|15F6ZvhbeTy=Yn~II0ugh%RnJL16@-rwpaK-(4yX#)__IK zCVVQq_*$TlUSigvV#kQ2P24MrB4GA@I?__-c#0Qz9R>7WwlE{OSna$xiricQW6NuTX> zf&p-oWBT=F;)^%(YXS-5#r7zBM~07!_vr$SNW>y{Mc)%>il-MpYT&YbEWsA<8yJzH zR{}r5HSIM^=@?uns0V_8uH}1V{Y{ZcbW&{!W&Ldp4mZq<)@#Cs!xU+-8lWVW5}rF=Uebr}*uB zBew|46vP7Rkzv$;nIn79Jtotb;o8^jFIr=6#Ku7~#NG4ZV4J)seblXeoM4d!cJGG{ zzj~F3(MTo<$vQ*CQ8x>{Bh5tp@}M!ZKGOclTM>^AWQqo&g*oFwyeicm-C_3)sY>Dn zYj!6LY~QxKxnY%Qp(*3>5Hy{1MTJOSF5AV=QoLurc@sz=)R@whck~u7oR)7oBWe^A z;#^wCa6QV9GlbB>R#o&;H|&mn2d_2!EhZ$o?b6^=JOtX>XW5*tyhdb->&)2o4GikV zFVK8x;VJ-kTnhDj9z>TSz52X&JI|NS{No!6tzdT?sNPE`iI@DH$T03B+&T^3$<@Ze z56T6m!FKpZwz*3%P@t8!X5oeBOvk`^WZ$QEFVD=;*ke`+6yjOWfy zU*77*c@HdmJj}Jt<-fK3OQy+|s0;(xG@LQ#^MtsD*tr|gP=WH|?_n;=u!=1~B{4fP z;AgO1M=?x{J`5qIVg)`>h+rnqOJ7GeJFd{-4?*>OE%H~*%6bR#utFZ8f0cth4Vm0+ z^GzT-0v`$NLJ5O}G~N+6^)LD6dV)j7o#+7`I8I44joQVDW0#~@e@pZShmBSnd0!#D z$GiwYOuO2qkS%XuC9#>pvkauI?(zQ!T9ryNW3M5vyJOvn*Sz@%@t)!j{P*oJ5|Tli zc?zuSNFv8|1+3W=&D;^8-qhL;OMeYDsLe+`gdXSa53zZz%WEvzpf zN;R>KGwUIK*$}$T(|#p7Uu3fyj=)io#SzO852~y9Jbe=;bAM-u}0AploQietgm~fXY=U0I z*2fHa^ag1e;T3>YauVA%Z93a5YNe$!65n|vBmbedl2zy25?jxau-t|rkmHeTO|Q-h z5P+BKepPLV@y0?|OeQ%#+D=r|HL1lcEKa?)z>-Kle^clLrG(YACv+_`9X{GORl@xxT z!N+zb3Z$gi?=(er@=cq!RG}K9$(|Lnk+VpHh%H+(`H}(gXOWmZOS7%qG-2g}b$tVw z6WHx-yn)t{GH(#|Kd}CBkjmcC&eK*2`4SaRqj%WbeQj#yv4t+th;r4m}bCBcy zJL&iAfMiE69M+l1)PlK}S8GqFK4Nyv;R&zfvB9>!j+?Y%1LrcJ_EqeaHtJv=yboom znoSJskgaQ&Vjioff<{-~@ELr|$m`E=nO?ao}mPs8K8(GRLjdKCcj{t_HtOEj8EQMPj^AW z|3FHwjWNBs!g_W%LX22ZqM1+lg?`F%ej>x5Rp)x?VUc+^W7I#vii%ip+owB~hM~D= zLREK1gkwyL<`%A94!-m{1eXmy1vY_l;fSy{zdtBmKvX2`s_#k0@X>|h);Masl6
JNyug3vyqhhER|pAj*U02oc)2ZROidDIFCSudrmp8 zMh1WFnB4;)jjx*F7@`<3^f8+L)F~g0Y`ejB$5Fo%j)^=cg1Pxn z&Snp0k7!c--;__*PLo(6pOM9cy1S^s*IAhlQCq5i+B$&G5{*RCiD~@xFh~$iyoz_z zvs#^QW~i8q{0`ky-8sNZ6vj)3vavSygH!+4pMm;j*lUf7o8b3fv$pI@MUC8=#Gvh=CDg7L6hn(D^t5SEmbw(6EDV zF9abbi}~Iip%>U=$Cbd$2BVNwe|q=wL}I*1K3Xii4v9IjynS^fJbog~(9X7BH6SQ+ zu$Di`Y_lmH@f9AC{&MUU{q)~@;%Hkt_ou~P`;vR3>w;PT#1GUcnHNp;X$HVv^WUzp z>G~zvlugb0(;8rI`|S*QR@O@Hz6FS1Ag z4T|hZ-j&h&^5nzhBuD@K{CI+vta9h1@QwQJuv%=WyD^`mi=+Ot?lz*Q$rjDn_7)wg z)~uyqZ>0P@53f)tQKW?nvS!!99UAVW%U|fB;_Q%xNXh*V!L{%g0*9rwD@paZB8)29 z#H=rLLZ(eYk?1PHyqOH&a6`?;iqO`KJcUOt`pA^PC`5d-c#C0cdsIWTZomIKibh8DZUZK*n;C>`BhcAv5UB7-V(4R`foCDiF9AM01 zolGBAHeRQ1h<3)()HRE`?*4NoA|aU-;cpmb1cv*5Z>BR@7&^^fCMWFgPwBG<(FCmz z(JhfW@&uj4+y*=2exzcEp@?yn+}Y7n6*M@zQf(Ux zw2G{CdhFb?RW7|PD+dF%n}GtxAGLItE8=P9|?F67>t53ZRlT?jI~~aNFL2kl1q+-XkJnZo)l-ZH)`c& z?hIc#;mQR-0}y|`=K(9|pK*(2GGoa$U#%4yZznrjrBqjMy;V_S3TyCR?-4j9O}r6J zF@FxbM5~!CS-Xwr`UC@{rzTe`g?`?o%cpLcIm)LkC*Q_DS_ykT)llsLIsc&*l{T~T zL-4Z^=dVE}kPl?5bb*@IT4sYzJSl1wLNQbb6;t|MM}H!RelCvBDO^3{&~7>)9{%K8 zVJR0BO#Si=#AxDo5{V)P{--fAx<8-9I^kD6wDec8Tsvo{h0oVqzBx6B$9S?HO#J>2Tm5ytgBW}G|V~UP&Qdr)Mi{ z(Degtf5L}bAh{XH-K@EK{!UxG=3y_sxuwZ}O1L~*tJ_Nfd?dhlMHWKP@T3h7>H@?7 z_M@+xKE8g~mb$+A!%|rrwpCSUirq@*Jr847d&c0ccA-=7;6LpJy~FUng-*p5Yz?}1 ziy(9@px{aeM-SpTsofIBxOs!%iqvF@m3&L#M+rKh02DT?(-~Dm(^kC^?c=v#q=xGd zg_EtMVoTa$&ta93*(y$^U;F7I$|XM7NLiUf_A)O~EosN4r5iu91U;@kvmz&>tDYnOLY41pi#j+JaHs7YCxX`YGf-^^no*R42YX@O5nnkU3-sxax+=F^wlQmaJQC3@5N;I;q>LE-^R}YD z+rit1|5UFuxgV;O%W;d1lzo6#a&nogGZQacmmw(+2h=>N6^*e2Vh5~Dw^7+FkMrpz zma!ce#7PI%0?)LO2kDG;HAUx0Vx`*pyKte{meGHW8}DLK5;UW21D$ti602s>y>=q~ zm21HSi>uneQ6HP2$?nVWg^+f1x~tIAcx|UHcoV#K;`sSiJ{^j8X{vNVyo(<6)4i9D=%TTe$UFpH@^b({}C0Z6zi}l0opX5&a(DWB5&jvp|ENgYQk7X7gXJ(f8RzbdT zK<{Gfy`E@DMEdYJIJ`FFMW@vk*am(diNg-Zsd5mZt8d!AidINY`O)jhI+T?IYXxsj zlCI?vS(#k;;cBUoj&w1q++kjyd({MJc_zBL(>F1uAn)2E)nl3xxuU z!w$~3DHuw6`T#_t2cm9KW#??sn1tU2ZL?*>UWIfws#!&rFA5pxTFz0^ZofjxC(OS4 zWO<<496pqCUFU({YQ{j5La0eQvl%rW%qDhawqDc4Wau+-+e>}Ir83%#W!FFNee|1Z zyKemjx;kt$H7wI7#BWb}r>zE4>sP7PEs5xHQ2IXgP_&rMWK6^Xgv~$q*+^@%=aT0I z%7t~qA|e`Hj=uXS?8)d;=`g|{N+^x%SUJ%E6g2-j3SxpsN>{D1{kia$9NIrQk(o^F zx8$Sg_J4Q&z%f+V2f6JJ@RyGB880rQLeQ?P;NAi}ccE1oB0g_cqpz6#u`AO_albFy zYa0PQt9&b^?CsX+WGc0ptJ#LF{T6%Pj+MhaaSf=iua8QjCif)hn`X21*RgbZR*UkA zF2ydNN2D&V+e070k0+BH-&OOGwslADB#I0ey@=$ZgdVs2g(+48R>6=fEC zB}&cI1`JHM&Hjcy8>@eO`KrZRZg>dfo)w!ytCYH^`k^$&)*o*jEVw-c9%ITRAg<&r zb5CHoTpkEz{W)zpVI$4PH_YF@w-67*mPjRf=kVDy^9*%0=KnOELz)7DOq)$fA!rP& zxW(z>w;N$@mH|PTRI~2miY#}T7tpKcJ*nLYQ z2g(;?aud_(IW^0Lz9;cY?FCZR%IvP}cJ<0J3{6xl!s&WZt<$BiPP=hFs-q0cvw%BcKQ(gvD=b*2)2soF! zDThuU&s?u}b9~x7>jVi2<6lc;GVbbQ zNKQ-?n#gAVrC11#Oe8=~N*bJ*nTc-##>dYOlv=7)ny5l4xw%zQ(b1#d=wvb&F4P;% zp{``piU}*UG=lY$VP6?5bkzx)G4z23d+Rqu(DnlmE{|;LD z`S~|w(r6A`F4xy$r5R&EBC1mFnJM8v38zM0omBWGq;n4Le_ov*WifTH$dHMLOV5w2=0 zvoSZVHUXMQ-Y)Oi`%jU|Ij zAlG~%+w5}g#I;JRG2Ey>JPEKrV2kBC5}*917%WC>(4%MsQaiiVEcw?0~`6f?ue=|&E;B~*CA&W($`WM3RYO|{& z9GQslZIbs&l}OP4ZKrk9yHfjPwuChVr&+t&{{7|N;`Q;W2S{j$vyfA{+%BhGZ~w;V z-{0OE1~Z7} zmbY}$uoy@he)iG;ItV&4nib4p2umB=;kB#FQpX*-xS3y~TARMrU?5(1@!OH}bI3)v z-{+NC5q%EzK$}J%mjVr4Fz4n=z^4!Uu=3x58$@ay3EgXlO*zBUyRK5(%Mg~VH11J0 zPw!tUhVPB9o+948;~YY;|{je!R-%@nxY?e!u=V#t6aW_u@J` zJNtCqkL(6`mB-QK4>k}oGBSt#`Y{nE<{^jA!+B_b1Ty8|z`#$y5oc@kc&`9EbYEw) z+l%UygyyY1R}wq$8o1mkGNX9**Xjw z5qEw+%OdXt^Xpf)fZ3nYJF@9?+>UQgH!&r$8AzunV-m+vSV>Z}3ye_ldW9O9t2FhfyWBjju zXj(3qMuTa-PJ92fTX{YHULp&5J!Eqa$QLp@QzGiWnP__d6vU9MCag*e&{i*JVGwwv zGy*SgGmA|$L)!3 zzgLbtHY??)&-blQJGe*3E6$`{pz@!~7p~^N%12qc#+!PMaMjY6`v9Zyvoi^go-#nskrUra;jYcn&j=^)GDInkb z(Yx_Hoo!jhY`VOg7yYQJkIiYdwTNi`bI|gQsW%16jqc2K`{+zKEjsMnR0;DIGtY^} z39=5zDEON<0|R1{x!j`9|IEGU*aJ)TyS(i|v>G*RFT&5SS3T$;>!q3>^laN@`ToD{ z&OJdu;7;BQ^LhQ-FK%mV`#C*59T@xH&fx`s7?@9^)j&`YX9x6SPRzhXA(Q%-_H2Og zfWlT-No+ZMj)Y&cMjmb&Z+YL4w_?>NxMXbd_I&#Eze2PZq)^(m6sw`XA#+<=h;Xa} ziE=|(`+eEoLFJ#kwe}^w1-|%xv#0%5J>6iy)E}K=S1!Kkjjbv7GH!M+ELshi{cY4+ zjhD41s=~;3bcvCK$)Hn=F+$180gQU&+6H^R{Bc zr7xJXWaEjGC`N>bzXid-z&J`O1g`f42rk`C>a^OI7>ZT>EGelqscXxN| zlaP=E0amj8!CaP;lf$uBmJeL5t*sgLCOCgkH!IfL5X<)_heZAp4Dg{cYixn5IO&?m zyPP^5j*|1E~xxcqm5W15{=VWW;<-Oc(sxVfJOrRQOg%c+$6K(u7-4x zu+WG)0OIt2--TGSWygk`fok--vXgp!`PPzVqsgwg_a*U?Mt}Z$@^^p-*7Oab|#^vq_rA6 zDO2y?>{joLV9^O++T!g1sCH3lx{Nx8(+`2#pDkN&?vt z6fMygbwyYGl4(tiyVcd-ZZ=!@XGQ!e2XEoS6Bi(9Gv9 z)NH3ho}<*hfh|2^73*gq$e|rnpN*4(x1BZhRQymaVx_v&(Ch4DY=06}Afhjatv5Hh zh&`+(t}Y@14tTn!r>Wqe!&(bHq9IU>NGv%>#^HWlZnT){U0&8CID|)O92g%-p)5WF zpr{6@LbwtbgC+Cr?1?mZ5ZU3C0AB!@sH*gVj_>sko?SIFC zcoxH=GPh|nRKbqb?lk8#VLx%O8A2|ZlNb`{>nRB61V?gIkXd}RP1ZLE&~FIQ&igf3 zb6AE(;f{gE)>~rtehCyH)N`g^?VS22nR141Yt)%e?=*POw>O-i(&O)kM8G5F>Dl&; zoqfUY?s&%P_2FW!MyHkGz9d8cpFMylN&G$!;}!5G0~(p|EusC^c+KpOj!@@_()VCm&$>Ivas7r) zim!hS<~Hpj?-X4K4^T)Q@CyvuthlC`i8%HLKS?^3E&|bnytWa?YbW*LmXkl`HmRJ| zFBZDM`8%R`4+e&RA>cn?opI=b7bq5B-R?jXomNArNEjTm>#^cQBr4hZ`uf0uD*&{xKv60K z#QXk9S^fiopug|-_MedVkl^6;!-*V^9v~af;0WJ8UTrDFL`TcWIGCi!|K#($CO#O7 z!-EB`m&-jlW*6X5NqStak08XacY59aAmsOctM|CtjD-72g8|ssXD^T6hoe%Z?0Z;w zd3h!*`nR_?U_J8=f%Og#Mz??aBU|F);(9QMi1b_KO2sWeTvi+HD-?>=b;w51)&+Q% zbU8uSB!0cU0~eV#Z8Cc%^c)G^^Nal30`UZWY#SzD2#8`4au&fAaAHTESioE%Idqs6 z?Ayrvj~D}UZOph=AYFx0UF)#k1Je!>eBCYGy7NEDLI2}J=C{n{0jU0yS!;m;olFnV2G z2+?eA<3AYP{~By;;IHGA#q4m!YD3)uFgF43n=^$ExXFo`GR>Gaa_JN0fUeihrUPxe zHZLq1m^5RI-P&Wxt8#VSCsedQH=4xOz_mbPpseYA=GP?ni^d`y8S|vv^{xOR^E%`J z-gvLyDy&741LYfXy_tpna|RBz-&~S1%^orTGxE@JW)&u*OY85^7n7WMZrS(Oe>4%ynay+rWhs!1LHzNZQZvv)s2Q!TK^l#k) zhkE$`r^;&N6S$IJlNB*mS6NdK5FEJRCEcq~9_;IU53f(;zjr)qF@xk!D{z$-lu2hA zCb7=;c}&3;FsGb~-x%zIj{ik;e6}~4dm`WFZVQ6dh;X{jC;V?h2_WgnF8?XU+g=P7 z2pA#N(=#&Y#+w{w4Bz6b0OaCl&AFUrdm!I1cQiP0Loc(j#6{l(HUn)W!`aEv0Vo=u5BMs z3|(vlq?pl?HN<&cGeso`a3?-{?>>dA{=zqH*^zOfkoj?xv!kHVaB`Dg9rtr4Ce9NgM$)a+&gdG&U}%-@En# zC&WyO84&kK-5TRC{f&2@m-JltM_%PiGD$EtJ23oxeWz7$(uwt3kWMSQlgE_Ox!*mz1fvICJG+DJ5?#V{che{#lunUTQMXrdOqz|2lh` z=>PTUbgvWxPPJuI&EK&wldgGKgnO35q^+|J{D@($pogz5o6ZT66ylnvk97|W0kT_l zyrBwd8%J}~V!(Y}-1AN%6MG4V6T?3?=?s?C4motKbA(tfd=Wʰwa=uDdBFr# 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
  • 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

    y5BGLGk=jwt+zfzgxINr)LN`z>#nJR8y+vq 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 bR{2*UB7Ib33c8=;0QixXP!KN_)${!yjp~W# literal 0 HcmV?d00001 diff --git a/include/libwebsockets/lws-context-vhost.h b/include/libwebsockets/lws-context-vhost.h index 2ea966f63..0c91ebe78 100644 --- a/include/libwebsockets/lws-context-vhost.h +++ b/include/libwebsockets/lws-context-vhost.h @@ -1229,6 +1229,19 @@ lws_context_user(struct lws_context *context); LWS_VISIBLE LWS_EXTERN const char * lws_vh_tag(struct lws_vhost *vh); +LWS_VISIBLE LWS_EXTERN void +_lws_context_info_defaults(struct lws_context_creation_info *info, + const char *sspol); + +LWS_VISIBLE LWS_EXTERN void +lws_default_loop_exit(struct lws_context *cx); + +LWS_VISIBLE LWS_EXTERN void +lws_context_default_loop_run_destroy(struct lws_context *cx); + +LWS_VISIBLE LWS_EXTERN int +lws_cmdline_passfail(int argc, const char **argv, int actual); + /** * lws_context_is_being_destroyed() - find out if context is being destroyed * diff --git a/include/libwebsockets/lws-misc.h b/include/libwebsockets/lws-misc.h index 58217e886..2a721421d 100644 --- a/include/libwebsockets/lws-misc.h +++ b/include/libwebsockets/lws-misc.h @@ -886,7 +886,7 @@ LWS_VISIBLE extern const lws_humanize_unit_t humanize_schema_us[8]; void lws_assert_fourcc(uint32_t fourcc, uint32_t expected); #else -#define lws_assert_fourcc(_a, _b) +#define lws_assert_fourcc(_a, _b) do { } while (0); #endif /** diff --git a/include/libwebsockets/lws-secure-streams-client.h b/include/libwebsockets/lws-secure-streams-client.h index 361b980ed..3683d70f9 100644 --- a/include/libwebsockets/lws-secure-streams-client.h +++ b/include/libwebsockets/lws-secure-streams-client.h @@ -66,6 +66,7 @@ struct lws_sspc_handle; #define lws_ss_to_user_object lws_sspc_to_user_object #define lws_ss_change_handlers lws_sspc_change_handlers #define lws_smd_ss_rx_forward lws_smd_sspc_rx_forward +#define lws_ss_server_ack lws_sspc_server_ack #define lws_ss_tag lws_sspc_tag #define _lws_fi_user_ss_fi _lws_fi_user_sspc_fi #define lwsl_ss_get_cx lwsl_sspc_get_cx @@ -349,6 +350,9 @@ LWS_VISIBLE LWS_EXTERN void lws_sspc_change_handlers(struct lws_sspc_handle *h, lws_sscb_rx rx,lws_sscb_tx tx, lws_sscb_state state); +LWS_VISIBLE LWS_EXTERN void +lws_sspc_server_ack(struct lws_sspc_handle *h, int nack); + /* * Helpers offered by lws to handle transport SSPC-side proxy link events diff --git a/include/libwebsockets/lws-secure-streams.h b/include/libwebsockets/lws-secure-streams.h index 4a0aa4448..39fc50e4e 100644 --- a/include/libwebsockets/lws-secure-streams.h +++ b/include/libwebsockets/lws-secure-streams.h @@ -248,6 +248,28 @@ typedef struct lws_ss_info { } lws_ss_info_t; +#define LWS_SS_USER_TYPEDEF \ + typedef struct { \ + struct lws_ss_handle *ss; \ + void *opaque_data; + +#define LWS_SS_INFO(_streamtype, _type) \ + const lws_ss_info_t ssi_##_type = { \ + .handle_offset = offsetof(_type, ss), \ + .opaque_user_data_offset = offsetof(_type, opaque_data), \ + .user_alloc = sizeof(_type), \ + .streamtype = _streamtype, + +#define lws_ss_from_user(_u) (_u)->ss +#define lws_ss_opaque_from_user(_u) (_u)->opaque_data +#define lws_ss_cx_from_user(_u) lws_ss_get_context((_u)->ss) + +#if defined(LWS_SS_USE_SSPC) +#define lws_context_info_defaults(_x, _y) _lws_context_info_defaults(_x, NULL) +#else +#define lws_context_info_defaults(_x, _y) _lws_context_info_defaults(_x, _y) +#endif + /** * lws_ss_create() - Create secure stream * diff --git a/lib/core-net/vhost.c b/lib/core-net/vhost.c index 562607c78..1741f700e 100644 --- a/lib/core-net/vhost.c +++ b/lib/core-net/vhost.c @@ -690,10 +690,10 @@ lws_create_vhost(struct lws_context *context, if (!pcols) { for (vh->count_protocols = 0; info->pprotocols[vh->count_protocols]; - vh->count_protocols++) { - lwsl_user("%s: ppcols: %s\n", __func__, - info->pprotocols[vh->count_protocols]->name); - } + vh->count_protocols++) + ; + //lwsl_user("%s: ppcols: %s\n", __func__, + // info->pprotocols[vh->count_protocols]->name); } else for (vh->count_protocols = 0; pcols[vh->count_protocols].callback; diff --git a/lib/core/libwebsockets.c b/lib/core/libwebsockets.c index 958d843f7..0fd5a8f91 100644 --- a/lib/core/libwebsockets.c +++ b/lib/core/libwebsockets.c @@ -1399,7 +1399,10 @@ static const char * const builtins[] = { "-d", "--fault-injection", "--fault-seed", - "--ignore-sigterm" + "--ignore-sigterm", + "--ssproxy-port", + "--ssproxy-iface", + "--ssproxy-ads", }; enum opts { @@ -1407,6 +1410,9 @@ enum opts { OPT_FAULTINJECTION, OPT_FAULT_SEED, OPT_IGNORE_SIGTERM, + OPT_SSPROXY_PORT, + OPT_SSPROXY_IFACE, + OPT_SSPROXY_ADS, }; #if !defined(LWS_PLAT_FREERTOS) @@ -1416,6 +1422,72 @@ lws_sigterm_catch(int sig) } #endif +void +_lws_context_info_defaults(struct lws_context_creation_info *info, + const char *sspol) +{ + memset(info, 0, sizeof *info); + info->fd_limit_per_thread = 1 + 6 + 1; +#if defined(LWS_WITH_NETWORK) + info->port = CONTEXT_PORT_NO_LISTEN; +#endif +#if defined(LWS_WITH_SECURE_STREAMS) && !defined(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY) + info->pss_policies_json = sspol; +#endif +#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API) + if (!sspol) + info->protocols = lws_sspc_protocols; + else +#endif + info->options = LWS_SERVER_OPTION_EXPLICIT_VHOSTS | + LWS_SERVER_OPTION_H2_JUST_FIX_WINDOW_UPDATE_OVERFLOW | + LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; +} + +void +lws_default_loop_exit(struct lws_context *cx) +{ + if (cx) { + cx->interrupted = 1; +#if defined(LWS_WITH_NETWORK) + lws_cancel_service(cx); +#endif + } +} + +#if defined(LWS_WITH_NETWORK) +void +lws_context_default_loop_run_destroy(struct lws_context *cx) +{ + /* the default event loop, since we didn't provide an alternative one */ + + while (!cx->interrupted && lws_service(cx, 0) >= 0) + ; + + lws_context_destroy(cx); +} +#endif + +int +lws_cmdline_passfail(int argc, const char **argv, int actual) +{ + int expected = 0; + const char *p; + + if ((p = lws_cmdline_option(argc, argv, "--expected-exit"))) + expected = atoi(p); + + if (actual == expected) { + lwsl_user("Completed: OK (seen expected %d)\n", actual); + + return 0; + } + + lwsl_err("Completed: failed: exit %d, expected %d\n", actual, expected); + + return 1; +} + void lws_cmdline_option_handle_builtin(int argc, const char **argv, struct lws_context_creation_info *info) @@ -1438,6 +1510,25 @@ lws_cmdline_option_handle_builtin(int argc, const char **argv, logs = m; break; +#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API) + case OPT_SSPROXY_PORT: + /* connect to ssproxy via UDS by default, else via + * tcp connection to this port */ + info->ss_proxy_port = (uint16_t)atoi(p); + break; + + case OPT_SSPROXY_IFACE: + /* UDS "proxy.ss.lws" in abstract namespace, else this socket + * path; when -p given this can specify the network interface + * to bind to */ + info->ss_proxy_bind = p; + break; + + case OPT_SSPROXY_ADS: + info->ss_proxy_address = p; + break; +#endif + case OPT_FAULTINJECTION: #if !defined(LWS_WITH_SYS_FAULT_INJECTION) lwsl_err("%s: FAULT_INJECTION not built\n", __func__); diff --git a/lib/core/private-lib-core.h b/lib/core/private-lib-core.h index 71ed78038..1914190f7 100644 --- a/lib/core/private-lib-core.h +++ b/lib/core/private-lib-core.h @@ -735,6 +735,7 @@ struct lws_context { char tls_gate_accepts; unsigned int deprecated:1; + unsigned int interrupted:1; unsigned int inside_context_destroy:1; unsigned int being_destroyed:1; unsigned int service_no_longer_possible:1; diff --git a/lib/secure-streams/policy-json.c b/lib/secure-streams/policy-json.c index 3427ae6d4..cf742a2a5 100644 --- a/lib/secure-streams/policy-json.c +++ b/lib/secure-streams/policy-json.c @@ -395,6 +395,7 @@ lws_ss_policy_parser_cb(struct lejp_ctx *ctx, char reason) * The struct *x is in the lwsac... the ca_der it points to * is individually allocated from the heap */ + a->curr[LTY_X509].x->ca_der = lws_malloc((unsigned int)a->count, "ssx509"); if (!a->curr[LTY_X509].x->ca_der) goto oom; @@ -1168,7 +1169,7 @@ lws_ss_policy_parse_abandon(struct lws_context *context) { struct policy_cb_args *args = (struct policy_cb_args *)context->pol_args; lws_ss_x509_t *x; - +lwsl_notice("%s\n", __func__); x = args->heads[LTY_X509].x; while (x) { /* @@ -1206,8 +1207,10 @@ lws_ss_policy_parse_file(struct lws_context *cx, const char *filepath) uint8_t buf[512]; int n, m, fd = lws_open(filepath, LWS_O_RDONLY); - if (fd < 0) + if (fd < 0) { + lwsl_cx_err(cx, "Unable to open policy '%s'", filepath); return LEJP_REJECT_UNKNOWN; + } do { n = (int)read(fd, buf, sizeof(buf)); diff --git a/lib/secure-streams/protocols/ss-h1.c b/lib/secure-streams/protocols/ss-h1.c index 73cc25629..9d8e644d8 100644 --- a/lib/secure-streams/protocols/ss-h1.c +++ b/lib/secure-streams/protocols/ss-h1.c @@ -549,7 +549,7 @@ secstream_h1(struct lws *wsi, enum lws_callback_reasons reason, void *user, if (h->ss_dangling_connected) { /* already disconnected, no action for DISCONNECT_ME */ r = lws_ss_event_helper(h, LWSSSCS_DISCONNECTED); - if (r != LWSSSSRET_OK) + if (r == LWSSSSRET_DESTROY_ME) return _lws_ss_handle_state_ret_CAN_DESTROY_HANDLE(r, wsi, &h); } break; @@ -919,7 +919,7 @@ malformed: case LWS_CALLBACK_CLIENT_HTTP_WRITEABLE: if (!h || !h->info.tx) { - lwsl_notice("%s: no handle / tx\n", __func__); + lwsl_debug("%s: no handle / tx\n", __func__); return 0; } diff --git a/lib/secure-streams/secure-streams.c b/lib/secure-streams/secure-streams.c index 4f25a8a51..6bf1964ff 100644 --- a/lib/secure-streams/secure-streams.c +++ b/lib/secure-streams/secure-streams.c @@ -433,6 +433,7 @@ lws_ss_event_helper(lws_ss_handle_t *h, lws_ss_constate_t cs) cs == LWSSSCS_UNREACHABLE && h->wsi && h->wsi->dns_reachability); h->h_in_svc = NULL; + #if defined(LWS_WITH_SERVER) if ((h->info.flags & LWSSSINFLAGS_ACCEPTED) && cs == LWSSSCS_DISCONNECTED) @@ -1502,7 +1503,7 @@ lws_ss_destroy(lws_ss_handle_t **ppss) #endif #if defined(LWS_WITH_SERVER) - if (v) + if (v && (h->info.flags & LWSSSINFLAGS_SERVER)) /* * For server, the policy describes a vhost that implements the * server, when we take down the ss, we take down the related diff --git a/lib/secure-streams/serialized/client/sspc-transport.c b/lib/secure-streams/serialized/client/sspc-transport.c index 9fe4b34e3..a689b8974 100644 --- a/lib/secure-streams/serialized/client/sspc-transport.c +++ b/lib/secure-streams/serialized/client/sspc-transport.c @@ -173,9 +173,6 @@ lws_sspc_txp_event_closed(lws_transport_priv_t priv) lws_sspc_handle_t *h = (lws_sspc_handle_t *)priv; lws_ss_state_return_t r = LWSSSSRET_OK; - - lwsl_sspc_notice(h, "entry"); - if (!h) { lwsl_sspc_info(h, "No sspc on client proxy link close"); return LWSSSSRET_OK; @@ -275,7 +272,7 @@ lws_sspc_txp_tx(lws_sspc_handle_t *h, size_t metadata_limit) * We are negotating the opening of a particular * streamtype */ - lwsl_sspc_notice(h, "LPCSCLI_SENDING_INITIAL_TX"); + // lwsl_sspc_notice(h, "LPCSCLI_SENDING_INITIAL_TX"); txl = strlen(h->ssi.streamtype) + 1 + 4 + 4; cp = s; @@ -297,7 +294,7 @@ lws_sspc_txp_tx(lws_sspc_handle_t *h, size_t metadata_limit) case LPCSCLI_LOCAL_CONNECTED: - lwsl_sspc_notice(h, "LPCSCLI_LOCAL_CONNECTED"); + // lwsl_sspc_notice(h, "LPCSCLI_LOCAL_CONNECTED"); /* * Do we need to prioritize sending any metadata diff --git a/lib/secure-streams/serialized/client/sspc.c b/lib/secure-streams/serialized/client/sspc.c index 1f454ec28..8586615c9 100644 --- a/lib/secure-streams/serialized/client/sspc.c +++ b/lib/secure-streams/serialized/client/sspc.c @@ -339,8 +339,8 @@ lws_sspc_create(struct lws_context *context, int tsi, const lws_ss_info_t *ssi, /* priv_onw filled in by onw transport */ - lwsl_sspc_notice(h, "txp path %s -> %s", h->txp_path.ops_in->name, - h->txp_path.ops_onw->name); + lwsl_sspc_info(h, "txp path %s -> %s", h->txp_path.ops_in->name, + h->txp_path.ops_onw->name); memcpy(&h->ssi, ssi, sizeof(*ssi)); ua = (uint8_t *)&h[1]; @@ -502,7 +502,7 @@ lws_sspc_request_tx(lws_sspc_handle_t *h) if (!h->us_earliest_write_req) h->us_earliest_write_req = lws_now_usecs(); - lwsl_notice("%s: state %u, conn_req_state %u\n", __func__, + lwsl_info("%s: state %u, conn_req_state %u\n", __func__, (unsigned int)h->state, (unsigned int)h->conn_req_state); @@ -697,6 +697,14 @@ _lws_sspc_set_metadata(struct lws_sspc_handle *h, const char *name, return 0; } +void +lws_sspc_server_ack(struct lws_sspc_handle *h, int nack) +{ + //h->txn_resp = nack; + //h->txn_resp_set = 1; + +} + int lws_sspc_set_metadata(struct lws_sspc_handle *h, const char *name, const void *value, size_t len) diff --git a/lib/tls/tls-network.c b/lib/tls/tls-network.c index b2038d537..8c9448fc1 100644 --- a/lib/tls/tls-network.c +++ b/lib/tls/tls-network.c @@ -201,11 +201,11 @@ lws_gate_accepts(struct lws_context *context, int on) { struct lws_vhost *v = context->vhost_list; - lwsl_notice("%s: on = %d\n", __func__, on); - if (context->tls_gate_accepts == (char)on) return 0; + lwsl_notice("%s: on = %d\n", __func__, on); + context->tls_gate_accepts = (char)on; while (v) { diff --git a/minimal-examples-lowlevel/CMakeLists.txt b/minimal-examples-lowlevel/CMakeLists.txt new file mode 100644 index 000000000..54696b5c8 --- /dev/null +++ b/minimal-examples-lowlevel/CMakeLists.txt @@ -0,0 +1,50 @@ +# +# libwebsockets - small server side websockets and web server implementation +# +# Copyright (C) 2010 - 2021 Andy Green +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. + +MACRO(SUBDIRLIST result curdir) + FILE(GLOB children RELATIVE ${curdir} ${curdir}/*) + SET(dirlist "") + + FOREACH(child ${children}) + IF (IS_DIRECTORY ${curdir}/${child}) + LIST(APPEND dirlist ${child}) + ENDIF() + ENDFOREACH() + + SET(${result} ${dirlist}) +ENDMACRO() + +include_directories(${LWS_LIB_BUILD_INC_PATHS}) +link_libraries(${LIB_LIST_AT_END}) + +SUBDIRLIST(SUBDIRS "${PROJECT_SOURCE_DIR}/minimal-examples-lowlevel") +FOREACH(subdir ${SUBDIRS}) + + SUBDIRLIST(SUBDIRS2 "${PROJECT_SOURCE_DIR}/minimal-examples-lowlevel/${subdir}") + FOREACH(subdir2 ${SUBDIRS2}) + if (EXISTS "${PROJECT_SOURCE_DIR}/minimal-examples-lowlevel/${subdir}/${subdir2}/CMakeLists.txt") + message("Processing ${PROJECT_SOURCE_DIR}/minimal-examples-lowlevel/${subdir}/${subdir2}") + add_subdirectory("${PROJECT_SOURCE_DIR}/minimal-examples-lowlevel/${subdir}/${subdir2}") + endif() + ENDFOREACH() +ENDFOREACH() diff --git a/minimal-examples-lowlevel/README.md b/minimal-examples-lowlevel/README.md new file mode 100644 index 000000000..97d988131 --- /dev/null +++ b/minimal-examples-lowlevel/README.md @@ -0,0 +1,100 @@ +## minimal-examples-lowlevel + +These are the traditional lws low-level, wsi-based examples. + +`./minimal-examples` contains higher-level, Secure Stream based examples for a +growing subset of these cases. New users may find it easier to use those higher- +level examples for the (common) cases they cover. + +These lowlevel apis are not going anywhere, the higher level stuff uses them +to get stuff done itself. + +|name|demonstrates| +---|--- +client-server|Minimal examples providing client and server connections simultaneously +crypto|Minimal examples related to using lws crypto apis +dbus-server|Minimal examples showing how to integrate DBUS into lws event loop +http-client|Minimal examples providing an http client +http-server|Minimal examples providing an http server +raw|Minimal examples related to adopting raw file or socket descriptors into the event loop +secure-streams|Minimal examples related to the Secure Streams client api +ws-client|Minimal examples providing a ws client +ws-server|Minimal examples providing a ws server (and an http server) + +## FAQ + +### Getting started + +Build and install lws itself first (note that after installing lws on \*nix, you need to run `ldconfig` one time so the OS can learn about the new library. Lws installs in `/usr/local` by default, Debian / Ubuntu ldconfig knows to look there already, but Fedora / CentOS need you to add the line `/usr/local/lib` to `/etc/ld.so.conf` and run ldconfig) + +Then start with the simplest: + +`http-server/minimal-http-server` + +### Why are most of the sources split into a main C file file and a protocol file? + +Lws supports three ways to implement the protocol callback code: + + - you can just add it all in the same source file + + - you can separate it as these examples do, and #include it + into the main sources + + - you can build it as a standalone plugin that is discovered + and loaded at runtime. + +The way these examples are structured, you can easily also build +the protocol callback as a plugin just with a different +CMakeLists.txt... see https://github.com/warmcat/libwebsockets/tree/master/plugin-standalone +for an example. + +### Why would we want the protocol as a plugin? + +You will notice a lot of the main C code is the same boilerplate +repeated for each example. The actual interesting part is in +the protocol callback only. + +Lws provides (-DLWS_WITH_LWSWS=1) a generic lightweight server app called 'lwsws' that +can be configured by JSON. Combined with your protocol as a plugin, +it means you don't actually have to make a special server "app" +part, you can just use lwsws and pass per-vhost configuration +from JSON into your protocol. (Of course in some cases you have +an existing app you are bolting lws on to, then you don't care +about this for that particular case). + +Because lwsws has no dependency on whatever your plugin does, it +can mix and match different protocols randomly without needing any code +changes. It reduces the size of the task to just writing the +code you care about in your protocol handler, and nothing else to write +or maintain. + +Lwsws supports advanced features like reload, where it starts a new server +instance with changed config or different plugins, while keeping the old +instance around until the last connection to it closes. + +### I get why there is a pss, but why is there a vhd? + +The pss is instantiated per-connection. But there are almost always +other variables that have a lifetime longer than a single connection. + +You could make these variables "filescope" one-time globals, but that +means your protocol cannot instantiate multiple times. + +Lws supports vhosts (virtual hosts), for example both https://warmcat.com +and https://libwebsockets are running on the same lwsws instance on the +same server and same IP... each of these is a separate vhost. + +Your protocol may be enabled on multiple vhosts, each of these vhosts +provides a different vhd specific to the protocol instance on that +vhost. For example many of the samples keep a linked-list head to +a list of live pss in the vhd... that means it's cleanly a list of +pss opened **on that vhost**. If another vhost has the protocol +enabled, connections to that will point to a different vhd, and the +linked-list head on that vhd will only list connections to his vhost. + +The example "ws-server/minimal-ws-server-threads" demonstrates how to deliver +external configuration data to a specific vhost + protocol +combination using code. In lwsws, this is simply a matter of setting +the desired JSON config. + + diff --git a/minimal-examples/abstract/protocols/smtp-client/CMakeLists.txt b/minimal-examples-lowlevel/abstract/protocols/smtp-client/CMakeLists.txt similarity index 100% rename from minimal-examples/abstract/protocols/smtp-client/CMakeLists.txt rename to minimal-examples-lowlevel/abstract/protocols/smtp-client/CMakeLists.txt diff --git a/minimal-examples/abstract/protocols/smtp-client/README.md b/minimal-examples-lowlevel/abstract/protocols/smtp-client/README.md similarity index 100% rename from minimal-examples/abstract/protocols/smtp-client/README.md rename to minimal-examples-lowlevel/abstract/protocols/smtp-client/README.md diff --git a/minimal-examples/abstract/protocols/smtp-client/main.c b/minimal-examples-lowlevel/abstract/protocols/smtp-client/main.c similarity index 100% rename from minimal-examples/abstract/protocols/smtp-client/main.c rename to minimal-examples-lowlevel/abstract/protocols/smtp-client/main.c diff --git a/minimal-examples/api-tests/README.md b/minimal-examples-lowlevel/api-tests/README.md similarity index 100% rename from minimal-examples/api-tests/README.md rename to minimal-examples-lowlevel/api-tests/README.md diff --git a/minimal-examples/api-tests/api-test-async-dns/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-async-dns/CMakeLists.txt similarity index 89% rename from minimal-examples/api-tests/api-test-async-dns/CMakeLists.txt rename to minimal-examples-lowlevel/api-tests/api-test-async-dns/CMakeLists.txt index 256726ca1..6deade98c 100644 --- a/minimal-examples/api-tests/api-test-async-dns/CMakeLists.txt +++ b/minimal-examples-lowlevel/api-tests/api-test-async-dns/CMakeLists.txt @@ -18,7 +18,7 @@ if (requirements) add_test(NAME api-test-async-dns COMMAND lws-api-test-async-dns) set_tests_properties(api-test-async-dns PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/api-tests/api-test-async-dns + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/api-tests/api-test-async-dns TIMEOUT 60) if (websockets_shared) diff --git a/minimal-examples/api-tests/api-test-async-dns/main.c b/minimal-examples-lowlevel/api-tests/api-test-async-dns/main.c similarity index 100% rename from minimal-examples/api-tests/api-test-async-dns/main.c rename to minimal-examples-lowlevel/api-tests/api-test-async-dns/main.c diff --git a/minimal-examples/api-tests/api-test-cose/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-cose/CMakeLists.txt similarity index 100% rename from minimal-examples/api-tests/api-test-cose/CMakeLists.txt rename to minimal-examples-lowlevel/api-tests/api-test-cose/CMakeLists.txt diff --git a/minimal-examples/api-tests/api-test-cose/README.md b/minimal-examples-lowlevel/api-tests/api-test-cose/README.md similarity index 100% rename from minimal-examples/api-tests/api-test-cose/README.md rename to minimal-examples-lowlevel/api-tests/api-test-cose/README.md diff --git a/minimal-examples/api-tests/api-test-cose/keys.c b/minimal-examples-lowlevel/api-tests/api-test-cose/keys.c similarity index 100% rename from minimal-examples/api-tests/api-test-cose/keys.c rename to minimal-examples-lowlevel/api-tests/api-test-cose/keys.c diff --git a/minimal-examples/api-tests/api-test-cose/main.c b/minimal-examples-lowlevel/api-tests/api-test-cose/main.c similarity index 100% rename from minimal-examples/api-tests/api-test-cose/main.c rename to minimal-examples-lowlevel/api-tests/api-test-cose/main.c diff --git a/minimal-examples/api-tests/api-test-cose/sign.c b/minimal-examples-lowlevel/api-tests/api-test-cose/sign.c similarity index 100% rename from minimal-examples/api-tests/api-test-cose/sign.c rename to minimal-examples-lowlevel/api-tests/api-test-cose/sign.c diff --git a/minimal-examples/api-tests/api-test-dhcpc/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-dhcpc/CMakeLists.txt similarity index 100% rename from minimal-examples/api-tests/api-test-dhcpc/CMakeLists.txt rename to minimal-examples-lowlevel/api-tests/api-test-dhcpc/CMakeLists.txt diff --git a/minimal-examples/api-tests/api-test-dhcpc/README.md b/minimal-examples-lowlevel/api-tests/api-test-dhcpc/README.md similarity index 100% rename from minimal-examples/api-tests/api-test-dhcpc/README.md rename to minimal-examples-lowlevel/api-tests/api-test-dhcpc/README.md diff --git a/minimal-examples/api-tests/api-test-dhcpc/main.c b/minimal-examples-lowlevel/api-tests/api-test-dhcpc/main.c similarity index 100% rename from minimal-examples/api-tests/api-test-dhcpc/main.c rename to minimal-examples-lowlevel/api-tests/api-test-dhcpc/main.c diff --git a/minimal-examples/api-tests/api-test-fts/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-fts/CMakeLists.txt similarity index 100% rename from minimal-examples/api-tests/api-test-fts/CMakeLists.txt rename to minimal-examples-lowlevel/api-tests/api-test-fts/CMakeLists.txt diff --git a/minimal-examples/api-tests/api-test-fts/README.md b/minimal-examples-lowlevel/api-tests/api-test-fts/README.md similarity index 100% rename from minimal-examples/api-tests/api-test-fts/README.md rename to minimal-examples-lowlevel/api-tests/api-test-fts/README.md diff --git a/minimal-examples/api-tests/api-test-fts/canned-1.txt b/minimal-examples-lowlevel/api-tests/api-test-fts/canned-1.txt similarity index 100% rename from minimal-examples/api-tests/api-test-fts/canned-1.txt rename to minimal-examples-lowlevel/api-tests/api-test-fts/canned-1.txt diff --git a/minimal-examples/api-tests/api-test-fts/canned-2.txt b/minimal-examples-lowlevel/api-tests/api-test-fts/canned-2.txt similarity index 100% rename from minimal-examples/api-tests/api-test-fts/canned-2.txt rename to minimal-examples-lowlevel/api-tests/api-test-fts/canned-2.txt diff --git a/minimal-examples/api-tests/api-test-fts/les-mis-utf8.txt b/minimal-examples-lowlevel/api-tests/api-test-fts/les-mis-utf8.txt similarity index 100% rename from minimal-examples/api-tests/api-test-fts/les-mis-utf8.txt rename to minimal-examples-lowlevel/api-tests/api-test-fts/les-mis-utf8.txt diff --git a/minimal-examples/api-tests/api-test-fts/main.c b/minimal-examples-lowlevel/api-tests/api-test-fts/main.c similarity index 100% rename from minimal-examples/api-tests/api-test-fts/main.c rename to minimal-examples-lowlevel/api-tests/api-test-fts/main.c diff --git a/minimal-examples/api-tests/api-test-fts/the-picture-of-dorian-gray.txt b/minimal-examples-lowlevel/api-tests/api-test-fts/the-picture-of-dorian-gray.txt similarity index 100% rename from minimal-examples/api-tests/api-test-fts/the-picture-of-dorian-gray.txt rename to minimal-examples-lowlevel/api-tests/api-test-fts/the-picture-of-dorian-gray.txt diff --git a/minimal-examples/api-tests/api-test-gencrypto/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-gencrypto/CMakeLists.txt similarity index 100% rename from minimal-examples/api-tests/api-test-gencrypto/CMakeLists.txt rename to minimal-examples-lowlevel/api-tests/api-test-gencrypto/CMakeLists.txt diff --git a/minimal-examples/api-tests/api-test-gencrypto/README.md b/minimal-examples-lowlevel/api-tests/api-test-gencrypto/README.md similarity index 100% rename from minimal-examples/api-tests/api-test-gencrypto/README.md rename to minimal-examples-lowlevel/api-tests/api-test-gencrypto/README.md diff --git a/minimal-examples/api-tests/api-test-gencrypto/lws-genaes.c b/minimal-examples-lowlevel/api-tests/api-test-gencrypto/lws-genaes.c similarity index 100% rename from minimal-examples/api-tests/api-test-gencrypto/lws-genaes.c rename to minimal-examples-lowlevel/api-tests/api-test-gencrypto/lws-genaes.c diff --git a/minimal-examples/api-tests/api-test-gencrypto/lws-genec.c b/minimal-examples-lowlevel/api-tests/api-test-gencrypto/lws-genec.c similarity index 100% rename from minimal-examples/api-tests/api-test-gencrypto/lws-genec.c rename to minimal-examples-lowlevel/api-tests/api-test-gencrypto/lws-genec.c diff --git a/minimal-examples/api-tests/api-test-gencrypto/main.c b/minimal-examples-lowlevel/api-tests/api-test-gencrypto/main.c similarity index 100% rename from minimal-examples/api-tests/api-test-gencrypto/main.c rename to minimal-examples-lowlevel/api-tests/api-test-gencrypto/main.c diff --git a/minimal-examples/api-tests/api-test-jose/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-jose/CMakeLists.txt similarity index 100% rename from minimal-examples/api-tests/api-test-jose/CMakeLists.txt rename to minimal-examples-lowlevel/api-tests/api-test-jose/CMakeLists.txt diff --git a/minimal-examples/api-tests/api-test-jose/README.md b/minimal-examples-lowlevel/api-tests/api-test-jose/README.md similarity index 100% rename from minimal-examples/api-tests/api-test-jose/README.md rename to minimal-examples-lowlevel/api-tests/api-test-jose/README.md diff --git a/minimal-examples/api-tests/api-test-jose/jwe.c b/minimal-examples-lowlevel/api-tests/api-test-jose/jwe.c similarity index 100% rename from minimal-examples/api-tests/api-test-jose/jwe.c rename to minimal-examples-lowlevel/api-tests/api-test-jose/jwe.c diff --git a/minimal-examples/api-tests/api-test-jose/jwk.c b/minimal-examples-lowlevel/api-tests/api-test-jose/jwk.c similarity index 100% rename from minimal-examples/api-tests/api-test-jose/jwk.c rename to minimal-examples-lowlevel/api-tests/api-test-jose/jwk.c diff --git a/minimal-examples/api-tests/api-test-jose/jws.c b/minimal-examples-lowlevel/api-tests/api-test-jose/jws.c similarity index 100% rename from minimal-examples/api-tests/api-test-jose/jws.c rename to minimal-examples-lowlevel/api-tests/api-test-jose/jws.c diff --git a/minimal-examples/api-tests/api-test-jose/main.c b/minimal-examples-lowlevel/api-tests/api-test-jose/main.c similarity index 100% rename from minimal-examples/api-tests/api-test-jose/main.c rename to minimal-examples-lowlevel/api-tests/api-test-jose/main.c diff --git a/minimal-examples/api-tests/api-test-lecp/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-lecp/CMakeLists.txt similarity index 100% rename from minimal-examples/api-tests/api-test-lecp/CMakeLists.txt rename to minimal-examples-lowlevel/api-tests/api-test-lecp/CMakeLists.txt diff --git a/minimal-examples/api-tests/api-test-lecp/README.md b/minimal-examples-lowlevel/api-tests/api-test-lecp/README.md similarity index 100% rename from minimal-examples/api-tests/api-test-lecp/README.md rename to minimal-examples-lowlevel/api-tests/api-test-lecp/README.md diff --git a/minimal-examples/api-tests/api-test-lecp/main.c b/minimal-examples-lowlevel/api-tests/api-test-lecp/main.c similarity index 100% rename from minimal-examples/api-tests/api-test-lecp/main.c rename to minimal-examples-lowlevel/api-tests/api-test-lecp/main.c diff --git a/minimal-examples/api-tests/api-test-lejp/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-lejp/CMakeLists.txt similarity index 100% rename from minimal-examples/api-tests/api-test-lejp/CMakeLists.txt rename to minimal-examples-lowlevel/api-tests/api-test-lejp/CMakeLists.txt diff --git a/minimal-examples/api-tests/api-test-lejp/main.c b/minimal-examples-lowlevel/api-tests/api-test-lejp/main.c similarity index 100% rename from minimal-examples/api-tests/api-test-lejp/main.c rename to minimal-examples-lowlevel/api-tests/api-test-lejp/main.c diff --git a/minimal-examples/api-tests/api-test-lws_cache/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-lws_cache/CMakeLists.txt similarity index 100% rename from minimal-examples/api-tests/api-test-lws_cache/CMakeLists.txt rename to minimal-examples-lowlevel/api-tests/api-test-lws_cache/CMakeLists.txt diff --git a/minimal-examples/api-tests/api-test-lws_cache/README.md b/minimal-examples-lowlevel/api-tests/api-test-lws_cache/README.md similarity index 100% rename from minimal-examples/api-tests/api-test-lws_cache/README.md rename to minimal-examples-lowlevel/api-tests/api-test-lws_cache/README.md diff --git a/minimal-examples/api-tests/api-test-lws_cache/main.c b/minimal-examples-lowlevel/api-tests/api-test-lws_cache/main.c similarity index 100% rename from minimal-examples/api-tests/api-test-lws_cache/main.c rename to minimal-examples-lowlevel/api-tests/api-test-lws_cache/main.c diff --git a/minimal-examples/api-tests/api-test-lws_cache/text1.txt b/minimal-examples-lowlevel/api-tests/api-test-lws_cache/text1.txt similarity index 100% rename from minimal-examples/api-tests/api-test-lws_cache/text1.txt rename to minimal-examples-lowlevel/api-tests/api-test-lws_cache/text1.txt diff --git a/minimal-examples/api-tests/api-test-lws_dsh/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-lws_dsh/CMakeLists.txt similarity index 100% rename from minimal-examples/api-tests/api-test-lws_dsh/CMakeLists.txt rename to minimal-examples-lowlevel/api-tests/api-test-lws_dsh/CMakeLists.txt diff --git a/minimal-examples/api-tests/api-test-lws_dsh/README.md b/minimal-examples-lowlevel/api-tests/api-test-lws_dsh/README.md similarity index 100% rename from minimal-examples/api-tests/api-test-lws_dsh/README.md rename to minimal-examples-lowlevel/api-tests/api-test-lws_dsh/README.md diff --git a/minimal-examples/api-tests/api-test-lws_dsh/main.c b/minimal-examples-lowlevel/api-tests/api-test-lws_dsh/main.c similarity index 100% rename from minimal-examples/api-tests/api-test-lws_dsh/main.c rename to minimal-examples-lowlevel/api-tests/api-test-lws_dsh/main.c diff --git a/minimal-examples/api-tests/api-test-lws_map/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-lws_map/CMakeLists.txt similarity index 100% rename from minimal-examples/api-tests/api-test-lws_map/CMakeLists.txt rename to minimal-examples-lowlevel/api-tests/api-test-lws_map/CMakeLists.txt diff --git a/minimal-examples/api-tests/api-test-lws_map/main.c b/minimal-examples-lowlevel/api-tests/api-test-lws_map/main.c similarity index 100% rename from minimal-examples/api-tests/api-test-lws_map/main.c rename to minimal-examples-lowlevel/api-tests/api-test-lws_map/main.c diff --git a/minimal-examples/api-tests/api-test-lws_sequencer/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-lws_sequencer/CMakeLists.txt similarity index 100% rename from minimal-examples/api-tests/api-test-lws_sequencer/CMakeLists.txt rename to minimal-examples-lowlevel/api-tests/api-test-lws_sequencer/CMakeLists.txt diff --git a/minimal-examples/api-tests/api-test-lws_sequencer/libwebsockets.org.cer b/minimal-examples-lowlevel/api-tests/api-test-lws_sequencer/libwebsockets.org.cer similarity index 100% rename from minimal-examples/api-tests/api-test-lws_sequencer/libwebsockets.org.cer rename to minimal-examples-lowlevel/api-tests/api-test-lws_sequencer/libwebsockets.org.cer diff --git a/minimal-examples/api-tests/api-test-lws_sequencer/main.c b/minimal-examples-lowlevel/api-tests/api-test-lws_sequencer/main.c similarity index 100% rename from minimal-examples/api-tests/api-test-lws_sequencer/main.c rename to minimal-examples-lowlevel/api-tests/api-test-lws_sequencer/main.c diff --git a/minimal-examples/api-tests/api-test-lws_smd/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-lws_smd/CMakeLists.txt similarity index 90% rename from minimal-examples/api-tests/api-test-lws_smd/CMakeLists.txt rename to minimal-examples-lowlevel/api-tests/api-test-lws_smd/CMakeLists.txt index e2827064c..492636274 100644 --- a/minimal-examples/api-tests/api-test-lws_smd/CMakeLists.txt +++ b/minimal-examples-lowlevel/api-tests/api-test-lws_smd/CMakeLists.txt @@ -16,7 +16,7 @@ if (requirements) set_tests_properties(api-test-lws_smd PROPERTIES RUN_SERIAL TRUE - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/api-tests/api-test-lws_smd + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/api-tests/api-test-lws_smd TIMEOUT 60) if (websockets_shared) diff --git a/minimal-examples/api-tests/api-test-lws_smd/main.c b/minimal-examples-lowlevel/api-tests/api-test-lws_smd/main.c similarity index 100% rename from minimal-examples/api-tests/api-test-lws_smd/main.c rename to minimal-examples-lowlevel/api-tests/api-test-lws_smd/main.c diff --git a/minimal-examples/api-tests/api-test-lws_struct-json/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-lws_struct-json/CMakeLists.txt similarity index 100% rename from minimal-examples/api-tests/api-test-lws_struct-json/CMakeLists.txt rename to minimal-examples-lowlevel/api-tests/api-test-lws_struct-json/CMakeLists.txt diff --git a/minimal-examples/api-tests/api-test-lws_struct-json/README.md b/minimal-examples-lowlevel/api-tests/api-test-lws_struct-json/README.md similarity index 100% rename from minimal-examples/api-tests/api-test-lws_struct-json/README.md rename to minimal-examples-lowlevel/api-tests/api-test-lws_struct-json/README.md diff --git a/minimal-examples/api-tests/api-test-lws_struct-json/main.c b/minimal-examples-lowlevel/api-tests/api-test-lws_struct-json/main.c similarity index 100% rename from minimal-examples/api-tests/api-test-lws_struct-json/main.c rename to minimal-examples-lowlevel/api-tests/api-test-lws_struct-json/main.c diff --git a/minimal-examples/api-tests/api-test-lws_struct-json/test2.c b/minimal-examples-lowlevel/api-tests/api-test-lws_struct-json/test2.c similarity index 100% rename from minimal-examples/api-tests/api-test-lws_struct-json/test2.c rename to minimal-examples-lowlevel/api-tests/api-test-lws_struct-json/test2.c diff --git a/minimal-examples/api-tests/api-test-lws_struct_sqlite/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-lws_struct_sqlite/CMakeLists.txt similarity index 100% rename from minimal-examples/api-tests/api-test-lws_struct_sqlite/CMakeLists.txt rename to minimal-examples-lowlevel/api-tests/api-test-lws_struct_sqlite/CMakeLists.txt diff --git a/minimal-examples/api-tests/api-test-lws_struct_sqlite/README.md b/minimal-examples-lowlevel/api-tests/api-test-lws_struct_sqlite/README.md similarity index 100% rename from minimal-examples/api-tests/api-test-lws_struct_sqlite/README.md rename to minimal-examples-lowlevel/api-tests/api-test-lws_struct_sqlite/README.md diff --git a/minimal-examples/api-tests/api-test-lws_struct_sqlite/main.c b/minimal-examples-lowlevel/api-tests/api-test-lws_struct_sqlite/main.c similarity index 100% rename from minimal-examples/api-tests/api-test-lws_struct_sqlite/main.c rename to minimal-examples-lowlevel/api-tests/api-test-lws_struct_sqlite/main.c diff --git a/minimal-examples/api-tests/api-test-lws_tokenize/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-lws_tokenize/CMakeLists.txt similarity index 100% rename from minimal-examples/api-tests/api-test-lws_tokenize/CMakeLists.txt rename to minimal-examples-lowlevel/api-tests/api-test-lws_tokenize/CMakeLists.txt diff --git a/minimal-examples/api-tests/api-test-lws_tokenize/README.md b/minimal-examples-lowlevel/api-tests/api-test-lws_tokenize/README.md similarity index 100% rename from minimal-examples/api-tests/api-test-lws_tokenize/README.md rename to minimal-examples-lowlevel/api-tests/api-test-lws_tokenize/README.md diff --git a/minimal-examples/api-tests/api-test-lws_tokenize/main.c b/minimal-examples-lowlevel/api-tests/api-test-lws_tokenize/main.c similarity index 100% rename from minimal-examples/api-tests/api-test-lws_tokenize/main.c rename to minimal-examples-lowlevel/api-tests/api-test-lws_tokenize/main.c diff --git a/minimal-examples/api-tests/api-test-lwsac/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-lwsac/CMakeLists.txt similarity index 100% rename from minimal-examples/api-tests/api-test-lwsac/CMakeLists.txt rename to minimal-examples-lowlevel/api-tests/api-test-lwsac/CMakeLists.txt diff --git a/minimal-examples/api-tests/api-test-lwsac/README.md b/minimal-examples-lowlevel/api-tests/api-test-lwsac/README.md similarity index 100% rename from minimal-examples/api-tests/api-test-lwsac/README.md rename to minimal-examples-lowlevel/api-tests/api-test-lwsac/README.md diff --git a/minimal-examples/api-tests/api-test-lwsac/main.c b/minimal-examples-lowlevel/api-tests/api-test-lwsac/main.c similarity index 100% rename from minimal-examples/api-tests/api-test-lwsac/main.c rename to minimal-examples-lowlevel/api-tests/api-test-lwsac/main.c diff --git a/minimal-examples/api-tests/api-test-secure-streams/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-secure-streams/CMakeLists.txt similarity index 89% rename from minimal-examples/api-tests/api-test-secure-streams/CMakeLists.txt rename to minimal-examples-lowlevel/api-tests/api-test-secure-streams/CMakeLists.txt index b4f39caac..3c24f6de7 100644 --- a/minimal-examples/api-tests/api-test-secure-streams/CMakeLists.txt +++ b/minimal-examples-lowlevel/api-tests/api-test-secure-streams/CMakeLists.txt @@ -17,7 +17,7 @@ if (requirements) add_test(NAME api-test-secure-streams COMMAND ${PROJECT_NAME}) set_tests_properties(api-test-secure-streams PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/api-tests/api-test-secure-streams + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/api-tests/api-test-secure-streams TIMEOUT 20) endif() diff --git a/minimal-examples/api-tests/api-test-secure-streams/README.md b/minimal-examples-lowlevel/api-tests/api-test-secure-streams/README.md similarity index 100% rename from minimal-examples/api-tests/api-test-secure-streams/README.md rename to minimal-examples-lowlevel/api-tests/api-test-secure-streams/README.md diff --git a/minimal-examples/api-tests/api-test-secure-streams/main.c b/minimal-examples-lowlevel/api-tests/api-test-secure-streams/main.c similarity index 100% rename from minimal-examples/api-tests/api-test-secure-streams/main.c rename to minimal-examples-lowlevel/api-tests/api-test-secure-streams/main.c diff --git a/minimal-examples/api-tests/api-test-smtp_client/CMakeLists.txt b/minimal-examples-lowlevel/api-tests/api-test-smtp_client/CMakeLists.txt similarity index 100% rename from minimal-examples/api-tests/api-test-smtp_client/CMakeLists.txt rename to minimal-examples-lowlevel/api-tests/api-test-smtp_client/CMakeLists.txt diff --git a/minimal-examples/api-tests/api-test-smtp_client/README.md b/minimal-examples-lowlevel/api-tests/api-test-smtp_client/README.md similarity index 100% rename from minimal-examples/api-tests/api-test-smtp_client/README.md rename to minimal-examples-lowlevel/api-tests/api-test-smtp_client/README.md diff --git a/minimal-examples/api-tests/api-test-smtp_client/main.c b/minimal-examples-lowlevel/api-tests/api-test-smtp_client/main.c similarity index 100% rename from minimal-examples/api-tests/api-test-smtp_client/main.c rename to minimal-examples-lowlevel/api-tests/api-test-smtp_client/main.c diff --git a/minimal-examples/client-server/README.md b/minimal-examples-lowlevel/client-server/README.md similarity index 100% rename from minimal-examples/client-server/README.md rename to minimal-examples-lowlevel/client-server/README.md diff --git a/minimal-examples/client-server/minimal-ws-proxy/CMakeLists.txt b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/CMakeLists.txt similarity index 100% rename from minimal-examples/client-server/minimal-ws-proxy/CMakeLists.txt rename to minimal-examples-lowlevel/client-server/minimal-ws-proxy/CMakeLists.txt diff --git a/minimal-examples/client-server/minimal-ws-proxy/README.md b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/README.md similarity index 100% rename from minimal-examples/client-server/minimal-ws-proxy/README.md rename to minimal-examples-lowlevel/client-server/minimal-ws-proxy/README.md diff --git a/minimal-examples/client-server/minimal-ws-proxy/minimal-ws-proxy.c b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/minimal-ws-proxy.c similarity index 100% rename from minimal-examples/client-server/minimal-ws-proxy/minimal-ws-proxy.c rename to minimal-examples-lowlevel/client-server/minimal-ws-proxy/minimal-ws-proxy.c diff --git a/minimal-examples/client-server/minimal-ws-proxy/mount-origin/example.js b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/mount-origin/example.js similarity index 100% rename from minimal-examples/client-server/minimal-ws-proxy/mount-origin/example.js rename to minimal-examples-lowlevel/client-server/minimal-ws-proxy/mount-origin/example.js diff --git a/minimal-examples/client-server/minimal-ws-proxy/mount-origin/favicon.ico b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/client-server/minimal-ws-proxy/mount-origin/favicon.ico rename to minimal-examples-lowlevel/client-server/minimal-ws-proxy/mount-origin/favicon.ico diff --git a/minimal-examples/client-server/minimal-ws-proxy/mount-origin/index.html b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/mount-origin/index.html similarity index 100% rename from minimal-examples/client-server/minimal-ws-proxy/mount-origin/index.html rename to minimal-examples-lowlevel/client-server/minimal-ws-proxy/mount-origin/index.html diff --git a/minimal-examples/client-server/minimal-ws-proxy/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/client-server/minimal-ws-proxy/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/client-server/minimal-ws-proxy/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/client-server/minimal-ws-proxy/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/client-server/minimal-ws-proxy/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/client-server/minimal-ws-proxy/mount-origin/strict-csp.svg diff --git a/minimal-examples/client-server/minimal-ws-proxy/protocol_lws_minimal.c b/minimal-examples-lowlevel/client-server/minimal-ws-proxy/protocol_lws_minimal.c similarity index 100% rename from minimal-examples/client-server/minimal-ws-proxy/protocol_lws_minimal.c rename to minimal-examples-lowlevel/client-server/minimal-ws-proxy/protocol_lws_minimal.c diff --git a/minimal-examples/crypto/README.md b/minimal-examples-lowlevel/crypto/README.md similarity index 100% rename from minimal-examples/crypto/README.md rename to minimal-examples-lowlevel/crypto/README.md diff --git a/minimal-examples/crypto/minimal-crypto-cose-key/CMakeLists.txt b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/CMakeLists.txt similarity index 95% rename from minimal-examples/crypto/minimal-crypto-cose-key/CMakeLists.txt rename to minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/CMakeLists.txt index 6ee78ae99..4551ef10e 100644 --- a/minimal-examples/crypto/minimal-crypto-cose-key/CMakeLists.txt +++ b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/CMakeLists.txt @@ -39,7 +39,7 @@ if (requirements) crypto-cose-key-7 PROPERTIES WORKING_DIRECTORY - ${CMAKE_SOURCE_DIR}/minimal-examples/crypto/minimal-crypto-cose-key + ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key TIMEOUT 5) set_tests_properties(crypto-cose-key-7 diff --git a/minimal-examples/crypto/minimal-crypto-cose-key/README.md b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/README.md similarity index 100% rename from minimal-examples/crypto/minimal-crypto-cose-key/README.md rename to minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/README.md diff --git a/minimal-examples/crypto/minimal-crypto-cose-key/main.c b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/main.c similarity index 100% rename from minimal-examples/crypto/minimal-crypto-cose-key/main.c rename to minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/main.c diff --git a/minimal-examples/crypto/minimal-crypto-cose-key/set1.cks b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/set1.cks similarity index 100% rename from minimal-examples/crypto/minimal-crypto-cose-key/set1.cks rename to minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/set1.cks diff --git a/minimal-examples/crypto/minimal-crypto-cose-key/sign1_pass01.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign1_pass01.sig similarity index 100% rename from minimal-examples/crypto/minimal-crypto-cose-key/sign1_pass01.sig rename to minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign1_pass01.sig diff --git a/minimal-examples/crypto/minimal-crypto-cose-key/sign1_pass02.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign1_pass02.sig similarity index 100% rename from minimal-examples/crypto/minimal-crypto-cose-key/sign1_pass02.sig rename to minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign1_pass02.sig diff --git a/minimal-examples/crypto/minimal-crypto-cose-key/sign1_pass03.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign1_pass03.sig similarity index 100% rename from minimal-examples/crypto/minimal-crypto-cose-key/sign1_pass03.sig rename to minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign1_pass03.sig diff --git a/minimal-examples/crypto/minimal-crypto-cose-key/sign_pass01.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign_pass01.sig similarity index 100% rename from minimal-examples/crypto/minimal-crypto-cose-key/sign_pass01.sig rename to minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign_pass01.sig diff --git a/minimal-examples/crypto/minimal-crypto-cose-key/sign_pass02.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign_pass02.sig similarity index 100% rename from minimal-examples/crypto/minimal-crypto-cose-key/sign_pass02.sig rename to minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign_pass02.sig diff --git a/minimal-examples/crypto/minimal-crypto-cose-key/sign_pass03.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign_pass03.sig similarity index 100% rename from minimal-examples/crypto/minimal-crypto-cose-key/sign_pass03.sig rename to minimal-examples-lowlevel/crypto/minimal-crypto-cose-key/sign_pass03.sig diff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/CMakeLists.txt b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/CMakeLists.txt similarity index 98% rename from minimal-examples/crypto/minimal-crypto-cose-sign/CMakeLists.txt rename to minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/CMakeLists.txt index b49b4173e..241490e81 100644 --- a/minimal-examples/crypto/minimal-crypto-cose-sign/CMakeLists.txt +++ b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/CMakeLists.txt @@ -207,7 +207,7 @@ if (requirements) PROPERTIES WORKING_DIRECTORY - ${CMAKE_SOURCE_DIR}/minimal-examples/crypto/minimal-crypto-cose-sign + ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign TIMEOUT 5) if (websockets_shared) diff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/README.md b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/README.md similarity index 100% rename from minimal-examples/crypto/minimal-crypto-cose-sign/README.md rename to minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/README.md diff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/main.c b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/main.c similarity index 100% rename from minimal-examples/crypto/minimal-crypto-cose-sign/main.c rename to minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/main.c diff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/payload.txt b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/payload.txt similarity index 100% rename from minimal-examples/crypto/minimal-crypto-cose-sign/payload.txt rename to minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/payload.txt diff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/rsa-4096.ck b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/rsa-4096.ck similarity index 100% rename from minimal-examples/crypto/minimal-crypto-cose-sign/rsa-4096.ck rename to minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/rsa-4096.ck diff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/set1.cks b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/set1.cks similarity index 100% rename from minimal-examples/crypto/minimal-crypto-cose-sign/set1.cks rename to minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/set1.cks diff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/sign-rsa4096.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign-rsa4096.sig similarity index 100% rename from minimal-examples/crypto/minimal-crypto-cose-sign/sign-rsa4096.sig rename to minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign-rsa4096.sig diff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/sign1_pass01.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign1_pass01.sig similarity index 100% rename from minimal-examples/crypto/minimal-crypto-cose-sign/sign1_pass01.sig rename to minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign1_pass01.sig diff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/sign1_pass02.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign1_pass02.sig similarity index 100% rename from minimal-examples/crypto/minimal-crypto-cose-sign/sign1_pass02.sig rename to minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign1_pass02.sig diff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/sign1_pass03.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign1_pass03.sig similarity index 100% rename from minimal-examples/crypto/minimal-crypto-cose-sign/sign1_pass03.sig rename to minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign1_pass03.sig diff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/sign_pass01.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign_pass01.sig similarity index 100% rename from minimal-examples/crypto/minimal-crypto-cose-sign/sign_pass01.sig rename to minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign_pass01.sig diff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/sign_pass02.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign_pass02.sig similarity index 100% rename from minimal-examples/crypto/minimal-crypto-cose-sign/sign_pass02.sig rename to minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign_pass02.sig diff --git a/minimal-examples/crypto/minimal-crypto-cose-sign/sign_pass03.sig b/minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign_pass03.sig similarity index 100% rename from minimal-examples/crypto/minimal-crypto-cose-sign/sign_pass03.sig rename to minimal-examples-lowlevel/crypto/minimal-crypto-cose-sign/sign_pass03.sig diff --git a/minimal-examples/crypto/minimal-crypto-jwe/CMakeLists.txt b/minimal-examples-lowlevel/crypto/minimal-crypto-jwe/CMakeLists.txt similarity index 100% rename from minimal-examples/crypto/minimal-crypto-jwe/CMakeLists.txt rename to minimal-examples-lowlevel/crypto/minimal-crypto-jwe/CMakeLists.txt diff --git a/minimal-examples/crypto/minimal-crypto-jwe/README.md b/minimal-examples-lowlevel/crypto/minimal-crypto-jwe/README.md similarity index 100% rename from minimal-examples/crypto/minimal-crypto-jwe/README.md rename to minimal-examples-lowlevel/crypto/minimal-crypto-jwe/README.md diff --git a/minimal-examples/crypto/minimal-crypto-jwe/key-rsa-4096.private b/minimal-examples-lowlevel/crypto/minimal-crypto-jwe/key-rsa-4096.private similarity index 100% rename from minimal-examples/crypto/minimal-crypto-jwe/key-rsa-4096.private rename to minimal-examples-lowlevel/crypto/minimal-crypto-jwe/key-rsa-4096.private diff --git a/minimal-examples/crypto/minimal-crypto-jwe/key-rsa-4096.pub b/minimal-examples-lowlevel/crypto/minimal-crypto-jwe/key-rsa-4096.pub similarity index 100% rename from minimal-examples/crypto/minimal-crypto-jwe/key-rsa-4096.pub rename to minimal-examples-lowlevel/crypto/minimal-crypto-jwe/key-rsa-4096.pub diff --git a/minimal-examples/crypto/minimal-crypto-jwe/main.c b/minimal-examples-lowlevel/crypto/minimal-crypto-jwe/main.c similarity index 100% rename from minimal-examples/crypto/minimal-crypto-jwe/main.c rename to minimal-examples-lowlevel/crypto/minimal-crypto-jwe/main.c diff --git a/minimal-examples/crypto/minimal-crypto-jwk/CMakeLists.txt b/minimal-examples-lowlevel/crypto/minimal-crypto-jwk/CMakeLists.txt similarity index 100% rename from minimal-examples/crypto/minimal-crypto-jwk/CMakeLists.txt rename to minimal-examples-lowlevel/crypto/minimal-crypto-jwk/CMakeLists.txt diff --git a/minimal-examples/crypto/minimal-crypto-jwk/README.md b/minimal-examples-lowlevel/crypto/minimal-crypto-jwk/README.md similarity index 100% rename from minimal-examples/crypto/minimal-crypto-jwk/README.md rename to minimal-examples-lowlevel/crypto/minimal-crypto-jwk/README.md diff --git a/minimal-examples/crypto/minimal-crypto-jwk/main.c b/minimal-examples-lowlevel/crypto/minimal-crypto-jwk/main.c similarity index 100% rename from minimal-examples/crypto/minimal-crypto-jwk/main.c rename to minimal-examples-lowlevel/crypto/minimal-crypto-jwk/main.c diff --git a/minimal-examples/crypto/minimal-crypto-jws/CMakeLists.txt b/minimal-examples-lowlevel/crypto/minimal-crypto-jws/CMakeLists.txt similarity index 100% rename from minimal-examples/crypto/minimal-crypto-jws/CMakeLists.txt rename to minimal-examples-lowlevel/crypto/minimal-crypto-jws/CMakeLists.txt diff --git a/minimal-examples/crypto/minimal-crypto-jws/README.md b/minimal-examples-lowlevel/crypto/minimal-crypto-jws/README.md similarity index 100% rename from minimal-examples/crypto/minimal-crypto-jws/README.md rename to minimal-examples-lowlevel/crypto/minimal-crypto-jws/README.md diff --git a/minimal-examples/crypto/minimal-crypto-jws/main.c b/minimal-examples-lowlevel/crypto/minimal-crypto-jws/main.c similarity index 100% rename from minimal-examples/crypto/minimal-crypto-jws/main.c rename to minimal-examples-lowlevel/crypto/minimal-crypto-jws/main.c diff --git a/minimal-examples/crypto/minimal-crypto-x509/CMakeLists.txt b/minimal-examples-lowlevel/crypto/minimal-crypto-x509/CMakeLists.txt similarity index 100% rename from minimal-examples/crypto/minimal-crypto-x509/CMakeLists.txt rename to minimal-examples-lowlevel/crypto/minimal-crypto-x509/CMakeLists.txt diff --git a/minimal-examples/crypto/minimal-crypto-x509/README.md b/minimal-examples-lowlevel/crypto/minimal-crypto-x509/README.md similarity index 100% rename from minimal-examples/crypto/minimal-crypto-x509/README.md rename to minimal-examples-lowlevel/crypto/minimal-crypto-x509/README.md diff --git a/minimal-examples/crypto/minimal-crypto-x509/main.c b/minimal-examples-lowlevel/crypto/minimal-crypto-x509/main.c similarity index 100% rename from minimal-examples/crypto/minimal-crypto-x509/main.c rename to minimal-examples-lowlevel/crypto/minimal-crypto-x509/main.c diff --git a/minimal-examples/dbus-client/README.md b/minimal-examples-lowlevel/dbus-client/README.md similarity index 100% rename from minimal-examples/dbus-client/README.md rename to minimal-examples-lowlevel/dbus-client/README.md diff --git a/minimal-examples/dbus-client/minimal-dbus-client/CMakeLists.txt b/minimal-examples-lowlevel/dbus-client/minimal-dbus-client/CMakeLists.txt similarity index 100% rename from minimal-examples/dbus-client/minimal-dbus-client/CMakeLists.txt rename to minimal-examples-lowlevel/dbus-client/minimal-dbus-client/CMakeLists.txt diff --git a/minimal-examples/dbus-client/minimal-dbus-client/README.md b/minimal-examples-lowlevel/dbus-client/minimal-dbus-client/README.md similarity index 100% rename from minimal-examples/dbus-client/minimal-dbus-client/README.md rename to minimal-examples-lowlevel/dbus-client/minimal-dbus-client/README.md diff --git a/minimal-examples/dbus-client/minimal-dbus-client/minimal-dbus-client.c b/minimal-examples-lowlevel/dbus-client/minimal-dbus-client/minimal-dbus-client.c similarity index 100% rename from minimal-examples/dbus-client/minimal-dbus-client/minimal-dbus-client.c rename to minimal-examples-lowlevel/dbus-client/minimal-dbus-client/minimal-dbus-client.c diff --git a/minimal-examples/dbus-client/minimal-dbus-ws-proxy-testclient/CMakeLists.txt b/minimal-examples-lowlevel/dbus-client/minimal-dbus-ws-proxy-testclient/CMakeLists.txt similarity index 100% rename from minimal-examples/dbus-client/minimal-dbus-ws-proxy-testclient/CMakeLists.txt rename to minimal-examples-lowlevel/dbus-client/minimal-dbus-ws-proxy-testclient/CMakeLists.txt diff --git a/minimal-examples/dbus-client/minimal-dbus-ws-proxy-testclient/README.md b/minimal-examples-lowlevel/dbus-client/minimal-dbus-ws-proxy-testclient/README.md similarity index 100% rename from minimal-examples/dbus-client/minimal-dbus-ws-proxy-testclient/README.md rename to minimal-examples-lowlevel/dbus-client/minimal-dbus-ws-proxy-testclient/README.md diff --git a/minimal-examples/dbus-client/minimal-dbus-ws-proxy-testclient/minimal-dbus-ws-proxy-testclient.c b/minimal-examples-lowlevel/dbus-client/minimal-dbus-ws-proxy-testclient/minimal-dbus-ws-proxy-testclient.c similarity index 100% rename from minimal-examples/dbus-client/minimal-dbus-ws-proxy-testclient/minimal-dbus-ws-proxy-testclient.c rename to minimal-examples-lowlevel/dbus-client/minimal-dbus-ws-proxy-testclient/minimal-dbus-ws-proxy-testclient.c diff --git a/minimal-examples/dbus-server/README.md b/minimal-examples-lowlevel/dbus-server/README.md similarity index 100% rename from minimal-examples/dbus-server/README.md rename to minimal-examples-lowlevel/dbus-server/README.md diff --git a/minimal-examples/dbus-server/minimal-dbus-server/CMakeLists.txt b/minimal-examples-lowlevel/dbus-server/minimal-dbus-server/CMakeLists.txt similarity index 100% rename from minimal-examples/dbus-server/minimal-dbus-server/CMakeLists.txt rename to minimal-examples-lowlevel/dbus-server/minimal-dbus-server/CMakeLists.txt diff --git a/minimal-examples/dbus-server/minimal-dbus-server/README.md b/minimal-examples-lowlevel/dbus-server/minimal-dbus-server/README.md similarity index 100% rename from minimal-examples/dbus-server/minimal-dbus-server/README.md rename to minimal-examples-lowlevel/dbus-server/minimal-dbus-server/README.md diff --git a/minimal-examples/dbus-server/minimal-dbus-server/main.c b/minimal-examples-lowlevel/dbus-server/minimal-dbus-server/main.c similarity index 100% rename from minimal-examples/dbus-server/minimal-dbus-server/main.c rename to minimal-examples-lowlevel/dbus-server/minimal-dbus-server/main.c diff --git a/minimal-examples/dbus-server/minimal-dbus-ws-proxy/CMakeLists.txt b/minimal-examples-lowlevel/dbus-server/minimal-dbus-ws-proxy/CMakeLists.txt similarity index 100% rename from minimal-examples/dbus-server/minimal-dbus-ws-proxy/CMakeLists.txt rename to minimal-examples-lowlevel/dbus-server/minimal-dbus-ws-proxy/CMakeLists.txt diff --git a/minimal-examples/dbus-server/minimal-dbus-ws-proxy/README.md b/minimal-examples-lowlevel/dbus-server/minimal-dbus-ws-proxy/README.md similarity index 100% rename from minimal-examples/dbus-server/minimal-dbus-ws-proxy/README.md rename to minimal-examples-lowlevel/dbus-server/minimal-dbus-ws-proxy/README.md diff --git a/minimal-examples/dbus-server/minimal-dbus-ws-proxy/main.c b/minimal-examples-lowlevel/dbus-server/minimal-dbus-ws-proxy/main.c similarity index 100% rename from minimal-examples/dbus-server/minimal-dbus-ws-proxy/main.c rename to minimal-examples-lowlevel/dbus-server/minimal-dbus-ws-proxy/main.c diff --git a/minimal-examples/dbus-server/minimal-dbus-ws-proxy/org.libwebsockets.wsclientproxy.conf b/minimal-examples-lowlevel/dbus-server/minimal-dbus-ws-proxy/org.libwebsockets.wsclientproxy.conf similarity index 100% rename from minimal-examples/dbus-server/minimal-dbus-ws-proxy/org.libwebsockets.wsclientproxy.conf rename to minimal-examples-lowlevel/dbus-server/minimal-dbus-ws-proxy/org.libwebsockets.wsclientproxy.conf diff --git a/minimal-examples/dbus-server/minimal-dbus-ws-proxy/protocol_lws_minimal_dbus_ws_proxy.c b/minimal-examples-lowlevel/dbus-server/minimal-dbus-ws-proxy/protocol_lws_minimal_dbus_ws_proxy.c similarity index 100% rename from minimal-examples/dbus-server/minimal-dbus-ws-proxy/protocol_lws_minimal_dbus_ws_proxy.c rename to minimal-examples-lowlevel/dbus-server/minimal-dbus-ws-proxy/protocol_lws_minimal_dbus_ws_proxy.c diff --git a/minimal-examples/gtk/minimal-gtk/CMakeLists.txt b/minimal-examples-lowlevel/gtk/minimal-gtk/CMakeLists.txt similarity index 100% rename from minimal-examples/gtk/minimal-gtk/CMakeLists.txt rename to minimal-examples-lowlevel/gtk/minimal-gtk/CMakeLists.txt diff --git a/minimal-examples/gtk/minimal-gtk/README.md b/minimal-examples-lowlevel/gtk/minimal-gtk/README.md similarity index 100% rename from minimal-examples/gtk/minimal-gtk/README.md rename to minimal-examples-lowlevel/gtk/minimal-gtk/README.md diff --git a/minimal-examples/gtk/minimal-gtk/main.c b/minimal-examples-lowlevel/gtk/minimal-gtk/main.c similarity index 100% rename from minimal-examples/gtk/minimal-gtk/main.c rename to minimal-examples-lowlevel/gtk/minimal-gtk/main.c diff --git a/minimal-examples/gtk/minimal-gtk/warmcat.com.cer b/minimal-examples-lowlevel/gtk/minimal-gtk/warmcat.com.cer similarity index 100% rename from minimal-examples/gtk/minimal-gtk/warmcat.com.cer rename to minimal-examples-lowlevel/gtk/minimal-gtk/warmcat.com.cer diff --git a/minimal-examples/http-client/README.md b/minimal-examples-lowlevel/http-client/README.md similarity index 100% rename from minimal-examples/http-client/README.md rename to minimal-examples-lowlevel/http-client/README.md diff --git a/minimal-examples/http-client/minimal-http-client-attach/CMakeLists.txt b/minimal-examples-lowlevel/http-client/minimal-http-client-attach/CMakeLists.txt similarity index 100% rename from minimal-examples/http-client/minimal-http-client-attach/CMakeLists.txt rename to minimal-examples-lowlevel/http-client/minimal-http-client-attach/CMakeLists.txt diff --git a/minimal-examples/http-client/minimal-http-client-attach/README.md b/minimal-examples-lowlevel/http-client/minimal-http-client-attach/README.md similarity index 100% rename from minimal-examples/http-client/minimal-http-client-attach/README.md rename to minimal-examples-lowlevel/http-client/minimal-http-client-attach/README.md diff --git a/minimal-examples/http-client/minimal-http-client-attach/minimal-http-client-attach.c b/minimal-examples-lowlevel/http-client/minimal-http-client-attach/minimal-http-client-attach.c similarity index 100% rename from minimal-examples/http-client/minimal-http-client-attach/minimal-http-client-attach.c rename to minimal-examples-lowlevel/http-client/minimal-http-client-attach/minimal-http-client-attach.c diff --git a/minimal-examples/http-client/minimal-http-client-captive-portal/CMakeLists.txt b/minimal-examples-lowlevel/http-client/minimal-http-client-captive-portal/CMakeLists.txt similarity index 100% rename from minimal-examples/http-client/minimal-http-client-captive-portal/CMakeLists.txt rename to minimal-examples-lowlevel/http-client/minimal-http-client-captive-portal/CMakeLists.txt diff --git a/minimal-examples/http-client/minimal-http-client-captive-portal/README.md b/minimal-examples-lowlevel/http-client/minimal-http-client-captive-portal/README.md similarity index 100% rename from minimal-examples/http-client/minimal-http-client-captive-portal/README.md rename to minimal-examples-lowlevel/http-client/minimal-http-client-captive-portal/README.md diff --git a/minimal-examples/http-client/minimal-http-client-captive-portal/minimal-http-client-captive-portal.c b/minimal-examples-lowlevel/http-client/minimal-http-client-captive-portal/minimal-http-client-captive-portal.c similarity index 100% rename from minimal-examples/http-client/minimal-http-client-captive-portal/minimal-http-client-captive-portal.c rename to minimal-examples-lowlevel/http-client/minimal-http-client-captive-portal/minimal-http-client-captive-portal.c diff --git a/minimal-examples/http-client/minimal-http-client-certinfo/CMakeLists.txt b/minimal-examples-lowlevel/http-client/minimal-http-client-certinfo/CMakeLists.txt similarity index 100% rename from minimal-examples/http-client/minimal-http-client-certinfo/CMakeLists.txt rename to minimal-examples-lowlevel/http-client/minimal-http-client-certinfo/CMakeLists.txt diff --git a/minimal-examples/http-client/minimal-http-client-certinfo/README.md b/minimal-examples-lowlevel/http-client/minimal-http-client-certinfo/README.md similarity index 100% rename from minimal-examples/http-client/minimal-http-client-certinfo/README.md rename to minimal-examples-lowlevel/http-client/minimal-http-client-certinfo/README.md diff --git a/minimal-examples/http-client/minimal-http-client-certinfo/minimal-http-client-certinfo.c b/minimal-examples-lowlevel/http-client/minimal-http-client-certinfo/minimal-http-client-certinfo.c similarity index 100% rename from minimal-examples/http-client/minimal-http-client-certinfo/minimal-http-client-certinfo.c rename to minimal-examples-lowlevel/http-client/minimal-http-client-certinfo/minimal-http-client-certinfo.c diff --git a/minimal-examples/http-client/minimal-http-client-certinfo/warmcat.com.cer b/minimal-examples-lowlevel/http-client/minimal-http-client-certinfo/warmcat.com.cer similarity index 100% rename from minimal-examples/http-client/minimal-http-client-certinfo/warmcat.com.cer rename to minimal-examples-lowlevel/http-client/minimal-http-client-certinfo/warmcat.com.cer diff --git a/minimal-examples/http-client/minimal-http-client-custom-headers/CMakeLists.txt b/minimal-examples-lowlevel/http-client/minimal-http-client-custom-headers/CMakeLists.txt similarity index 100% rename from minimal-examples/http-client/minimal-http-client-custom-headers/CMakeLists.txt rename to minimal-examples-lowlevel/http-client/minimal-http-client-custom-headers/CMakeLists.txt diff --git a/minimal-examples/http-client/minimal-http-client-custom-headers/README.md b/minimal-examples-lowlevel/http-client/minimal-http-client-custom-headers/README.md similarity index 100% rename from minimal-examples/http-client/minimal-http-client-custom-headers/README.md rename to minimal-examples-lowlevel/http-client/minimal-http-client-custom-headers/README.md diff --git a/minimal-examples/http-client/minimal-http-client-custom-headers/minimal-http-client-custom-headers.c b/minimal-examples-lowlevel/http-client/minimal-http-client-custom-headers/minimal-http-client-custom-headers.c similarity index 100% rename from minimal-examples/http-client/minimal-http-client-custom-headers/minimal-http-client-custom-headers.c rename to minimal-examples-lowlevel/http-client/minimal-http-client-custom-headers/minimal-http-client-custom-headers.c diff --git a/minimal-examples/http-client/minimal-http-client-custom-headers/warmcat.com.cer b/minimal-examples-lowlevel/http-client/minimal-http-client-custom-headers/warmcat.com.cer similarity index 100% rename from minimal-examples/http-client/minimal-http-client-custom-headers/warmcat.com.cer rename to minimal-examples-lowlevel/http-client/minimal-http-client-custom-headers/warmcat.com.cer diff --git a/minimal-examples/http-client/minimal-http-client-h2-rxflow/CMakeLists.txt b/minimal-examples-lowlevel/http-client/minimal-http-client-h2-rxflow/CMakeLists.txt similarity index 91% rename from minimal-examples/http-client/minimal-http-client-h2-rxflow/CMakeLists.txt rename to minimal-examples-lowlevel/http-client/minimal-http-client-h2-rxflow/CMakeLists.txt index 9a2dc65db..d3004facc 100644 --- a/minimal-examples/http-client/minimal-http-client-h2-rxflow/CMakeLists.txt +++ b/minimal-examples-lowlevel/http-client/minimal-http-client-h2-rxflow/CMakeLists.txt @@ -22,7 +22,7 @@ if (requirements) set_tests_properties(http-client-h2-rxflow-warmcat http-client-h2-rxflow-warmcat-h1 PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/http-client/minimal-http-client-h2-rxflow + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-client/minimal-http-client-h2-rxflow TIMEOUT 30) endif() diff --git a/minimal-examples/http-client/minimal-http-client-h2-rxflow/README.md b/minimal-examples-lowlevel/http-client/minimal-http-client-h2-rxflow/README.md similarity index 100% rename from minimal-examples/http-client/minimal-http-client-h2-rxflow/README.md rename to minimal-examples-lowlevel/http-client/minimal-http-client-h2-rxflow/README.md diff --git a/minimal-examples/http-client/minimal-http-client-h2-rxflow/minimal-http-client.c b/minimal-examples-lowlevel/http-client/minimal-http-client-h2-rxflow/minimal-http-client.c similarity index 100% rename from minimal-examples/http-client/minimal-http-client-h2-rxflow/minimal-http-client.c rename to minimal-examples-lowlevel/http-client/minimal-http-client-h2-rxflow/minimal-http-client.c diff --git a/minimal-examples/http-client/minimal-http-client-h2-rxflow/warmcat.com.cer b/minimal-examples-lowlevel/http-client/minimal-http-client-h2-rxflow/warmcat.com.cer similarity index 100% rename from minimal-examples/http-client/minimal-http-client-h2-rxflow/warmcat.com.cer rename to minimal-examples-lowlevel/http-client/minimal-http-client-h2-rxflow/warmcat.com.cer diff --git a/minimal-examples/http-client/minimal-http-client-hugeurl/CMakeLists.txt b/minimal-examples-lowlevel/http-client/minimal-http-client-hugeurl/CMakeLists.txt similarity index 92% rename from minimal-examples/http-client/minimal-http-client-hugeurl/CMakeLists.txt rename to minimal-examples-lowlevel/http-client/minimal-http-client-hugeurl/CMakeLists.txt index cb42d1fba..25b82369f 100644 --- a/minimal-examples/http-client/minimal-http-client-hugeurl/CMakeLists.txt +++ b/minimal-examples-lowlevel/http-client/minimal-http-client-hugeurl/CMakeLists.txt @@ -29,7 +29,7 @@ if (requirements) set_tests_properties(http-client-hugeurl-warmcat http-client-hugeurl-warmcat-h1 PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/http-client/minimal-http-client-hugeurl + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-client/minimal-http-client-hugeurl TIMEOUT 20) if (DEFINED ENV{SAI_OVN}) set_tests_properties(http-client-hugeurl-warmcat diff --git a/minimal-examples/http-client/minimal-http-client-hugeurl/README.md b/minimal-examples-lowlevel/http-client/minimal-http-client-hugeurl/README.md similarity index 100% rename from minimal-examples/http-client/minimal-http-client-hugeurl/README.md rename to minimal-examples-lowlevel/http-client/minimal-http-client-hugeurl/README.md diff --git a/minimal-examples/http-client/minimal-http-client-hugeurl/minimal-http-client-hugeurl.c b/minimal-examples-lowlevel/http-client/minimal-http-client-hugeurl/minimal-http-client-hugeurl.c similarity index 100% rename from minimal-examples/http-client/minimal-http-client-hugeurl/minimal-http-client-hugeurl.c rename to minimal-examples-lowlevel/http-client/minimal-http-client-hugeurl/minimal-http-client-hugeurl.c diff --git a/minimal-examples/http-client/minimal-http-client-hugeurl/warmcat.com.cer b/minimal-examples-lowlevel/http-client/minimal-http-client-hugeurl/warmcat.com.cer similarity index 100% rename from minimal-examples/http-client/minimal-http-client-hugeurl/warmcat.com.cer rename to minimal-examples-lowlevel/http-client/minimal-http-client-hugeurl/warmcat.com.cer diff --git a/minimal-examples/http-client/minimal-http-client-jit-trust/CMakeLists.txt b/minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/CMakeLists.txt similarity index 98% rename from minimal-examples/http-client/minimal-http-client-jit-trust/CMakeLists.txt rename to minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/CMakeLists.txt index eef5cd8d7..fb968d522 100644 --- a/minimal-examples/http-client/minimal-http-client-jit-trust/CMakeLists.txt +++ b/minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/CMakeLists.txt @@ -138,7 +138,7 @@ if (requirements) endif() set_tests_properties(${mytests} PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/http-client/minimal-http-client + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-client/minimal-http-client TIMEOUT 20) if (DEFINED ENV{SAI_OVN}) diff --git a/minimal-examples/http-client/minimal-http-client-jit-trust/README.md b/minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/README.md similarity index 100% rename from minimal-examples/http-client/minimal-http-client-jit-trust/README.md rename to minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/README.md diff --git a/minimal-examples/http-client/minimal-http-client-jit-trust/minimal-http-client.c b/minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/minimal-http-client.c similarity index 100% rename from minimal-examples/http-client/minimal-http-client-jit-trust/minimal-http-client.c rename to minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/minimal-http-client.c diff --git a/minimal-examples/http-client/minimal-http-client-jit-trust/trust_blob.h b/minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/trust_blob.h similarity index 100% rename from minimal-examples/http-client/minimal-http-client-jit-trust/trust_blob.h rename to minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/trust_blob.h diff --git a/minimal-examples/http-client/minimal-http-client-jit-trust/warmcat.com.cer b/minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/warmcat.com.cer similarity index 100% rename from minimal-examples/http-client/minimal-http-client-jit-trust/warmcat.com.cer rename to minimal-examples-lowlevel/http-client/minimal-http-client-jit-trust/warmcat.com.cer diff --git a/minimal-examples/http-client/minimal-http-client-multi/CMakeLists.txt b/minimal-examples-lowlevel/http-client/minimal-http-client-multi/CMakeLists.txt similarity index 96% rename from minimal-examples/http-client/minimal-http-client-multi/CMakeLists.txt rename to minimal-examples-lowlevel/http-client/minimal-http-client-multi/CMakeLists.txt index 22d138cc2..81789cc19 100644 --- a/minimal-examples/http-client/minimal-http-client-multi/CMakeLists.txt +++ b/minimal-examples-lowlevel/http-client/minimal-http-client-multi/CMakeLists.txt @@ -98,7 +98,7 @@ else() endif() set_tests_properties(st_hcm_srv PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/http-server/minimal-http-server-tls + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-server/minimal-http-server-tls FIXTURES_SETUP hcm_srv TIMEOUT 800) set_tests_properties(ki_hcm_srv PROPERTIES @@ -159,7 +159,7 @@ endif() http-client-multi-stag-h1-pipe PROPERTIES FIXTURES_REQUIRED "hcm_srv" - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/http-client/minimal-http-client-multi + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-client/minimal-http-client-multi TIMEOUT 50) # POSTs against local http-server-form-post @@ -194,7 +194,7 @@ endif() http-client-multi-post-stag-h1-pipe PROPERTIES FIXTURES_REQUIRED "hcmp_srv" - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/http-client/minimal-http-client-multi + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-client/minimal-http-client-multi TIMEOUT 20) endif(NOT WIN32 AND LWS_WITH_SERVER) diff --git a/minimal-examples/http-client/minimal-http-client-multi/README.md b/minimal-examples-lowlevel/http-client/minimal-http-client-multi/README.md similarity index 100% rename from minimal-examples/http-client/minimal-http-client-multi/README.md rename to minimal-examples-lowlevel/http-client/minimal-http-client-multi/README.md diff --git a/minimal-examples/http-client/minimal-http-client-multi/minimal-http-client-multi.c b/minimal-examples-lowlevel/http-client/minimal-http-client-multi/minimal-http-client-multi.c similarity index 100% rename from minimal-examples/http-client/minimal-http-client-multi/minimal-http-client-multi.c rename to minimal-examples-lowlevel/http-client/minimal-http-client-multi/minimal-http-client-multi.c diff --git a/minimal-examples/http-client/minimal-http-client-multi/warmcat.com.cer b/minimal-examples-lowlevel/http-client/minimal-http-client-multi/warmcat.com.cer similarity index 100% rename from minimal-examples/http-client/minimal-http-client-multi/warmcat.com.cer rename to minimal-examples-lowlevel/http-client/minimal-http-client-multi/warmcat.com.cer diff --git a/minimal-examples/http-client/minimal-http-client-post/CMakeLists.txt b/minimal-examples-lowlevel/http-client/minimal-http-client-post/CMakeLists.txt similarity index 96% rename from minimal-examples/http-client/minimal-http-client-post/CMakeLists.txt rename to minimal-examples-lowlevel/http-client/minimal-http-client-post/CMakeLists.txt index b4e4b74c2..e2aa5ed9f 100644 --- a/minimal-examples/http-client/minimal-http-client-post/CMakeLists.txt +++ b/minimal-examples-lowlevel/http-client/minimal-http-client-post/CMakeLists.txt @@ -95,7 +95,7 @@ endif() http-client-post-m-h1 PROPERTIES FIXTURES_REQUIRED "hcp_srv" - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/http-client/minimal-http-client-post + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-client/minimal-http-client-post TIMEOUT 20) endif() diff --git a/minimal-examples/http-client/minimal-http-client-post/README.md b/minimal-examples-lowlevel/http-client/minimal-http-client-post/README.md similarity index 100% rename from minimal-examples/http-client/minimal-http-client-post/README.md rename to minimal-examples-lowlevel/http-client/minimal-http-client-post/README.md diff --git a/minimal-examples/http-client/minimal-http-client-post/libwebsockets.org.cer b/minimal-examples-lowlevel/http-client/minimal-http-client-post/libwebsockets.org.cer similarity index 100% rename from minimal-examples/http-client/minimal-http-client-post/libwebsockets.org.cer rename to minimal-examples-lowlevel/http-client/minimal-http-client-post/libwebsockets.org.cer diff --git a/minimal-examples/http-client/minimal-http-client-post/minimal-http-client-post.c b/minimal-examples-lowlevel/http-client/minimal-http-client-post/minimal-http-client-post.c similarity index 100% rename from minimal-examples/http-client/minimal-http-client-post/minimal-http-client-post.c rename to minimal-examples-lowlevel/http-client/minimal-http-client-post/minimal-http-client-post.c diff --git a/minimal-examples/http-client/minimal-http-client/CMakeLists.txt b/minimal-examples-lowlevel/http-client/minimal-http-client/CMakeLists.txt similarity index 96% rename from minimal-examples/http-client/minimal-http-client/CMakeLists.txt rename to minimal-examples-lowlevel/http-client/minimal-http-client/CMakeLists.txt index 8c42ae9f7..73c0cdbf0 100644 --- a/minimal-examples/http-client/minimal-http-client/CMakeLists.txt +++ b/minimal-examples-lowlevel/http-client/minimal-http-client/CMakeLists.txt @@ -37,6 +37,8 @@ require_lws_config(LWS_WITH_SYS_DHCP_CLIENT 0 has_no_system_vhost) require_lws_config(LWS_WITH_SYS_ASYNC_DNS 1 has_async_dns) require_lws_config(LWS_WITH_MBEDTLS 1 has_mbedtls) +message("FI ${has_fault_injection}") + if (requirements) add_executable(${SAMP} ${SRCS}) @@ -55,6 +57,8 @@ if (requirements) add_test(NAME http-client-warmcat-h1 COMMAND lws-minimal-http-client --h1) if (has_fault_injection) + + message("... has LWS_WITH_SYS_FAULT_INJECTION") # creation related faults @@ -134,7 +138,8 @@ if (requirements) list(APPEND mytests http-client-fi-user-est-fail) add_test(NAME http-client-fi-user-est-fail COMMAND lws-minimal-http-client --expected-exit 3 --fault-injection "wsi/user_reject_at_est") - + else() + message("... NO LWS_WITH_SYS_FAULT_INJECTION") endif() if (has_mbedtls) list(APPEND mytests http-client-mbedtls-wrong-ca) @@ -145,7 +150,7 @@ if (requirements) endif() set_tests_properties(${mytests} PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/http-client/minimal-http-client + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-client/minimal-http-client TIMEOUT 20) if (DEFINED ENV{SAI_OVN}) diff --git a/minimal-examples/http-client/minimal-http-client/README.md b/minimal-examples-lowlevel/http-client/minimal-http-client/README.md similarity index 100% rename from minimal-examples/http-client/minimal-http-client/README.md rename to minimal-examples-lowlevel/http-client/minimal-http-client/README.md diff --git a/minimal-examples/http-client/minimal-http-client/minimal-http-client.c b/minimal-examples-lowlevel/http-client/minimal-http-client/minimal-http-client.c similarity index 100% rename from minimal-examples/http-client/minimal-http-client/minimal-http-client.c rename to minimal-examples-lowlevel/http-client/minimal-http-client/minimal-http-client.c diff --git a/minimal-examples/http-client/minimal-http-client/warmcat.com.cer b/minimal-examples-lowlevel/http-client/minimal-http-client/warmcat.com.cer similarity index 100% rename from minimal-examples/http-client/minimal-http-client/warmcat.com.cer rename to minimal-examples-lowlevel/http-client/minimal-http-client/warmcat.com.cer diff --git a/minimal-examples/http-client/minimal-http-client/wrong.cer b/minimal-examples-lowlevel/http-client/minimal-http-client/wrong.cer similarity index 100% rename from minimal-examples/http-client/minimal-http-client/wrong.cer rename to minimal-examples-lowlevel/http-client/minimal-http-client/wrong.cer diff --git a/minimal-examples/http-server/README.md b/minimal-examples-lowlevel/http-server/README.md similarity index 100% rename from minimal-examples/http-server/README.md rename to minimal-examples-lowlevel/http-server/README.md diff --git a/minimal-examples/http-server/minimal-http-server-basicauth/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/CMakeLists.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-basicauth/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/CMakeLists.txt diff --git a/minimal-examples/http-server/minimal-http-server-basicauth/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/README.md similarity index 100% rename from minimal-examples/http-server/minimal-http-server-basicauth/README.md rename to minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/README.md diff --git a/minimal-examples/http-server/minimal-http-server-basicauth/ba-passwords b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/ba-passwords similarity index 100% rename from minimal-examples/http-server/minimal-http-server-basicauth/ba-passwords rename to minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/ba-passwords diff --git a/minimal-examples/http-server/minimal-http-server-basicauth/minimal-http-server-basicauth.c b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/minimal-http-server-basicauth.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-basicauth/minimal-http-server-basicauth.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/minimal-http-server-basicauth.c diff --git a/minimal-examples/http-server/minimal-http-server-basicauth/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-origin/404.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-basicauth/mount-origin/404.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-origin/404.html diff --git a/minimal-examples/http-server/minimal-http-server-basicauth/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/http-server/minimal-http-server-basicauth/mount-origin/favicon.ico rename to minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-origin/favicon.ico diff --git a/minimal-examples/http-server/minimal-http-server-basicauth/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-origin/index.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-basicauth/mount-origin/index.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-origin/index.html diff --git a/minimal-examples/http-server/minimal-http-server-basicauth/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-basicauth/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/http-server/minimal-http-server-basicauth/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-basicauth/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-origin/strict-csp.svg diff --git a/minimal-examples/http-server/minimal-http-server-basicauth/mount-secret-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-secret-origin/index.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-basicauth/mount-secret-origin/index.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-secret-origin/index.html diff --git a/minimal-examples/http-server/minimal-http-server-basicauth/mount-secret-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-secret-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-basicauth/mount-secret-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-basicauth/mount-secret-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/http-server/minimal-http-server-cgi/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-cgi/CMakeLists.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-cgi/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-cgi/CMakeLists.txt diff --git a/minimal-examples/http-server/minimal-http-server-cgi/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-cgi/README.md similarity index 100% rename from minimal-examples/http-server/minimal-http-server-cgi/README.md rename to minimal-examples-lowlevel/http-server/minimal-http-server-cgi/README.md diff --git a/minimal-examples/http-server/minimal-http-server-cgi/minimal-http-server.c b/minimal-examples-lowlevel/http-server/minimal-http-server-cgi/minimal-http-server.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-cgi/minimal-http-server.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-cgi/minimal-http-server.c diff --git a/minimal-examples/http-server/minimal-http-server-cgi/my-cgi-script.sh b/minimal-examples-lowlevel/http-server/minimal-http-server-cgi/my-cgi-script.sh similarity index 100% rename from minimal-examples/http-server/minimal-http-server-cgi/my-cgi-script.sh rename to minimal-examples-lowlevel/http-server/minimal-http-server-cgi/my-cgi-script.sh diff --git a/minimal-examples/http-server/minimal-http-server-custom-headers/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/CMakeLists.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-custom-headers/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/CMakeLists.txt diff --git a/minimal-examples/http-server/minimal-http-server-custom-headers/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/README.md similarity index 100% rename from minimal-examples/http-server/minimal-http-server-custom-headers/README.md rename to minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/README.md diff --git a/minimal-examples/http-server/minimal-http-server-custom-headers/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/localhost-100y.cert similarity index 100% rename from minimal-examples/http-server/minimal-http-server-custom-headers/localhost-100y.cert rename to minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/localhost-100y.cert diff --git a/minimal-examples/http-server/minimal-http-server-custom-headers/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/localhost-100y.key similarity index 100% rename from minimal-examples/http-server/minimal-http-server-custom-headers/localhost-100y.key rename to minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/localhost-100y.key diff --git a/minimal-examples/http-server/minimal-http-server-custom-headers/minimal-http-server-custom-headers.c b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/minimal-http-server-custom-headers.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-custom-headers/minimal-http-server-custom-headers.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/minimal-http-server-custom-headers.c diff --git a/minimal-examples/http-server/minimal-http-server-custom-headers/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/404.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-custom-headers/mount-origin/404.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/404.html diff --git a/minimal-examples/http-server/minimal-http-server-custom-headers/mount-origin/error.css b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/error.css similarity index 100% rename from minimal-examples/http-server/minimal-http-server-custom-headers/mount-origin/error.css rename to minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/error.css diff --git a/minimal-examples/http-server/minimal-http-server-custom-headers/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/http-server/minimal-http-server-custom-headers/mount-origin/favicon.ico rename to minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/favicon.ico diff --git a/minimal-examples/http-server/minimal-http-server-custom-headers/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/index.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-custom-headers/mount-origin/index.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/index.html diff --git a/minimal-examples/http-server/minimal-http-server-custom-headers/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-custom-headers/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/http-server/minimal-http-server-custom-headers/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-custom-headers/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-custom-headers/mount-origin/strict-csp.svg diff --git a/minimal-examples/http-server/minimal-http-server-deaddrop/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/CMakeLists.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-deaddrop/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/CMakeLists.txt diff --git a/minimal-examples/http-server/minimal-http-server-deaddrop/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/README.md similarity index 100% rename from minimal-examples/http-server/minimal-http-server-deaddrop/README.md rename to minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/README.md diff --git a/minimal-examples/http-server/minimal-http-server-deaddrop/ba-passwords b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/ba-passwords similarity index 100% rename from minimal-examples/http-server/minimal-http-server-deaddrop/ba-passwords rename to minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/ba-passwords diff --git a/minimal-examples/http-server/minimal-http-server-deaddrop/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/localhost-100y.cert similarity index 100% rename from minimal-examples/http-server/minimal-http-server-deaddrop/localhost-100y.cert rename to minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/localhost-100y.cert diff --git a/minimal-examples/http-server/minimal-http-server-deaddrop/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/localhost-100y.key similarity index 100% rename from minimal-examples/http-server/minimal-http-server-deaddrop/localhost-100y.key rename to minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/localhost-100y.key diff --git a/minimal-examples/http-server/minimal-http-server-deaddrop/minimal-http-server-deaddrop.c b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/minimal-http-server-deaddrop.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-deaddrop/minimal-http-server-deaddrop.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/minimal-http-server-deaddrop.c diff --git a/minimal-examples/http-server/minimal-http-server-deaddrop/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/404.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-deaddrop/mount-origin/404.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/404.html diff --git a/minimal-examples/http-server/minimal-http-server-deaddrop/mount-origin/deaddrop.css b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/deaddrop.css similarity index 100% rename from minimal-examples/http-server/minimal-http-server-deaddrop/mount-origin/deaddrop.css rename to minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/deaddrop.css diff --git a/minimal-examples/http-server/minimal-http-server-deaddrop/mount-origin/deaddrop.js b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/deaddrop.js similarity index 100% rename from minimal-examples/http-server/minimal-http-server-deaddrop/mount-origin/deaddrop.js rename to minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/deaddrop.js diff --git a/minimal-examples/http-server/minimal-http-server-deaddrop/mount-origin/drop.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/drop.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-deaddrop/mount-origin/drop.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/drop.svg diff --git a/minimal-examples/http-server/minimal-http-server-deaddrop/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/http-server/minimal-http-server-deaddrop/mount-origin/favicon.ico rename to minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/favicon.ico diff --git a/minimal-examples/http-server/minimal-http-server-deaddrop/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/index.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-deaddrop/mount-origin/index.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/index.html diff --git a/minimal-examples/http-server/minimal-http-server-deaddrop/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-deaddrop/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/http-server/minimal-http-server-deaddrop/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-deaddrop/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/mount-origin/strict-csp.svg diff --git a/minimal-examples/http-server/minimal-http-server-deaddrop/uploads/user1/placeholder.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/uploads/user1/placeholder.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-deaddrop/uploads/user1/placeholder.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-deaddrop/uploads/user1/placeholder.txt diff --git a/minimal-examples/http-server/minimal-http-server-dynamic/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/CMakeLists.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-dynamic/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/CMakeLists.txt diff --git a/minimal-examples/http-server/minimal-http-server-dynamic/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/README.md similarity index 100% rename from minimal-examples/http-server/minimal-http-server-dynamic/README.md rename to minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/README.md diff --git a/minimal-examples/http-server/minimal-http-server-dynamic/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/localhost-100y.cert similarity index 100% rename from minimal-examples/http-server/minimal-http-server-dynamic/localhost-100y.cert rename to minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/localhost-100y.cert diff --git a/minimal-examples/http-server/minimal-http-server-dynamic/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/localhost-100y.key similarity index 100% rename from minimal-examples/http-server/minimal-http-server-dynamic/localhost-100y.key rename to minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/localhost-100y.key diff --git a/minimal-examples/http-server/minimal-http-server-dynamic/minimal-http-server-dynamic.c b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/minimal-http-server-dynamic.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-dynamic/minimal-http-server-dynamic.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/minimal-http-server-dynamic.c diff --git a/minimal-examples/http-server/minimal-http-server-dynamic/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/mount-origin/404.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-dynamic/mount-origin/404.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/mount-origin/404.html diff --git a/minimal-examples/http-server/minimal-http-server-dynamic/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/http-server/minimal-http-server-dynamic/mount-origin/favicon.ico rename to minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/mount-origin/favicon.ico diff --git a/minimal-examples/http-server/minimal-http-server-dynamic/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/mount-origin/index.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-dynamic/mount-origin/index.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/mount-origin/index.html diff --git a/minimal-examples/http-server/minimal-http-server-dynamic/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-dynamic/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/http-server/minimal-http-server-dynamic/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-dynamic/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-dynamic/mount-origin/strict-csp.svg diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-custom/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/CMakeLists.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-custom/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/CMakeLists.txt diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-custom/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/README.md similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-custom/README.md rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/README.md diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-custom/minimal-http-server.c b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/minimal-http-server.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-custom/minimal-http-server.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/minimal-http-server.c diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-custom/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/404.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-custom/mount-origin/404.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/404.html diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-custom/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-custom/mount-origin/favicon.ico rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/favicon.ico diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-custom/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/index.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-custom/mount-origin/index.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/index.html diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-custom/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-custom/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-custom/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-custom/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/strict-csp.svg diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-custom/mount-origin/symlink.html b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/symlink.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-custom/mount-origin/symlink.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-custom/mount-origin/symlink.html diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-demos/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/CMakeLists.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-demos/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/CMakeLists.txt diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-demos/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/README.md similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-demos/README.md rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/README.md diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-demos/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/localhost-100y.cert similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-demos/localhost-100y.cert rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/localhost-100y.cert diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-demos/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/localhost-100y.key similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-demos/localhost-100y.key rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/localhost-100y.key diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-demos/minimal-http-server-eventlib-demos.c b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/minimal-http-server-eventlib-demos.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-demos/minimal-http-server-eventlib-demos.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/minimal-http-server-eventlib-demos.c diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/404.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/404.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/404.html diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/candide-uncompressed.zip b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/candide-uncompressed.zip similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/candide-uncompressed.zip rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/candide-uncompressed.zip diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/candide.zip b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/candide.zip similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/candide.zip rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/candide.zip diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/favicon.ico rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/favicon.ico diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/http2.png b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/http2.png similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/http2.png rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/http2.png diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/leaf.jpg b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/leaf.jpg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/leaf.jpg rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/leaf.jpg diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/lws-common.js b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/lws-common.js similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/lws-common.js rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/lws-common.js diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/strict-csp.svg diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/test.css b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/test.css similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/test.css rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/test.css diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/test.html b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/test.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/test.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/test.html diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/test.js b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/test.js similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/test.js rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/test.js diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/wss-over-h2.png b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/wss-over-h2.png similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-demos/mount-origin/wss-over-h2.png rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-demos/mount-origin/wss-over-h2.png diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-foreign/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/CMakeLists.txt similarity index 90% rename from minimal-examples/http-server/minimal-http-server-eventlib-foreign/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/CMakeLists.txt index fc22523ed..b1b65bf09 100644 --- a/minimal-examples/http-server/minimal-http-server-eventlib-foreign/CMakeLists.txt +++ b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/CMakeLists.txt @@ -138,7 +138,7 @@ if (requirements) set_tests_properties(hs_evlib_foreign_uv PROPERTIES ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib" - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/http-server/minimal-http-server-eventlib-foreign + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign TIMEOUT 50) endif() if (LWS_WITH_LIBEVENT) @@ -146,7 +146,7 @@ if (requirements) set_tests_properties(hs_evlib_foreign_event PROPERTIES ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib" - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/http-server/minimal-http-server-eventlib-foreign + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign TIMEOUT 50) endif() if (LWS_WITH_LIBEV) @@ -154,7 +154,7 @@ if (requirements) set_tests_properties(hs_evlib_foreign_ev PROPERTIES ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib" - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/http-server/minimal-http-server-eventlib-foreign + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign TIMEOUT 50) endif() if (LWS_WITH_GLIB) @@ -162,7 +162,7 @@ if (requirements) set_tests_properties(hs_evlib_foreign_glib PROPERTIES ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib" - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/http-server/minimal-http-server-eventlib-foreign + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign TIMEOUT 50) endif() if (LWS_WITH_SDEVENT) @@ -170,7 +170,7 @@ if (requirements) set_tests_properties(hs_evlib_foreign_sd PROPERTIES ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib" - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/http-server/minimal-http-server-eventlib-foreign + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign TIMEOUT 50) endif() if (LWS_WITH_SDEVENT) @@ -178,7 +178,7 @@ if (requirements) set_tests_properties(hs_evlib_foreign_uloop PROPERTIES ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib" - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/http-server/minimal-http-server-eventlib-foreign + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign TIMEOUT 50) endif() diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-foreign/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/README.md similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-foreign/README.md rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/README.md diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-foreign/glib.c b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/glib.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-foreign/glib.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/glib.c diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-foreign/libev.c b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/libev.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-foreign/libev.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/libev.c diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-foreign/libevent.c b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/libevent.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-foreign/libevent.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/libevent.c diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-foreign/libsdevent.c b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/libsdevent.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-foreign/libsdevent.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/libsdevent.c diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-foreign/libuv.c b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/libuv.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-foreign/libuv.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/libuv.c diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-foreign/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/localhost-100y.cert similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-foreign/localhost-100y.cert rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/localhost-100y.cert diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-foreign/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/localhost-100y.key similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-foreign/localhost-100y.key rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/localhost-100y.key diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-foreign/minimal-http-server-eventlib-foreign.c b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/minimal-http-server-eventlib-foreign.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-foreign/minimal-http-server-eventlib-foreign.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/minimal-http-server-eventlib-foreign.c diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-foreign/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/mount-origin/404.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-foreign/mount-origin/404.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/mount-origin/404.html diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-foreign/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-foreign/mount-origin/favicon.ico rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/mount-origin/favicon.ico diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-foreign/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/mount-origin/index.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-foreign/mount-origin/index.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/mount-origin/index.html diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-foreign/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-foreign/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-foreign/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-foreign/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/mount-origin/strict-csp.svg diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-foreign/private.h b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/private.h similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-foreign/private.h rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/private.h diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-foreign/uloop.c b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/uloop.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-foreign/uloop.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-foreign/uloop.c diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-smp/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/CMakeLists.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-smp/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/CMakeLists.txt diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-smp/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/README.md similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-smp/README.md rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/README.md diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-smp/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/localhost-100y.cert similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-smp/localhost-100y.cert rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/localhost-100y.cert diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-smp/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/localhost-100y.key similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-smp/localhost-100y.key rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/localhost-100y.key diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-smp/minimal-http-server-eventlib-smp.c b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/minimal-http-server-eventlib-smp.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-smp/minimal-http-server-eventlib-smp.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/minimal-http-server-eventlib-smp.c diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-smp/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/mount-origin/404.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-smp/mount-origin/404.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/mount-origin/404.html diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-smp/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-smp/mount-origin/favicon.ico rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/mount-origin/favicon.ico diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-smp/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/mount-origin/index.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-smp/mount-origin/index.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/mount-origin/index.html diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-smp/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-smp/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/http-server/minimal-http-server-eventlib-smp/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib-smp/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib-smp/mount-origin/strict-csp.svg diff --git a/minimal-examples/http-server/minimal-http-server-eventlib/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/CMakeLists.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/CMakeLists.txt diff --git a/minimal-examples/http-server/minimal-http-server-eventlib/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/README.md similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib/README.md rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/README.md diff --git a/minimal-examples/http-server/minimal-http-server-eventlib/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/localhost-100y.cert similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib/localhost-100y.cert rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/localhost-100y.cert diff --git a/minimal-examples/http-server/minimal-http-server-eventlib/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/localhost-100y.key similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib/localhost-100y.key rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/localhost-100y.key diff --git a/minimal-examples/http-server/minimal-http-server-eventlib/minimal-http-server-eventlib.c b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/minimal-http-server-eventlib.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib/minimal-http-server-eventlib.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/minimal-http-server-eventlib.c diff --git a/minimal-examples/http-server/minimal-http-server-eventlib/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/mount-origin/404.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib/mount-origin/404.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/mount-origin/404.html diff --git a/minimal-examples/http-server/minimal-http-server-eventlib/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib/mount-origin/favicon.ico rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/mount-origin/favicon.ico diff --git a/minimal-examples/http-server/minimal-http-server-eventlib/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/mount-origin/index.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib/mount-origin/index.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/mount-origin/index.html diff --git a/minimal-examples/http-server/minimal-http-server-eventlib/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/http-server/minimal-http-server-eventlib/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-eventlib/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-eventlib/mount-origin/strict-csp.svg diff --git a/minimal-examples/http-server/minimal-http-server-form-get/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/CMakeLists.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-get/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-get/CMakeLists.txt diff --git a/minimal-examples/http-server/minimal-http-server-form-get/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/README.md similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-get/README.md rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-get/README.md diff --git a/minimal-examples/http-server/minimal-http-server-form-get/minimal-http-server-form-get.c b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/minimal-http-server-form-get.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-get/minimal-http-server-form-get.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-get/minimal-http-server-form-get.c diff --git a/minimal-examples/http-server/minimal-http-server-form-get/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/404.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-get/mount-origin/404.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/404.html diff --git a/minimal-examples/http-server/minimal-http-server-form-get/mount-origin/after-form1.html b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/after-form1.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-get/mount-origin/after-form1.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/after-form1.html diff --git a/minimal-examples/http-server/minimal-http-server-form-get/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-get/mount-origin/favicon.ico rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/favicon.ico diff --git a/minimal-examples/http-server/minimal-http-server-form-get/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/index.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-get/mount-origin/index.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/index.html diff --git a/minimal-examples/http-server/minimal-http-server-form-get/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-get/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/http-server/minimal-http-server-form-get/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-get/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-get/mount-origin/strict-csp.svg diff --git a/minimal-examples/http-server/minimal-http-server-form-post-file/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/CMakeLists.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-post-file/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/CMakeLists.txt diff --git a/minimal-examples/http-server/minimal-http-server-form-post-file/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/README.md similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-post-file/README.md rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/README.md diff --git a/minimal-examples/http-server/minimal-http-server-form-post-file/minimal-http-server-form-post-file.c b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/minimal-http-server-form-post-file.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-post-file/minimal-http-server-form-post-file.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/minimal-http-server-form-post-file.c diff --git a/minimal-examples/http-server/minimal-http-server-form-post-file/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/404.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-post-file/mount-origin/404.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/404.html diff --git a/minimal-examples/http-server/minimal-http-server-form-post-file/mount-origin/after-form1.html b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/after-form1.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-post-file/mount-origin/after-form1.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/after-form1.html diff --git a/minimal-examples/http-server/minimal-http-server-form-post-file/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-post-file/mount-origin/favicon.ico rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/favicon.ico diff --git a/minimal-examples/http-server/minimal-http-server-form-post-file/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/index.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-post-file/mount-origin/index.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/index.html diff --git a/minimal-examples/http-server/minimal-http-server-form-post-file/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-post-file/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/http-server/minimal-http-server-form-post-file/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-post-file/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-post-file/mount-origin/strict-csp.svg diff --git a/minimal-examples/http-server/minimal-http-server-form-post-lwsac/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-lwsac/CMakeLists.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-post-lwsac/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-post-lwsac/CMakeLists.txt diff --git a/minimal-examples/http-server/minimal-http-server-form-post-lwsac/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-lwsac/README.md similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-post-lwsac/README.md rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-post-lwsac/README.md diff --git a/minimal-examples/http-server/minimal-http-server-form-post-lwsac/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-lwsac/localhost-100y.cert similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-post-lwsac/localhost-100y.cert rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-post-lwsac/localhost-100y.cert diff --git a/minimal-examples/http-server/minimal-http-server-form-post-lwsac/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-lwsac/localhost-100y.key similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-post-lwsac/localhost-100y.key rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-post-lwsac/localhost-100y.key diff --git a/minimal-examples/http-server/minimal-http-server-form-post-lwsac/minimal-http-server-form-post.c b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post-lwsac/minimal-http-server-form-post.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-post-lwsac/minimal-http-server-form-post.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-post-lwsac/minimal-http-server-form-post.c diff --git a/minimal-examples/http-server/minimal-http-server-form-post/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/CMakeLists.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-post/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-post/CMakeLists.txt diff --git a/minimal-examples/http-server/minimal-http-server-form-post/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/README.md similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-post/README.md rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-post/README.md diff --git a/minimal-examples/http-server/minimal-http-server-form-post/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/localhost-100y.cert similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-post/localhost-100y.cert rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-post/localhost-100y.cert diff --git a/minimal-examples/http-server/minimal-http-server-form-post/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/localhost-100y.key similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-post/localhost-100y.key rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-post/localhost-100y.key diff --git a/minimal-examples/http-server/minimal-http-server-form-post/minimal-http-server-form-post.c b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/minimal-http-server-form-post.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-post/minimal-http-server-form-post.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-post/minimal-http-server-form-post.c diff --git a/minimal-examples/http-server/minimal-http-server-form-post/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/404.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-post/mount-origin/404.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/404.html diff --git a/minimal-examples/http-server/minimal-http-server-form-post/mount-origin/after-form1.html b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/after-form1.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-post/mount-origin/after-form1.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/after-form1.html diff --git a/minimal-examples/http-server/minimal-http-server-form-post/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-post/mount-origin/favicon.ico rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/favicon.ico diff --git a/minimal-examples/http-server/minimal-http-server-form-post/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/index.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-post/mount-origin/index.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/index.html diff --git a/minimal-examples/http-server/minimal-http-server-form-post/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-post/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/http-server/minimal-http-server-form-post/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-form-post/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-form-post/mount-origin/strict-csp.svg diff --git a/minimal-examples/http-server/minimal-http-server-fulltext-search/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/CMakeLists.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-fulltext-search/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/CMakeLists.txt diff --git a/minimal-examples/http-server/minimal-http-server-fulltext-search/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/README.md similarity index 100% rename from minimal-examples/http-server/minimal-http-server-fulltext-search/README.md rename to minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/README.md diff --git a/minimal-examples/http-server/minimal-http-server-fulltext-search/lws-fts.index b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/lws-fts.index similarity index 100% rename from minimal-examples/http-server/minimal-http-server-fulltext-search/lws-fts.index rename to minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/lws-fts.index diff --git a/minimal-examples/http-server/minimal-http-server-fulltext-search/minimal-http-server.c b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/minimal-http-server.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-fulltext-search/minimal-http-server.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/minimal-http-server.c diff --git a/minimal-examples/http-server/minimal-http-server-fulltext-search/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/404.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-fulltext-search/mount-origin/404.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/404.html diff --git a/minimal-examples/http-server/minimal-http-server-fulltext-search/mount-origin/dorian-gray-wikipedia.jpg b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/dorian-gray-wikipedia.jpg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-fulltext-search/mount-origin/dorian-gray-wikipedia.jpg rename to minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/dorian-gray-wikipedia.jpg diff --git a/minimal-examples/http-server/minimal-http-server-fulltext-search/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/http-server/minimal-http-server-fulltext-search/mount-origin/favicon.ico rename to minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/favicon.ico diff --git a/minimal-examples/http-server/minimal-http-server-fulltext-search/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/index.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-fulltext-search/mount-origin/index.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/index.html diff --git a/minimal-examples/http-server/minimal-http-server-fulltext-search/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-fulltext-search/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/http-server/minimal-http-server-fulltext-search/mount-origin/lws-fts.css b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/lws-fts.css similarity index 100% rename from minimal-examples/http-server/minimal-http-server-fulltext-search/mount-origin/lws-fts.css rename to minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/lws-fts.css diff --git a/minimal-examples/http-server/minimal-http-server-fulltext-search/mount-origin/lws-fts.js b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/lws-fts.js similarity index 100% rename from minimal-examples/http-server/minimal-http-server-fulltext-search/mount-origin/lws-fts.js rename to minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/lws-fts.js diff --git a/minimal-examples/http-server/minimal-http-server-fulltext-search/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-fulltext-search/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/mount-origin/strict-csp.svg diff --git a/minimal-examples/http-server/minimal-http-server-fulltext-search/the-picture-of-dorian-gray.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/the-picture-of-dorian-gray.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-fulltext-search/the-picture-of-dorian-gray.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-fulltext-search/the-picture-of-dorian-gray.txt diff --git a/minimal-examples/http-server/minimal-http-server-h2-long-poll/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-h2-long-poll/CMakeLists.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-h2-long-poll/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-h2-long-poll/CMakeLists.txt diff --git a/minimal-examples/http-server/minimal-http-server-h2-long-poll/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-h2-long-poll/README.md similarity index 100% rename from minimal-examples/http-server/minimal-http-server-h2-long-poll/README.md rename to minimal-examples-lowlevel/http-server/minimal-http-server-h2-long-poll/README.md diff --git a/minimal-examples/http-server/minimal-http-server-h2-long-poll/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-h2-long-poll/localhost-100y.cert similarity index 100% rename from minimal-examples/http-server/minimal-http-server-h2-long-poll/localhost-100y.cert rename to minimal-examples-lowlevel/http-server/minimal-http-server-h2-long-poll/localhost-100y.cert diff --git a/minimal-examples/http-server/minimal-http-server-h2-long-poll/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-h2-long-poll/localhost-100y.key similarity index 100% rename from minimal-examples/http-server/minimal-http-server-h2-long-poll/localhost-100y.key rename to minimal-examples-lowlevel/http-server/minimal-http-server-h2-long-poll/localhost-100y.key diff --git a/minimal-examples/http-server/minimal-http-server-h2-long-poll/minimal-http-server.c b/minimal-examples-lowlevel/http-server/minimal-http-server-h2-long-poll/minimal-http-server.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-h2-long-poll/minimal-http-server.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-h2-long-poll/minimal-http-server.c diff --git a/minimal-examples/http-server/minimal-http-server-mimetypes/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/CMakeLists.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-mimetypes/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/CMakeLists.txt diff --git a/minimal-examples/http-server/minimal-http-server-mimetypes/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/README.md similarity index 100% rename from minimal-examples/http-server/minimal-http-server-mimetypes/README.md rename to minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/README.md diff --git a/minimal-examples/http-server/minimal-http-server-mimetypes/minimal-http-server-mimetypes.c b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/minimal-http-server-mimetypes.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-mimetypes/minimal-http-server-mimetypes.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/minimal-http-server-mimetypes.c diff --git a/minimal-examples/http-server/minimal-http-server-mimetypes/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/404.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-mimetypes/mount-origin/404.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/404.html diff --git a/minimal-examples/http-server/minimal-http-server-mimetypes/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/http-server/minimal-http-server-mimetypes/mount-origin/favicon.ico rename to minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/favicon.ico diff --git a/minimal-examples/http-server/minimal-http-server-mimetypes/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/index.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-mimetypes/mount-origin/index.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/index.html diff --git a/minimal-examples/http-server/minimal-http-server-mimetypes/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-mimetypes/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/http-server/minimal-http-server-mimetypes/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-mimetypes/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/strict-csp.svg diff --git a/minimal-examples/http-server/minimal-http-server-mimetypes/mount-origin/test.tar.bz2 b/minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/test.tar.bz2 similarity index 100% rename from minimal-examples/http-server/minimal-http-server-mimetypes/mount-origin/test.tar.bz2 rename to minimal-examples-lowlevel/http-server/minimal-http-server-mimetypes/mount-origin/test.tar.bz2 diff --git a/minimal-examples/http-server/minimal-http-server-multivhost/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/CMakeLists.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-multivhost/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/CMakeLists.txt diff --git a/minimal-examples/http-server/minimal-http-server-multivhost/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/README.md similarity index 100% rename from minimal-examples/http-server/minimal-http-server-multivhost/README.md rename to minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/README.md diff --git a/minimal-examples/http-server/minimal-http-server-multivhost/minimal-http-server.c b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/minimal-http-server.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-multivhost/minimal-http-server.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/minimal-http-server.c diff --git a/minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost1/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost1/404.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost1/404.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost1/404.html diff --git a/minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost1/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost1/favicon.ico similarity index 100% rename from minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost1/favicon.ico rename to minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost1/favicon.ico diff --git a/minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost1/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost1/index.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost1/index.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost1/index.html diff --git a/minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost1/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost1/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost1/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost1/libwebsockets.org-logo.svg diff --git a/minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost1/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost1/strict-csp.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost1/strict-csp.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost1/strict-csp.svg diff --git a/minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost2/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost2/404.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost2/404.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost2/404.html diff --git a/minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost2/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost2/favicon.ico similarity index 100% rename from minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost2/favicon.ico rename to minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost2/favicon.ico diff --git a/minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost2/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost2/index.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost2/index.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost2/index.html diff --git a/minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost2/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost2/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost2/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost2/libwebsockets.org-logo.svg diff --git a/minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost2/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost2/strict-csp.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost2/strict-csp.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost2/strict-csp.svg diff --git a/minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost3/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost3/404.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost3/404.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost3/404.html diff --git a/minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost3/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost3/favicon.ico similarity index 100% rename from minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost3/favicon.ico rename to minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost3/favicon.ico diff --git a/minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost3/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost3/index.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost3/index.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost3/index.html diff --git a/minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost3/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost3/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost3/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost3/libwebsockets.org-logo.svg diff --git a/minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost3/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost3/strict-csp.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-multivhost/mount-origin-localhost3/strict-csp.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-multivhost/mount-origin-localhost3/strict-csp.svg diff --git a/minimal-examples/http-server/minimal-http-server-proxy/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/CMakeLists.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-proxy/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-proxy/CMakeLists.txt diff --git a/minimal-examples/http-server/minimal-http-server-proxy/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/localhost-100y.cert similarity index 100% rename from minimal-examples/http-server/minimal-http-server-proxy/localhost-100y.cert rename to minimal-examples-lowlevel/http-server/minimal-http-server-proxy/localhost-100y.cert diff --git a/minimal-examples/http-server/minimal-http-server-proxy/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/localhost-100y.key similarity index 100% rename from minimal-examples/http-server/minimal-http-server-proxy/localhost-100y.key rename to minimal-examples-lowlevel/http-server/minimal-http-server-proxy/localhost-100y.key diff --git a/minimal-examples/http-server/minimal-http-server-proxy/minimal-http-server-proxy.c b/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/minimal-http-server-proxy.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-proxy/minimal-http-server-proxy.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-proxy/minimal-http-server-proxy.c diff --git a/minimal-examples/http-server/minimal-http-server-proxy/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/mount-origin/404.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-proxy/mount-origin/404.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-proxy/mount-origin/404.html diff --git a/minimal-examples/http-server/minimal-http-server-proxy/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/http-server/minimal-http-server-proxy/mount-origin/favicon.ico rename to minimal-examples-lowlevel/http-server/minimal-http-server-proxy/mount-origin/favicon.ico diff --git a/minimal-examples/http-server/minimal-http-server-proxy/mount-origin/http2.png b/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/mount-origin/http2.png similarity index 100% rename from minimal-examples/http-server/minimal-http-server-proxy/mount-origin/http2.png rename to minimal-examples-lowlevel/http-server/minimal-http-server-proxy/mount-origin/http2.png diff --git a/minimal-examples/http-server/minimal-http-server-proxy/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-proxy/mount-origin/index.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-proxy/mount-origin/index.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-proxy/mount-origin/index.html diff --git a/minimal-examples/http-server/minimal-http-server-smp/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/CMakeLists.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-smp/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-smp/CMakeLists.txt diff --git a/minimal-examples/http-server/minimal-http-server-smp/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/README.md similarity index 100% rename from minimal-examples/http-server/minimal-http-server-smp/README.md rename to minimal-examples-lowlevel/http-server/minimal-http-server-smp/README.md diff --git a/minimal-examples/http-server/minimal-http-server-smp/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/localhost-100y.cert similarity index 100% rename from minimal-examples/http-server/minimal-http-server-smp/localhost-100y.cert rename to minimal-examples-lowlevel/http-server/minimal-http-server-smp/localhost-100y.cert diff --git a/minimal-examples/http-server/minimal-http-server-smp/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/localhost-100y.key similarity index 100% rename from minimal-examples/http-server/minimal-http-server-smp/localhost-100y.key rename to minimal-examples-lowlevel/http-server/minimal-http-server-smp/localhost-100y.key diff --git a/minimal-examples/http-server/minimal-http-server-smp/minimal-http-server-smp.c b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/minimal-http-server-smp.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-smp/minimal-http-server-smp.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-smp/minimal-http-server-smp.c diff --git a/minimal-examples/http-server/minimal-http-server-smp/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/http-server/minimal-http-server-smp/mount-origin/favicon.ico rename to minimal-examples-lowlevel/http-server/minimal-http-server-smp/mount-origin/favicon.ico diff --git a/minimal-examples/http-server/minimal-http-server-smp/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/mount-origin/index.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-smp/mount-origin/index.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-smp/mount-origin/index.html diff --git a/minimal-examples/http-server/minimal-http-server-smp/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-smp/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-smp/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/http-server/minimal-http-server-smp/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-smp/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-smp/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-smp/mount-origin/strict-csp.svg diff --git a/minimal-examples/http-server/minimal-http-server-sse-ring/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/CMakeLists.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-sse-ring/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/CMakeLists.txt diff --git a/minimal-examples/http-server/minimal-http-server-sse-ring/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/README.md similarity index 100% rename from minimal-examples/http-server/minimal-http-server-sse-ring/README.md rename to minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/README.md diff --git a/minimal-examples/http-server/minimal-http-server-sse-ring/minimal-http-server-sse-ring.c b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/minimal-http-server-sse-ring.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-sse-ring/minimal-http-server-sse-ring.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/minimal-http-server-sse-ring.c diff --git a/minimal-examples/http-server/minimal-http-server-sse-ring/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/404.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-sse-ring/mount-origin/404.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/404.html diff --git a/minimal-examples/http-server/minimal-http-server-sse-ring/mount-origin/example.js b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/example.js similarity index 100% rename from minimal-examples/http-server/minimal-http-server-sse-ring/mount-origin/example.js rename to minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/example.js diff --git a/minimal-examples/http-server/minimal-http-server-sse-ring/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/http-server/minimal-http-server-sse-ring/mount-origin/favicon.ico rename to minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/favicon.ico diff --git a/minimal-examples/http-server/minimal-http-server-sse-ring/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/index.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-sse-ring/mount-origin/index.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/index.html diff --git a/minimal-examples/http-server/minimal-http-server-sse-ring/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-sse-ring/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/http-server/minimal-http-server-sse-ring/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-sse-ring/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-sse-ring/mount-origin/strict-csp.svg diff --git a/minimal-examples/http-server/minimal-http-server-sse/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/CMakeLists.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-sse/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-sse/CMakeLists.txt diff --git a/minimal-examples/http-server/minimal-http-server-sse/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/README.md similarity index 100% rename from minimal-examples/http-server/minimal-http-server-sse/README.md rename to minimal-examples-lowlevel/http-server/minimal-http-server-sse/README.md diff --git a/minimal-examples/http-server/minimal-http-server-sse/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/localhost-100y.cert similarity index 100% rename from minimal-examples/http-server/minimal-http-server-sse/localhost-100y.cert rename to minimal-examples-lowlevel/http-server/minimal-http-server-sse/localhost-100y.cert diff --git a/minimal-examples/http-server/minimal-http-server-sse/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/localhost-100y.key similarity index 100% rename from minimal-examples/http-server/minimal-http-server-sse/localhost-100y.key rename to minimal-examples-lowlevel/http-server/minimal-http-server-sse/localhost-100y.key diff --git a/minimal-examples/http-server/minimal-http-server-sse/minimal-http-server-sse.c b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/minimal-http-server-sse.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-sse/minimal-http-server-sse.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-sse/minimal-http-server-sse.c diff --git a/minimal-examples/http-server/minimal-http-server-sse/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/404.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-sse/mount-origin/404.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/404.html diff --git a/minimal-examples/http-server/minimal-http-server-sse/mount-origin/example.js b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/example.js similarity index 100% rename from minimal-examples/http-server/minimal-http-server-sse/mount-origin/example.js rename to minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/example.js diff --git a/minimal-examples/http-server/minimal-http-server-sse/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/http-server/minimal-http-server-sse/mount-origin/favicon.ico rename to minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/favicon.ico diff --git a/minimal-examples/http-server/minimal-http-server-sse/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/index.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-sse/mount-origin/index.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/index.html diff --git a/minimal-examples/http-server/minimal-http-server-sse/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-sse/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/http-server/minimal-http-server-sse/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-sse/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-sse/mount-origin/strict-csp.svg diff --git a/minimal-examples/http-server/minimal-http-server-tls-80/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/CMakeLists.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls-80/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/CMakeLists.txt diff --git a/minimal-examples/http-server/minimal-http-server-tls-80/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/README.md similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls-80/README.md rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/README.md diff --git a/minimal-examples/http-server/minimal-http-server-tls-80/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/localhost-100y.cert similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls-80/localhost-100y.cert rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/localhost-100y.cert diff --git a/minimal-examples/http-server/minimal-http-server-tls-80/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/localhost-100y.key similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls-80/localhost-100y.key rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/localhost-100y.key diff --git a/minimal-examples/http-server/minimal-http-server-tls-80/minimal-http-server-tls-80.c b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/minimal-http-server-tls-80.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls-80/minimal-http-server-tls-80.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/minimal-http-server-tls-80.c diff --git a/minimal-examples/http-server/minimal-http-server-tls-80/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/404.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls-80/mount-origin/404.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/404.html diff --git a/minimal-examples/http-server/minimal-http-server-tls-80/mount-origin/example.js b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/example.js similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls-80/mount-origin/example.js rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/example.js diff --git a/minimal-examples/http-server/minimal-http-server-tls-80/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls-80/mount-origin/favicon.ico rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/favicon.ico diff --git a/minimal-examples/http-server/minimal-http-server-tls-80/mount-origin/http2.png b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/http2.png similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls-80/mount-origin/http2.png rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/http2.png diff --git a/minimal-examples/http-server/minimal-http-server-tls-80/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/index.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls-80/mount-origin/index.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/index.html diff --git a/minimal-examples/http-server/minimal-http-server-tls-80/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls-80/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/http-server/minimal-http-server-tls-80/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls-80/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls-80/mount-origin/strict-csp.svg diff --git a/minimal-examples/http-server/minimal-http-server-tls-mem/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/CMakeLists.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls-mem/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/CMakeLists.txt diff --git a/minimal-examples/http-server/minimal-http-server-tls-mem/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/README.md similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls-mem/README.md rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/README.md diff --git a/minimal-examples/http-server/minimal-http-server-tls-mem/minimal-http-server-tls-mem.c b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/minimal-http-server-tls-mem.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls-mem/minimal-http-server-tls-mem.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/minimal-http-server-tls-mem.c diff --git a/minimal-examples/http-server/minimal-http-server-tls-mem/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/404.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls-mem/mount-origin/404.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/404.html diff --git a/minimal-examples/http-server/minimal-http-server-tls-mem/mount-origin/example.js b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/example.js similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls-mem/mount-origin/example.js rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/example.js diff --git a/minimal-examples/http-server/minimal-http-server-tls-mem/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls-mem/mount-origin/favicon.ico rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/favicon.ico diff --git a/minimal-examples/http-server/minimal-http-server-tls-mem/mount-origin/http2.png b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/http2.png similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls-mem/mount-origin/http2.png rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/http2.png diff --git a/minimal-examples/http-server/minimal-http-server-tls-mem/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/index.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls-mem/mount-origin/index.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/index.html diff --git a/minimal-examples/http-server/minimal-http-server-tls-mem/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls-mem/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/http-server/minimal-http-server-tls-mem/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls-mem/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls-mem/mount-origin/strict-csp.svg diff --git a/minimal-examples/http-server/minimal-http-server-tls/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/CMakeLists.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls/CMakeLists.txt diff --git a/minimal-examples/http-server/minimal-http-server-tls/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/README.md similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls/README.md rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls/README.md diff --git a/minimal-examples/http-server/minimal-http-server-tls/localhost-100y.cert b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/localhost-100y.cert similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls/localhost-100y.cert rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls/localhost-100y.cert diff --git a/minimal-examples/http-server/minimal-http-server-tls/localhost-100y.key b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/localhost-100y.key similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls/localhost-100y.key rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls/localhost-100y.key diff --git a/minimal-examples/http-server/minimal-http-server-tls/minimal-http-server-tls.c b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/minimal-http-server-tls.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls/minimal-http-server-tls.c rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls/minimal-http-server-tls.c diff --git a/minimal-examples/http-server/minimal-http-server-tls/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/404.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls/mount-origin/404.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/404.html diff --git a/minimal-examples/http-server/minimal-http-server-tls/mount-origin/example.js b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/example.js similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls/mount-origin/example.js rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/example.js diff --git a/minimal-examples/http-server/minimal-http-server-tls/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls/mount-origin/favicon.ico rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/favicon.ico diff --git a/minimal-examples/http-server/minimal-http-server-tls/mount-origin/http2.png b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/http2.png similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls/mount-origin/http2.png rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/http2.png diff --git a/minimal-examples/http-server/minimal-http-server-tls/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/index.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls/mount-origin/index.html rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/index.html diff --git a/minimal-examples/http-server/minimal-http-server-tls/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/http-server/minimal-http-server-tls/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server-tls/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server-tls/mount-origin/strict-csp.svg diff --git a/minimal-examples/http-server/minimal-http-server/CMakeLists.txt b/minimal-examples-lowlevel/http-server/minimal-http-server/CMakeLists.txt similarity index 100% rename from minimal-examples/http-server/minimal-http-server/CMakeLists.txt rename to minimal-examples-lowlevel/http-server/minimal-http-server/CMakeLists.txt diff --git a/minimal-examples/http-server/minimal-http-server/README.md b/minimal-examples-lowlevel/http-server/minimal-http-server/README.md similarity index 100% rename from minimal-examples/http-server/minimal-http-server/README.md rename to minimal-examples-lowlevel/http-server/minimal-http-server/README.md diff --git a/minimal-examples/http-server/minimal-http-server/minimal-http-server.c b/minimal-examples-lowlevel/http-server/minimal-http-server/minimal-http-server.c similarity index 100% rename from minimal-examples/http-server/minimal-http-server/minimal-http-server.c rename to minimal-examples-lowlevel/http-server/minimal-http-server/minimal-http-server.c diff --git a/minimal-examples/http-server/minimal-http-server/mount-origin/404.html b/minimal-examples-lowlevel/http-server/minimal-http-server/mount-origin/404.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server/mount-origin/404.html rename to minimal-examples-lowlevel/http-server/minimal-http-server/mount-origin/404.html diff --git a/minimal-examples/http-server/minimal-http-server/mount-origin/favicon.ico b/minimal-examples-lowlevel/http-server/minimal-http-server/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/http-server/minimal-http-server/mount-origin/favicon.ico rename to minimal-examples-lowlevel/http-server/minimal-http-server/mount-origin/favicon.ico diff --git a/minimal-examples/http-server/minimal-http-server/mount-origin/index.html b/minimal-examples-lowlevel/http-server/minimal-http-server/mount-origin/index.html similarity index 100% rename from minimal-examples/http-server/minimal-http-server/mount-origin/index.html rename to minimal-examples-lowlevel/http-server/minimal-http-server/mount-origin/index.html diff --git a/minimal-examples/http-server/minimal-http-server/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/http-server/minimal-http-server/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/http-server/minimal-http-server/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/http-server/minimal-http-server/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/http-server/minimal-http-server/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/http-server/minimal-http-server/mount-origin/strict-csp.svg diff --git a/minimal-examples/mqtt-client/README.md b/minimal-examples-lowlevel/mqtt-client/README.md similarity index 100% rename from minimal-examples/mqtt-client/README.md rename to minimal-examples-lowlevel/mqtt-client/README.md diff --git a/minimal-examples/mqtt-client/minimal-mqtt-client-multi/CMakeLists.txt b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/CMakeLists.txt similarity index 100% rename from minimal-examples/mqtt-client/minimal-mqtt-client-multi/CMakeLists.txt rename to minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/CMakeLists.txt diff --git a/minimal-examples/mqtt-client/minimal-mqtt-client-multi/README.md b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/README.md similarity index 100% rename from minimal-examples/mqtt-client/minimal-mqtt-client-multi/README.md rename to minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/README.md diff --git a/minimal-examples/mqtt-client/minimal-mqtt-client-multi/minimal-mqtt-client-multi.c b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/minimal-mqtt-client-multi.c similarity index 100% rename from minimal-examples/mqtt-client/minimal-mqtt-client-multi/minimal-mqtt-client-multi.c rename to minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/minimal-mqtt-client-multi.c diff --git a/minimal-examples/mqtt-client/minimal-mqtt-client-multi/selftest.sh.broken-on-travis b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/selftest.sh.broken-on-travis similarity index 100% rename from minimal-examples/mqtt-client/minimal-mqtt-client-multi/selftest.sh.broken-on-travis rename to minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/selftest.sh.broken-on-travis diff --git a/minimal-examples/mqtt-client/minimal-mqtt-client-multi/warmcat.com.cer b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/warmcat.com.cer similarity index 100% rename from minimal-examples/mqtt-client/minimal-mqtt-client-multi/warmcat.com.cer rename to minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/warmcat.com.cer diff --git a/minimal-examples/mqtt-client/minimal-mqtt-client-multi/wget-log b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/wget-log similarity index 100% rename from minimal-examples/mqtt-client/minimal-mqtt-client-multi/wget-log rename to minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client-multi/wget-log diff --git a/minimal-examples/mqtt-client/minimal-mqtt-client/CMakeLists.txt b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/CMakeLists.txt similarity index 100% rename from minimal-examples/mqtt-client/minimal-mqtt-client/CMakeLists.txt rename to minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/CMakeLists.txt diff --git a/minimal-examples/mqtt-client/minimal-mqtt-client/README.md b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/README.md similarity index 100% rename from minimal-examples/mqtt-client/minimal-mqtt-client/README.md rename to minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/README.md diff --git a/minimal-examples/mqtt-client/minimal-mqtt-client/minimal-mqtt-client.c b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/minimal-mqtt-client.c similarity index 100% rename from minimal-examples/mqtt-client/minimal-mqtt-client/minimal-mqtt-client.c rename to minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/minimal-mqtt-client.c diff --git a/minimal-examples/mqtt-client/minimal-mqtt-client/mosq-ca.crt b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/mosq-ca.crt similarity index 100% rename from minimal-examples/mqtt-client/minimal-mqtt-client/mosq-ca.crt rename to minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/mosq-ca.crt diff --git a/minimal-examples/mqtt-client/minimal-mqtt-client/mosq-server.crt b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/mosq-server.crt similarity index 100% rename from minimal-examples/mqtt-client/minimal-mqtt-client/mosq-server.crt rename to minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/mosq-server.crt diff --git a/minimal-examples/mqtt-client/minimal-mqtt-client/mosq-server.key b/minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/mosq-server.key similarity index 100% rename from minimal-examples/mqtt-client/minimal-mqtt-client/mosq-server.key rename to minimal-examples-lowlevel/mqtt-client/minimal-mqtt-client/mosq-server.key diff --git a/minimal-examples/raw/README.md b/minimal-examples-lowlevel/raw/README.md similarity index 100% rename from minimal-examples/raw/README.md rename to minimal-examples-lowlevel/raw/README.md diff --git a/minimal-examples/raw/minimal-raw-adopt-tcp/CMakeLists.txt b/minimal-examples-lowlevel/raw/minimal-raw-adopt-tcp/CMakeLists.txt similarity index 100% rename from minimal-examples/raw/minimal-raw-adopt-tcp/CMakeLists.txt rename to minimal-examples-lowlevel/raw/minimal-raw-adopt-tcp/CMakeLists.txt diff --git a/minimal-examples/raw/minimal-raw-adopt-tcp/README.md b/minimal-examples-lowlevel/raw/minimal-raw-adopt-tcp/README.md similarity index 100% rename from minimal-examples/raw/minimal-raw-adopt-tcp/README.md rename to minimal-examples-lowlevel/raw/minimal-raw-adopt-tcp/README.md diff --git a/minimal-examples/raw/minimal-raw-adopt-tcp/minimal-raw-adopt-tcp.c b/minimal-examples-lowlevel/raw/minimal-raw-adopt-tcp/minimal-raw-adopt-tcp.c similarity index 100% rename from minimal-examples/raw/minimal-raw-adopt-tcp/minimal-raw-adopt-tcp.c rename to minimal-examples-lowlevel/raw/minimal-raw-adopt-tcp/minimal-raw-adopt-tcp.c diff --git a/minimal-examples/raw/minimal-raw-adopt-udp/CMakeLists.txt b/minimal-examples-lowlevel/raw/minimal-raw-adopt-udp/CMakeLists.txt similarity index 100% rename from minimal-examples/raw/minimal-raw-adopt-udp/CMakeLists.txt rename to minimal-examples-lowlevel/raw/minimal-raw-adopt-udp/CMakeLists.txt diff --git a/minimal-examples/raw/minimal-raw-adopt-udp/README.md b/minimal-examples-lowlevel/raw/minimal-raw-adopt-udp/README.md similarity index 100% rename from minimal-examples/raw/minimal-raw-adopt-udp/README.md rename to minimal-examples-lowlevel/raw/minimal-raw-adopt-udp/README.md diff --git a/minimal-examples/raw/minimal-raw-adopt-udp/minimal-raw-adopt-udp.c b/minimal-examples-lowlevel/raw/minimal-raw-adopt-udp/minimal-raw-adopt-udp.c similarity index 100% rename from minimal-examples/raw/minimal-raw-adopt-udp/minimal-raw-adopt-udp.c rename to minimal-examples-lowlevel/raw/minimal-raw-adopt-udp/minimal-raw-adopt-udp.c diff --git a/minimal-examples/raw/minimal-raw-audio/CMakeLists.txt b/minimal-examples-lowlevel/raw/minimal-raw-audio/CMakeLists.txt similarity index 100% rename from minimal-examples/raw/minimal-raw-audio/CMakeLists.txt rename to minimal-examples-lowlevel/raw/minimal-raw-audio/CMakeLists.txt diff --git a/minimal-examples/raw/minimal-raw-audio/README.md b/minimal-examples-lowlevel/raw/minimal-raw-audio/README.md similarity index 100% rename from minimal-examples/raw/minimal-raw-audio/README.md rename to minimal-examples-lowlevel/raw/minimal-raw-audio/README.md diff --git a/minimal-examples/raw/minimal-raw-audio/audio.c b/minimal-examples-lowlevel/raw/minimal-raw-audio/audio.c similarity index 100% rename from minimal-examples/raw/minimal-raw-audio/audio.c rename to minimal-examples-lowlevel/raw/minimal-raw-audio/audio.c diff --git a/minimal-examples/raw/minimal-raw-fallback-http-server/CMakeLists.txt b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/CMakeLists.txt similarity index 100% rename from minimal-examples/raw/minimal-raw-fallback-http-server/CMakeLists.txt rename to minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/CMakeLists.txt diff --git a/minimal-examples/raw/minimal-raw-fallback-http-server/README.md b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/README.md similarity index 100% rename from minimal-examples/raw/minimal-raw-fallback-http-server/README.md rename to minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/README.md diff --git a/minimal-examples/raw/minimal-raw-fallback-http-server/localhost-100y.cert b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/localhost-100y.cert similarity index 100% rename from minimal-examples/raw/minimal-raw-fallback-http-server/localhost-100y.cert rename to minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/localhost-100y.cert diff --git a/minimal-examples/raw/minimal-raw-fallback-http-server/localhost-100y.key b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/localhost-100y.key similarity index 100% rename from minimal-examples/raw/minimal-raw-fallback-http-server/localhost-100y.key rename to minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/localhost-100y.key diff --git a/minimal-examples/raw/minimal-raw-fallback-http-server/minimal-raw-fallback-http-server.c b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/minimal-raw-fallback-http-server.c similarity index 100% rename from minimal-examples/raw/minimal-raw-fallback-http-server/minimal-raw-fallback-http-server.c rename to minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/minimal-raw-fallback-http-server.c diff --git a/minimal-examples/raw/minimal-raw-fallback-http-server/mount-origin/404.html b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/mount-origin/404.html similarity index 100% rename from minimal-examples/raw/minimal-raw-fallback-http-server/mount-origin/404.html rename to minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/mount-origin/404.html diff --git a/minimal-examples/raw/minimal-raw-fallback-http-server/mount-origin/favicon.ico b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/raw/minimal-raw-fallback-http-server/mount-origin/favicon.ico rename to minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/mount-origin/favicon.ico diff --git a/minimal-examples/raw/minimal-raw-fallback-http-server/mount-origin/index.html b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/mount-origin/index.html similarity index 100% rename from minimal-examples/raw/minimal-raw-fallback-http-server/mount-origin/index.html rename to minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/mount-origin/index.html diff --git a/minimal-examples/raw/minimal-raw-fallback-http-server/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/raw/minimal-raw-fallback-http-server/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/raw/minimal-raw-fallback-http-server/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/raw/minimal-raw-fallback-http-server/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/raw/minimal-raw-fallback-http-server/mount-origin/strict-csp.svg diff --git a/minimal-examples/raw/minimal-raw-file/CMakeLists.txt b/minimal-examples-lowlevel/raw/minimal-raw-file/CMakeLists.txt similarity index 100% rename from minimal-examples/raw/minimal-raw-file/CMakeLists.txt rename to minimal-examples-lowlevel/raw/minimal-raw-file/CMakeLists.txt diff --git a/minimal-examples/raw/minimal-raw-file/README.md b/minimal-examples-lowlevel/raw/minimal-raw-file/README.md similarity index 100% rename from minimal-examples/raw/minimal-raw-file/README.md rename to minimal-examples-lowlevel/raw/minimal-raw-file/README.md diff --git a/minimal-examples/raw/minimal-raw-file/minimal-raw-file.c b/minimal-examples-lowlevel/raw/minimal-raw-file/minimal-raw-file.c similarity index 100% rename from minimal-examples/raw/minimal-raw-file/minimal-raw-file.c rename to minimal-examples-lowlevel/raw/minimal-raw-file/minimal-raw-file.c diff --git a/minimal-examples/raw/minimal-raw-netcat/CMakeLists.txt b/minimal-examples-lowlevel/raw/minimal-raw-netcat/CMakeLists.txt similarity index 100% rename from minimal-examples/raw/minimal-raw-netcat/CMakeLists.txt rename to minimal-examples-lowlevel/raw/minimal-raw-netcat/CMakeLists.txt diff --git a/minimal-examples/raw/minimal-raw-netcat/README.md b/minimal-examples-lowlevel/raw/minimal-raw-netcat/README.md similarity index 100% rename from minimal-examples/raw/minimal-raw-netcat/README.md rename to minimal-examples-lowlevel/raw/minimal-raw-netcat/README.md diff --git a/minimal-examples/raw/minimal-raw-netcat/minimal-raw-netcat.c b/minimal-examples-lowlevel/raw/minimal-raw-netcat/minimal-raw-netcat.c similarity index 100% rename from minimal-examples/raw/minimal-raw-netcat/minimal-raw-netcat.c rename to minimal-examples-lowlevel/raw/minimal-raw-netcat/minimal-raw-netcat.c diff --git a/minimal-examples/raw/minimal-raw-proxy-fallback/CMakeLists.txt b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/CMakeLists.txt similarity index 100% rename from minimal-examples/raw/minimal-raw-proxy-fallback/CMakeLists.txt rename to minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/CMakeLists.txt diff --git a/minimal-examples/raw/minimal-raw-proxy-fallback/README.md b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/README.md similarity index 100% rename from minimal-examples/raw/minimal-raw-proxy-fallback/README.md rename to minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/README.md diff --git a/minimal-examples/raw/minimal-raw-proxy-fallback/localhost-100y.cert b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/localhost-100y.cert similarity index 100% rename from minimal-examples/raw/minimal-raw-proxy-fallback/localhost-100y.cert rename to minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/localhost-100y.cert diff --git a/minimal-examples/raw/minimal-raw-proxy-fallback/localhost-100y.key b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/localhost-100y.key similarity index 100% rename from minimal-examples/raw/minimal-raw-proxy-fallback/localhost-100y.key rename to minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/localhost-100y.key diff --git a/minimal-examples/raw/minimal-raw-proxy-fallback/minimal-raw-proxy-fallback.c b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/minimal-raw-proxy-fallback.c similarity index 100% rename from minimal-examples/raw/minimal-raw-proxy-fallback/minimal-raw-proxy-fallback.c rename to minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/minimal-raw-proxy-fallback.c diff --git a/minimal-examples/raw/minimal-raw-proxy-fallback/mount-origin/404.html b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/mount-origin/404.html similarity index 100% rename from minimal-examples/raw/minimal-raw-proxy-fallback/mount-origin/404.html rename to minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/mount-origin/404.html diff --git a/minimal-examples/raw/minimal-raw-proxy-fallback/mount-origin/favicon.ico b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/raw/minimal-raw-proxy-fallback/mount-origin/favicon.ico rename to minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/mount-origin/favicon.ico diff --git a/minimal-examples/raw/minimal-raw-proxy-fallback/mount-origin/index.html b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/mount-origin/index.html similarity index 100% rename from minimal-examples/raw/minimal-raw-proxy-fallback/mount-origin/index.html rename to minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/mount-origin/index.html diff --git a/minimal-examples/raw/minimal-raw-proxy-fallback/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/raw/minimal-raw-proxy-fallback/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/raw/minimal-raw-proxy-fallback/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/raw/minimal-raw-proxy-fallback/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/raw/minimal-raw-proxy-fallback/mount-origin/strict-csp.svg diff --git a/minimal-examples/raw/minimal-raw-proxy/CMakeLists.txt b/minimal-examples-lowlevel/raw/minimal-raw-proxy/CMakeLists.txt similarity index 100% rename from minimal-examples/raw/minimal-raw-proxy/CMakeLists.txt rename to minimal-examples-lowlevel/raw/minimal-raw-proxy/CMakeLists.txt diff --git a/minimal-examples/raw/minimal-raw-proxy/README.md b/minimal-examples-lowlevel/raw/minimal-raw-proxy/README.md similarity index 100% rename from minimal-examples/raw/minimal-raw-proxy/README.md rename to minimal-examples-lowlevel/raw/minimal-raw-proxy/README.md diff --git a/minimal-examples/raw/minimal-raw-proxy/minimal-raw-proxy.c b/minimal-examples-lowlevel/raw/minimal-raw-proxy/minimal-raw-proxy.c similarity index 100% rename from minimal-examples/raw/minimal-raw-proxy/minimal-raw-proxy.c rename to minimal-examples-lowlevel/raw/minimal-raw-proxy/minimal-raw-proxy.c diff --git a/minimal-examples/raw/minimal-raw-serial/CMakeLists.txt b/minimal-examples-lowlevel/raw/minimal-raw-serial/CMakeLists.txt similarity index 100% rename from minimal-examples/raw/minimal-raw-serial/CMakeLists.txt rename to minimal-examples-lowlevel/raw/minimal-raw-serial/CMakeLists.txt diff --git a/minimal-examples/raw/minimal-raw-serial/README.md b/minimal-examples-lowlevel/raw/minimal-raw-serial/README.md similarity index 100% rename from minimal-examples/raw/minimal-raw-serial/README.md rename to minimal-examples-lowlevel/raw/minimal-raw-serial/README.md diff --git a/minimal-examples/raw/minimal-raw-serial/minimal-raw-file.c b/minimal-examples-lowlevel/raw/minimal-raw-serial/minimal-raw-file.c similarity index 100% rename from minimal-examples/raw/minimal-raw-serial/minimal-raw-file.c rename to minimal-examples-lowlevel/raw/minimal-raw-serial/minimal-raw-file.c diff --git a/minimal-examples/raw/minimal-raw-vhost/CMakeLists.txt b/minimal-examples-lowlevel/raw/minimal-raw-vhost/CMakeLists.txt similarity index 100% rename from minimal-examples/raw/minimal-raw-vhost/CMakeLists.txt rename to minimal-examples-lowlevel/raw/minimal-raw-vhost/CMakeLists.txt diff --git a/minimal-examples/raw/minimal-raw-vhost/README.md b/minimal-examples-lowlevel/raw/minimal-raw-vhost/README.md similarity index 100% rename from minimal-examples/raw/minimal-raw-vhost/README.md rename to minimal-examples-lowlevel/raw/minimal-raw-vhost/README.md diff --git a/minimal-examples/raw/minimal-raw-vhost/localhost-100y.cert b/minimal-examples-lowlevel/raw/minimal-raw-vhost/localhost-100y.cert similarity index 100% rename from minimal-examples/raw/minimal-raw-vhost/localhost-100y.cert rename to minimal-examples-lowlevel/raw/minimal-raw-vhost/localhost-100y.cert diff --git a/minimal-examples/raw/minimal-raw-vhost/localhost-100y.key b/minimal-examples-lowlevel/raw/minimal-raw-vhost/localhost-100y.key similarity index 100% rename from minimal-examples/raw/minimal-raw-vhost/localhost-100y.key rename to minimal-examples-lowlevel/raw/minimal-raw-vhost/localhost-100y.key diff --git a/minimal-examples/raw/minimal-raw-vhost/minimal-raw-vhost.c b/minimal-examples-lowlevel/raw/minimal-raw-vhost/minimal-raw-vhost.c similarity index 100% rename from minimal-examples/raw/minimal-raw-vhost/minimal-raw-vhost.c rename to minimal-examples-lowlevel/raw/minimal-raw-vhost/minimal-raw-vhost.c diff --git a/minimal-examples/secure-streams/README.md b/minimal-examples-lowlevel/secure-streams/README.md similarity index 100% rename from minimal-examples/secure-streams/README.md rename to minimal-examples-lowlevel/secure-streams/README.md diff --git a/minimal-examples/secure-streams/minimal-secure-streams-alexa/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/CMakeLists.txt similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-alexa/CMakeLists.txt rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/CMakeLists.txt diff --git a/minimal-examples/secure-streams/minimal-secure-streams-alexa/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/README.md similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-alexa/README.md rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/README.md diff --git a/minimal-examples/secure-streams/minimal-secure-streams-alexa/alexa.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/alexa.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-alexa/alexa.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/alexa.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-alexa/alexa_linux.ppn b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/alexa_linux.ppn similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-alexa/alexa_linux.ppn rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/alexa_linux.ppn diff --git a/minimal-examples/secure-streams/minimal-secure-streams-alexa/audio.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/audio.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-alexa/audio.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/audio.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-alexa/main.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/main.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-alexa/main.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/main.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-alexa/porcupine_params.pv b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/porcupine_params.pv similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-alexa/porcupine_params.pv rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/porcupine_params.pv diff --git a/minimal-examples/secure-streams/minimal-secure-streams-alexa/private.h b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/private.h similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-alexa/private.h rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-alexa/private.h diff --git a/minimal-examples/secure-streams/minimal-secure-streams-avs/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-avs/CMakeLists.txt similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-avs/CMakeLists.txt rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-avs/CMakeLists.txt diff --git a/minimal-examples/secure-streams/minimal-secure-streams-avs/avs.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-avs/avs.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-avs/avs.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-avs/avs.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-avs/main-client.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-avs/main-client.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-avs/main-client.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-avs/main-client.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-avs/main.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-avs/main.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-avs/main.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-avs/main.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-avs/year.wav b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-avs/year.wav similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-avs/year.wav rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-avs/year.wav diff --git a/minimal-examples/secure-streams/minimal-secure-streams-binance/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-binance/CMakeLists.txt similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-binance/CMakeLists.txt rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-binance/CMakeLists.txt diff --git a/minimal-examples/secure-streams/minimal-secure-streams-binance/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-binance/README.md similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-binance/README.md rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-binance/README.md diff --git a/minimal-examples/secure-streams/minimal-secure-streams-binance/main.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-binance/main.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-binance/main.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-binance/main.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-binance/policy.json b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-binance/policy.json similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-binance/policy.json rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-binance/policy.json diff --git a/minimal-examples/secure-streams/minimal-secure-streams-blob/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-blob/CMakeLists.txt similarity index 95% rename from minimal-examples/secure-streams/minimal-secure-streams-blob/CMakeLists.txt rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-blob/CMakeLists.txt index ceb2d15fa..27d0b533d 100644 --- a/minimal-examples/secure-streams/minimal-secure-streams-blob/CMakeLists.txt +++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-blob/CMakeLists.txt @@ -51,7 +51,7 @@ if (requirements) set_tests_properties(ssblob-warmcat PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/secure-streams/minimal-secure-streams + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams TIMEOUT 40) if (DEFINED ENV{SAI_OVN}) set_tests_properties(ssblob-warmcat PROPERTIES FIXTURES_REQUIRED "res_sspcmin") @@ -102,7 +102,7 @@ if (requirements) endif() set_tests_properties(sspcblob-minimal PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/secure-streams/minimal-secure-streams-blob + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-blob FIXTURES_REQUIRED "${fixlist}" TIMEOUT 70) diff --git a/minimal-examples/secure-streams/minimal-secure-streams-blob/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-blob/README.md similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-blob/README.md rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-blob/README.md diff --git a/minimal-examples/secure-streams/minimal-secure-streams-blob/minimal-secure-streams.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-blob/minimal-secure-streams.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-blob/minimal-secure-streams.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-blob/minimal-secure-streams.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-client-tx/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-client-tx/CMakeLists.txt similarity index 95% rename from minimal-examples/secure-streams/minimal-secure-streams-client-tx/CMakeLists.txt rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-client-tx/CMakeLists.txt index 1a943b939..b57e6fe71 100644 --- a/minimal-examples/secure-streams/minimal-secure-streams-client-tx/CMakeLists.txt +++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-client-tx/CMakeLists.txt @@ -60,7 +60,7 @@ if (requirements) add_test(NAME sspc-minimaltx COMMAND lws-minimal-secure-streams-client-tx -i +${CTEST_SOCKET_PATH}) endif() set_tests_properties(sspc-minimaltx PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/secure-streams/minimal-secure-streams-client-tx + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-client-tx FIXTURES_REQUIRED "ssproxyctx" TIMEOUT 40) diff --git a/minimal-examples/secure-streams/minimal-secure-streams-client-tx/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-client-tx/README.md similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-client-tx/README.md rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-client-tx/README.md diff --git a/minimal-examples/secure-streams/minimal-secure-streams-client-tx/minimal-secure-streams-client-tx.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-client-tx/minimal-secure-streams-client-tx.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-client-tx/minimal-secure-streams-client-tx.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-client-tx/minimal-secure-streams-client-tx.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-cpp/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-cpp/CMakeLists.txt similarity index 93% rename from minimal-examples/secure-streams/minimal-secure-streams-cpp/CMakeLists.txt rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-cpp/CMakeLists.txt index 1f26c572c..f86e75d9f 100644 --- a/minimal-examples/secure-streams/minimal-secure-streams-cpp/CMakeLists.txt +++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-cpp/CMakeLists.txt @@ -22,7 +22,7 @@ if (requirements) add_test(NAME sscpp-warmcat COMMAND lws-minimal-secure-streams-cpp) set_tests_properties(sscpp-warmcat PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/secure-streams/minimal-secure-streams-cpp + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-cpp TIMEOUT 20) endif() diff --git a/minimal-examples/secure-streams/minimal-secure-streams-cpp/main.cxx b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-cpp/main.cxx similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-cpp/main.cxx rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-cpp/main.cxx diff --git a/minimal-examples/secure-streams/minimal-secure-streams-custom-client-transport/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/CMakeLists.txt similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-custom-client-transport/CMakeLists.txt rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/CMakeLists.txt diff --git a/minimal-examples/secure-streams/minimal-secure-streams-custom-client-transport/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/README.md similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-custom-client-transport/README.md rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/README.md diff --git a/minimal-examples/secure-streams/minimal-secure-streams-custom-client-transport/app-event-loop.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/app-event-loop.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-custom-client-transport/app-event-loop.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/app-event-loop.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-custom-client-transport/binance-ss.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/binance-ss.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-custom-client-transport/binance-ss.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/binance-ss.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-custom-client-transport/main.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/main.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-custom-client-transport/main.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/main.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-custom-client-transport/policy.json b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/policy.json similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-custom-client-transport/policy.json rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/policy.json diff --git a/minimal-examples/secure-streams/minimal-secure-streams-custom-client-transport/private.h b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/private.h similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-custom-client-transport/private.h rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/private.h diff --git a/minimal-examples/secure-streams/minimal-secure-streams-custom-client-transport/system.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/system.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-custom-client-transport/system.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/system.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-custom-client-transport/transport-serial.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/transport-serial.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-custom-client-transport/transport-serial.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-custom-client-transport/transport-serial.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-hugeurl/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-hugeurl/CMakeLists.txt similarity index 95% rename from minimal-examples/secure-streams/minimal-secure-streams-hugeurl/CMakeLists.txt rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-hugeurl/CMakeLists.txt index e0ac200c5..ff6cc6a72 100644 --- a/minimal-examples/secure-streams/minimal-secure-streams-hugeurl/CMakeLists.txt +++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-hugeurl/CMakeLists.txt @@ -50,7 +50,7 @@ if (requirements) set_tests_properties(ss-warmcat-hurl PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/secure-streams/minimal-secure-streams + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams TIMEOUT 20) if (DEFINED ENV{SAI_OVN}) set_tests_properties(ss-warmcat-hurl PROPERTIES FIXTURES_REQUIRED "res_sspcmin_hurl") @@ -101,7 +101,7 @@ if (requirements) endif() set_tests_properties(sspc-minimal-hurl PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/secure-streams/minimal-secure-streams + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams FIXTURES_REQUIRED "${fixlist}" TIMEOUT 40) diff --git a/minimal-examples/secure-streams/minimal-secure-streams-hugeurl/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-hugeurl/README.md similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-hugeurl/README.md rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-hugeurl/README.md diff --git a/minimal-examples/secure-streams/minimal-secure-streams-hugeurl/minimal-secure-streams.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-hugeurl/minimal-secure-streams.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-hugeurl/minimal-secure-streams.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-hugeurl/minimal-secure-streams.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-metadata/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-metadata/CMakeLists.txt similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-metadata/CMakeLists.txt rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-metadata/CMakeLists.txt diff --git a/minimal-examples/secure-streams/minimal-secure-streams-metadata/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-metadata/README.md similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-metadata/README.md rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-metadata/README.md diff --git a/minimal-examples/secure-streams/minimal-secure-streams-metadata/minimal-secure-streams.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-metadata/minimal-secure-streams.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-metadata/minimal-secure-streams.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-metadata/minimal-secure-streams.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-metrics-proxy/metrics-proxy-policy.json b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-metrics-proxy/metrics-proxy-policy.json similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-metrics-proxy/metrics-proxy-policy.json rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-metrics-proxy/metrics-proxy-policy.json diff --git a/minimal-examples/secure-streams/minimal-secure-streams-perf/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-perf/CMakeLists.txt similarity index 95% rename from minimal-examples/secure-streams/minimal-secure-streams-perf/CMakeLists.txt rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-perf/CMakeLists.txt index c0beb2686..3cb8cb0df 100644 --- a/minimal-examples/secure-streams/minimal-secure-streams-perf/CMakeLists.txt +++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-perf/CMakeLists.txt @@ -50,7 +50,7 @@ if (requirements) set_tests_properties(ssperf-warmcat PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/secure-streams/minimal-secure-streams + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams TIMEOUT 40) if (DEFINED ENV{SAI_OVN}) set_tests_properties(ssperf-warmcat PROPERTIES FIXTURES_REQUIRED "res_ssperfpcmin") @@ -101,7 +101,7 @@ if (requirements) endif() set_tests_properties(ssperfpc-minimal PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/secure-streams/minimal-secure-streams-perf + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-perf FIXTURES_REQUIRED "${fixlist}" TIMEOUT 40) diff --git a/minimal-examples/secure-streams/minimal-secure-streams-perf/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-perf/README.md similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-perf/README.md rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-perf/README.md diff --git a/minimal-examples/secure-streams/minimal-secure-streams-perf/minimal-secure-streams.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-perf/minimal-secure-streams.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-perf/minimal-secure-streams.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-perf/minimal-secure-streams.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-policy2c/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-policy2c/CMakeLists.txt similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-policy2c/CMakeLists.txt rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-policy2c/CMakeLists.txt diff --git a/minimal-examples/secure-streams/minimal-secure-streams-policy2c/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-policy2c/README.md similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-policy2c/README.md rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-policy2c/README.md diff --git a/minimal-examples/secure-streams/minimal-secure-streams-policy2c/minimal-secure-streams.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-policy2c/minimal-secure-streams.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-policy2c/minimal-secure-streams.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-policy2c/minimal-secure-streams.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-post/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-post/CMakeLists.txt similarity index 94% rename from minimal-examples/secure-streams/minimal-secure-streams-post/CMakeLists.txt rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-post/CMakeLists.txt index 62404153f..e8c94393e 100644 --- a/minimal-examples/secure-streams/minimal-secure-streams-post/CMakeLists.txt +++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-post/CMakeLists.txt @@ -33,7 +33,7 @@ if (requirements) endif() set_tests_properties(sspost-warmcat PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/secure-streams/minimal-secure-streams-post + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-post TIMEOUT 20) endif() diff --git a/minimal-examples/secure-streams/minimal-secure-streams-post/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-post/README.md similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-post/README.md rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-post/README.md diff --git a/minimal-examples/secure-streams/minimal-secure-streams-post/minimal-secure-streams-post.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-post/minimal-secure-streams-post.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-post/minimal-secure-streams-post.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-post/minimal-secure-streams-post.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-proxy/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-proxy/CMakeLists.txt similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-proxy/CMakeLists.txt rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-proxy/CMakeLists.txt diff --git a/minimal-examples/secure-streams/minimal-secure-streams-custom-proxy-transport/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-proxy/README.md similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-custom-proxy-transport/README.md rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-proxy/README.md diff --git a/minimal-examples/secure-streams/minimal-secure-streams-proxy/main.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-proxy/main.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-proxy/main.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-proxy/main.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-seq/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-seq/CMakeLists.txt similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-seq/CMakeLists.txt rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-seq/CMakeLists.txt diff --git a/minimal-examples/secure-streams/minimal-secure-streams-seq/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-seq/README.md similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-seq/README.md rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-seq/README.md diff --git a/minimal-examples/secure-streams/minimal-secure-streams-seq/minimal-secure-streams.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-seq/minimal-secure-streams.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-seq/minimal-secure-streams.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-seq/minimal-secure-streams.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-server-raw/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server-raw/CMakeLists.txt similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-server-raw/CMakeLists.txt rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server-raw/CMakeLists.txt diff --git a/minimal-examples/secure-streams/minimal-secure-streams-server-raw/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server-raw/README.md similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-server-raw/README.md rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server-raw/README.md diff --git a/minimal-examples/secure-streams/minimal-secure-streams-server-raw/main.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server-raw/main.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-server-raw/main.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server-raw/main.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-server-raw/ss-server.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server-raw/ss-server.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-server-raw/ss-server.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server-raw/ss-server.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-server/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server/CMakeLists.txt similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-server/CMakeLists.txt rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server/CMakeLists.txt diff --git a/minimal-examples/secure-streams/minimal-secure-streams-server/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server/README.md similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-server/README.md rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server/README.md diff --git a/minimal-examples/secure-streams/minimal-secure-streams-server/main.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server/main.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-server/main.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server/main.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-server/ss-client.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server/ss-client.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-server/ss-client.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server/ss-client.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-server/ss-server.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server/ss-server.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-server/ss-server.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-server/ss-server.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-sigv4/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/CMakeLists.txt similarity index 93% rename from minimal-examples/secure-streams/minimal-secure-streams-sigv4/CMakeLists.txt rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/CMakeLists.txt index 47deb88f4..7a76fe869 100644 --- a/minimal-examples/secure-streams/minimal-secure-streams-sigv4/CMakeLists.txt +++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/CMakeLists.txt @@ -30,7 +30,7 @@ if (requirements) set_tests_properties(ss-sigv4 PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/secure-streams/minimal-secure-streams-sigv4 + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4 TIMEOUT 20) if (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR LWS_WITH_SECURE_STREAMS_PROXY_API) @@ -72,7 +72,7 @@ if (requirements) add_test(NAME sspc-sigv4 COMMAND lws-minimal-secure-streams-sigv4-client -i +${CTEST_SOCKET_PATH}) endif() set_tests_properties(sspc-sigv4 PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/secure-streams/minimal-secure-streams-sigv4 + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4 FIXTURES_REQUIRED "ssproxysigv4" TIMEOUT 40) diff --git a/minimal-examples/secure-streams/minimal-secure-streams-sigv4/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/README.md similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-sigv4/README.md rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/README.md diff --git a/minimal-examples/secure-streams/minimal-secure-streams-sigv4/policy.json b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/policy.json similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-sigv4/policy.json rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/policy.json diff --git a/minimal-examples/secure-streams/minimal-secure-streams-sigv4/ss-s3-main.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/ss-s3-main.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-sigv4/ss-s3-main.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/ss-s3-main.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-sigv4/ss-s3-put.h b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/ss-s3-put.h similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-sigv4/ss-s3-put.h rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/ss-s3-put.h diff --git a/minimal-examples/secure-streams/minimal-secure-streams-sigv4/ss-s3-ss.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/ss-s3-ss.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-sigv4/ss-s3-ss.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/ss-s3-ss.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-sigv4/static_policy.h b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/static_policy.h similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-sigv4/static_policy.h rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-sigv4/static_policy.h diff --git a/minimal-examples/secure-streams/minimal-secure-streams-smd/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd/CMakeLists.txt similarity index 94% rename from minimal-examples/secure-streams/minimal-secure-streams-smd/CMakeLists.txt rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd/CMakeLists.txt index db2f9ebc9..d5488deb9 100644 --- a/minimal-examples/secure-streams/minimal-secure-streams-smd/CMakeLists.txt +++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd/CMakeLists.txt @@ -32,7 +32,7 @@ if (requirements) endif() set_tests_properties(ss-smd PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/secure-streams/minimal-secure-streams-smd + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd TIMEOUT 10) if (has_fault_injection) @@ -68,7 +68,7 @@ if (requirements) ss-smd-fi2 ss-smd-fi3 PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/secure-streams/minimal-secure-streams-smd + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd TIMEOUT 5) endif() @@ -135,7 +135,7 @@ if (requirements) add_test(NAME sspcsmd_sspc COMMAND lws-minimal-secure-streams-smd-client -i +${CTEST_SOCKET_PATH}) endif() set_tests_properties(sspcsmd_sspc PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/secure-streams/minimal-secure-streams-smd + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd FIXTURES_REQUIRED "ssproxysmd_sspc" TIMEOUT 80) @@ -178,7 +178,7 @@ if (requirements) add_test(NAME mulsspcsmd_sspc COMMAND lws-minimal-secure-streams-smd-client -i +${CTEST_SOCKET_PATH} --multi -d1039) endif() set_tests_properties(mulsspcsmd_sspc PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/secure-streams/minimal-secure-streams-smd + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd FIXTURES_REQUIRED "mulssproxysmd_sspc" TIMEOUT 80) diff --git a/minimal-examples/secure-streams/minimal-secure-streams-smd/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd/README.md similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-smd/README.md rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd/README.md diff --git a/minimal-examples/secure-streams/minimal-secure-streams-smd/minimal-secure-streams-smd.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd/minimal-secure-streams-smd.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-smd/minimal-secure-streams-smd.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd/minimal-secure-streams-smd.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-smd/multi.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd/multi.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-smd/multi.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-smd/multi.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-staticpolicy/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-staticpolicy/CMakeLists.txt similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-staticpolicy/CMakeLists.txt rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-staticpolicy/CMakeLists.txt diff --git a/minimal-examples/secure-streams/minimal-secure-streams-staticpolicy/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-staticpolicy/README.md similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-staticpolicy/README.md rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-staticpolicy/README.md diff --git a/minimal-examples/secure-streams/minimal-secure-streams-staticpolicy/minimal-secure-streams.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-staticpolicy/minimal-secure-streams.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-staticpolicy/minimal-secure-streams.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-staticpolicy/minimal-secure-streams.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-staticpolicy/static-policy.h b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-staticpolicy/static-policy.h similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-staticpolicy/static-policy.h rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-staticpolicy/static-policy.h diff --git a/minimal-examples/secure-streams/minimal-secure-streams-staticpolicy/static-policy.json b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-staticpolicy/static-policy.json similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-staticpolicy/static-policy.json rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-staticpolicy/static-policy.json diff --git a/minimal-examples/secure-streams/minimal-secure-streams-stress/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-stress/CMakeLists.txt similarity index 82% rename from minimal-examples/secure-streams/minimal-secure-streams-stress/CMakeLists.txt rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-stress/CMakeLists.txt index 769eacef7..17e76e38c 100644 --- a/minimal-examples/secure-streams/minimal-secure-streams-stress/CMakeLists.txt +++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-stress/CMakeLists.txt @@ -31,10 +31,10 @@ if (requirements) # the time given in seconds or the sai-resource instance # exits, whichever happens first # - # If running under Sai, creates a lock test called "res_sspcmin" + # If running under Sai, creates a lock test called "res_sspcmin-stress" # - sai_resource(warmcat_conns 1 40 sspcmin) + sai_resource(warmcat_conns 1 40 sspcmin-stress) # # simple test not via proxy @@ -44,14 +44,14 @@ if (requirements) message("testing via valgrind") add_test(NAME ssstress-warmcat COMMAND ${VALGRIND} --tool=memcheck --leak-check=yes --num-callers=20 - $ -c 4 --budget 5) + $ -c 4 --budget 5 --timeout_ms 60000) else() - add_test(NAME ssstress-warmcat COMMAND lws-minimal-secure-streams-stress -c 4 --budget 5) + add_test(NAME ssstress-warmcat COMMAND lws-minimal-secure-streams-stress -c 4 --budget 5 --timeout_ms 50000) endif() set_tests_properties(ssstress-warmcat PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/secure-streams/minimal-secure-streams-stress + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-stress TIMEOUT 80) if (DEFINED ENV{SAI_OVN}) set_tests_properties(ssstress-warmcat PROPERTIES FIXTURES_REQUIRED "res_sspcmin") @@ -88,24 +88,24 @@ if (requirements) # the client part that will connect to the proxy # - if (VALGRIND) - message("testing via valgrind") - add_test(NAME sspc-minimalstress COMMAND - ${VALGRIND} --tool=memcheck --leak-check=yes --num-callers=20 - $ -i +${CTEST_SOCKET_PATH} -c 2 --budget 3) - else() - add_test(NAME sspc-minimalstress COMMAND lws-minimal-secure-streams-stress-client -i +${CTEST_SOCKET_PATH} -c 2 --budget 3) - endif() + # if (VALGRIND) + # message("testing via valgrind") + # add_test(NAME sspc-minimalstress COMMAND + # ${VALGRIND} --tool=memcheck --leak-check=yes --num-callers=20 + # $ -i +${CTEST_SOCKET_PATH} -c 2 --budget 3 --timeout_ms 60000) + # else() + add_test(NAME sspc-minimalstress COMMAND lws-minimal-secure-streams-stress-client -i +${CTEST_SOCKET_PATH} -c 2 --budget 3 --timeout_ms 50000) + # endif() set(fixlist "ssstressproxy") if (DEFINED ENV{SAI_OVN}) - list(APPEND fixlist "res_ssproxy") + list(APPEND fixlist "res_sspcmin-stress") endif() set_tests_properties(sspc-minimalstress PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/secure-streams/minimal-secure-streams-stress + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-stress FIXTURES_REQUIRED "${fixlist}" - TIMEOUT 80) + TIMEOUT 100) endif() diff --git a/minimal-examples/secure-streams/minimal-secure-streams-stress/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-stress/README.md similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-stress/README.md rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-stress/README.md diff --git a/minimal-examples/secure-streams/minimal-secure-streams-stress/minimal-secure-streams.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-stress/minimal-secure-streams.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-stress/minimal-secure-streams.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-stress/minimal-secure-streams.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-testsfail/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-testsfail/CMakeLists.txt similarity index 93% rename from minimal-examples/secure-streams/minimal-secure-streams-testsfail/CMakeLists.txt rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-testsfail/CMakeLists.txt index cd194e18d..ae2f2c827 100644 --- a/minimal-examples/secure-streams/minimal-secure-streams-testsfail/CMakeLists.txt +++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-testsfail/CMakeLists.txt @@ -30,7 +30,7 @@ if (requirements) set_tests_properties(ss-tf PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/secure-streams/minimal-secure-streams-testsfail + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-testsfail TIMEOUT 440) if (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR LWS_WITH_SECURE_STREAMS_PROXY_API) @@ -72,7 +72,7 @@ if (requirements) endif() set_tests_properties(sspc-minimaltf PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/secure-streams/minimal-secure-streams-testsfail + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-testsfail FIXTURES_REQUIRED "sstfproxy" TIMEOUT 440) diff --git a/minimal-examples/secure-streams/minimal-secure-streams-testsfail/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-testsfail/README.md similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-testsfail/README.md rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-testsfail/README.md diff --git a/minimal-examples/secure-streams/minimal-secure-streams-testsfail/minimal-secure-streams-testsfail.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-testsfail/minimal-secure-streams-testsfail.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-testsfail/minimal-secure-streams-testsfail.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-testsfail/minimal-secure-streams-testsfail.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams-threads/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-threads/CMakeLists.txt similarity index 95% rename from minimal-examples/secure-streams/minimal-secure-streams-threads/CMakeLists.txt rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-threads/CMakeLists.txt index 5272d8f70..9443dc2f8 100644 --- a/minimal-examples/secure-streams/minimal-secure-streams-threads/CMakeLists.txt +++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-threads/CMakeLists.txt @@ -32,7 +32,7 @@ if (requirements AND NOT WIN32) endif() set_tests_properties(ss-threads PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/secure-streams/minimal-secure-streams-threads + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-threads TIMEOUT 10) endif() @@ -95,7 +95,7 @@ if (requirements AND NOT WIN32) add_test(NAME sspcthreads_sspc COMMAND lws-minimal-secure-streams-threads-client -i +${CTEST_SOCKET_PATH}) endif() set_tests_properties(sspcthreads_sspc PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/secure-streams/minimal-secure-streams-threads + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-threads FIXTURES_REQUIRED "ssproxythreads_sspc" TIMEOUT 80) diff --git a/minimal-examples/secure-streams/minimal-secure-streams-threads/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-threads/README.md similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-threads/README.md rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-threads/README.md diff --git a/minimal-examples/secure-streams/minimal-secure-streams-threads/minimal-secure-streams-threads.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams-threads/minimal-secure-streams-threads.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-threads/minimal-secure-streams-threads.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams-threads/minimal-secure-streams-threads.c diff --git a/minimal-examples/secure-streams/minimal-secure-streams/CMakeLists.txt b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams/CMakeLists.txt similarity index 94% rename from minimal-examples/secure-streams/minimal-secure-streams/CMakeLists.txt rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams/CMakeLists.txt index 7f576ed26..bdf8ef62e 100644 --- a/minimal-examples/secure-streams/minimal-secure-streams/CMakeLists.txt +++ b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams/CMakeLists.txt @@ -52,7 +52,7 @@ if (requirements) set_tests_properties(ss-warmcat PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/secure-streams/minimal-secure-streams + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams TIMEOUT 40) if (DEFINED ENV{SAI_OVN}) set_tests_properties(ss-warmcat PROPERTIES FIXTURES_REQUIRED "res_sspcmin") @@ -82,7 +82,7 @@ if (requirements) set_tests_properties(ss-warmcat-fi1 ss-warmcat-fi2 PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/secure-streams/minimal-secure-streams + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams TIMEOUT 5) endif() @@ -133,7 +133,7 @@ if (requirements) endif() set_tests_properties(sspc-minimal PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/secure-streams/minimal-secure-streams + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/secure-streams/minimal-secure-streams FIXTURES_REQUIRED "${fixlist}" TIMEOUT 40) diff --git a/minimal-examples/secure-streams/minimal-secure-streams/README.md b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams/README.md similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams/README.md rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams/README.md diff --git a/minimal-examples/secure-streams/minimal-secure-streams/minimal-secure-streams.c b/minimal-examples-lowlevel/secure-streams/minimal-secure-streams/minimal-secure-streams.c similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams/minimal-secure-streams.c rename to minimal-examples-lowlevel/secure-streams/minimal-secure-streams/minimal-secure-streams.c diff --git a/minimal-examples/ws-client/README.md b/minimal-examples-lowlevel/ws-client/README.md similarity index 100% rename from minimal-examples/ws-client/README.md rename to minimal-examples-lowlevel/ws-client/README.md diff --git a/minimal-examples/ws-client/minimal-ws-client-binance/CMakeLists.txt b/minimal-examples-lowlevel/ws-client/minimal-ws-client-binance/CMakeLists.txt similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-binance/CMakeLists.txt rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-binance/CMakeLists.txt diff --git a/minimal-examples/ws-client/minimal-ws-client-binance/README.md b/minimal-examples-lowlevel/ws-client/minimal-ws-client-binance/README.md similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-binance/README.md rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-binance/README.md diff --git a/minimal-examples/ws-client/minimal-ws-client-binance/main.c b/minimal-examples-lowlevel/ws-client/minimal-ws-client-binance/main.c similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-binance/main.c rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-binance/main.c diff --git a/minimal-examples/ws-client/minimal-ws-client-echo/CMakeLists.txt b/minimal-examples-lowlevel/ws-client/minimal-ws-client-echo/CMakeLists.txt similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-echo/CMakeLists.txt rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-echo/CMakeLists.txt diff --git a/minimal-examples/ws-client/minimal-ws-client-echo/README.md b/minimal-examples-lowlevel/ws-client/minimal-ws-client-echo/README.md similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-echo/README.md rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-echo/README.md diff --git a/minimal-examples/ws-client/minimal-ws-client-echo/minimal-ws-client-echo.c b/minimal-examples-lowlevel/ws-client/minimal-ws-client-echo/minimal-ws-client-echo.c similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-echo/minimal-ws-client-echo.c rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-echo/minimal-ws-client-echo.c diff --git a/minimal-examples/ws-client/minimal-ws-client-echo/protocol_lws_minimal_client_echo.c b/minimal-examples-lowlevel/ws-client/minimal-ws-client-echo/protocol_lws_minimal_client_echo.c similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-echo/protocol_lws_minimal_client_echo.c rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-echo/protocol_lws_minimal_client_echo.c diff --git a/minimal-examples/ws-client/minimal-ws-client-ping/CMakeLists.txt b/minimal-examples-lowlevel/ws-client/minimal-ws-client-ping/CMakeLists.txt similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-ping/CMakeLists.txt rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-ping/CMakeLists.txt diff --git a/minimal-examples/ws-client/minimal-ws-client-ping/README.md b/minimal-examples-lowlevel/ws-client/minimal-ws-client-ping/README.md similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-ping/README.md rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-ping/README.md diff --git a/minimal-examples/ws-client/minimal-ws-client-ping/libwebsockets.org.cer b/minimal-examples-lowlevel/ws-client/minimal-ws-client-ping/libwebsockets.org.cer similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-ping/libwebsockets.org.cer rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-ping/libwebsockets.org.cer diff --git a/minimal-examples/ws-client/minimal-ws-client-ping/minimal-ws-client-ping.c b/minimal-examples-lowlevel/ws-client/minimal-ws-client-ping/minimal-ws-client-ping.c similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-ping/minimal-ws-client-ping.c rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-ping/minimal-ws-client-ping.c diff --git a/minimal-examples/ws-client/minimal-ws-client-pmd-bulk/CMakeLists.txt b/minimal-examples-lowlevel/ws-client/minimal-ws-client-pmd-bulk/CMakeLists.txt similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-pmd-bulk/CMakeLists.txt rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-pmd-bulk/CMakeLists.txt diff --git a/minimal-examples/ws-client/minimal-ws-client-pmd-bulk/README.md b/minimal-examples-lowlevel/ws-client/minimal-ws-client-pmd-bulk/README.md similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-pmd-bulk/README.md rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-pmd-bulk/README.md diff --git a/minimal-examples/ws-client/minimal-ws-client-pmd-bulk/minimal-ws-client-pmd-bulk.c b/minimal-examples-lowlevel/ws-client/minimal-ws-client-pmd-bulk/minimal-ws-client-pmd-bulk.c similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-pmd-bulk/minimal-ws-client-pmd-bulk.c rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-pmd-bulk/minimal-ws-client-pmd-bulk.c diff --git a/minimal-examples/ws-client/minimal-ws-client-pmd-bulk/protocol_lws_minimal_pmd_bulk.c b/minimal-examples-lowlevel/ws-client/minimal-ws-client-pmd-bulk/protocol_lws_minimal_pmd_bulk.c similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-pmd-bulk/protocol_lws_minimal_pmd_bulk.c rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-pmd-bulk/protocol_lws_minimal_pmd_bulk.c diff --git a/minimal-examples/ws-client/minimal-ws-client-rx/CMakeLists.txt b/minimal-examples-lowlevel/ws-client/minimal-ws-client-rx/CMakeLists.txt similarity index 89% rename from minimal-examples/ws-client/minimal-ws-client-rx/CMakeLists.txt rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-rx/CMakeLists.txt index faad60e49..043f9252c 100644 --- a/minimal-examples/ws-client/minimal-ws-client-rx/CMakeLists.txt +++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-rx/CMakeLists.txt @@ -18,7 +18,7 @@ if (requirements) add_test(NAME ws-client-rx-warmcat COMMAND lws-minimal-ws-client-rx -t) set_tests_properties(ws-client-rx-warmcat PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/ws-client/minimal-ws-client-rx + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/ws-client/minimal-ws-client-rx TIMEOUT 20) endif() diff --git a/minimal-examples/ws-client/minimal-ws-client-rx/README.md b/minimal-examples-lowlevel/ws-client/minimal-ws-client-rx/README.md similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-rx/README.md rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-rx/README.md diff --git a/minimal-examples/ws-client/minimal-ws-client-rx/libwebsockets.org.cer b/minimal-examples-lowlevel/ws-client/minimal-ws-client-rx/libwebsockets.org.cer similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-rx/libwebsockets.org.cer rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-rx/libwebsockets.org.cer diff --git a/minimal-examples/ws-client/minimal-ws-client-rx/minimal-ws-client.c b/minimal-examples-lowlevel/ws-client/minimal-ws-client-rx/minimal-ws-client.c similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-rx/minimal-ws-client.c rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-rx/minimal-ws-client.c diff --git a/minimal-examples/ws-client/minimal-ws-client-spam-tx-rx/CMakeLists.txt b/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam-tx-rx/CMakeLists.txt similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-spam-tx-rx/CMakeLists.txt rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-spam-tx-rx/CMakeLists.txt diff --git a/minimal-examples/ws-client/minimal-ws-client-spam-tx-rx/libwebsockets.org.cer b/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam-tx-rx/libwebsockets.org.cer similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-spam-tx-rx/libwebsockets.org.cer rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-spam-tx-rx/libwebsockets.org.cer diff --git a/minimal-examples/ws-client/minimal-ws-client-spam-tx-rx/minimal-ws-client.c b/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam-tx-rx/minimal-ws-client.c similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-spam-tx-rx/minimal-ws-client.c rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-spam-tx-rx/minimal-ws-client.c diff --git a/minimal-examples/ws-client/minimal-ws-client-spam/CMakeLists.txt b/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam/CMakeLists.txt similarity index 96% rename from minimal-examples/ws-client/minimal-ws-client-spam/CMakeLists.txt rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-spam/CMakeLists.txt index 34164e148..fc0402bfa 100644 --- a/minimal-examples/ws-client/minimal-ws-client-spam/CMakeLists.txt +++ b/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam/CMakeLists.txt @@ -71,7 +71,7 @@ endif() add_test(NAME ws-client-spam COMMAND lws-minimal-ws-client-spam --server localhost --port ${PORT_WCS_SRV} -l 32 -c 3) set_tests_properties(ws-client-spam PROPERTIES - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/ws-client/minimal-ws-client-spam + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam FIXTURES_REQUIRED "wcs_srv" TIMEOUT 40) endif() diff --git a/minimal-examples/ws-client/minimal-ws-client-spam/README.md b/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam/README.md similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-spam/README.md rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-spam/README.md diff --git a/minimal-examples/ws-client/minimal-ws-client-spam/libwebsockets.org.cer b/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam/libwebsockets.org.cer similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-spam/libwebsockets.org.cer rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-spam/libwebsockets.org.cer diff --git a/minimal-examples/ws-client/minimal-ws-client-spam/minimal-ws-client-spam.c b/minimal-examples-lowlevel/ws-client/minimal-ws-client-spam/minimal-ws-client-spam.c similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-spam/minimal-ws-client-spam.c rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-spam/minimal-ws-client-spam.c diff --git a/minimal-examples/ws-client/minimal-ws-client-tx/CMakeLists.txt b/minimal-examples-lowlevel/ws-client/minimal-ws-client-tx/CMakeLists.txt similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-tx/CMakeLists.txt rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-tx/CMakeLists.txt diff --git a/minimal-examples/ws-client/minimal-ws-client-tx/README.md b/minimal-examples-lowlevel/ws-client/minimal-ws-client-tx/README.md similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-tx/README.md rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-tx/README.md diff --git a/minimal-examples/ws-client/minimal-ws-client-tx/minimal-ws-client.c b/minimal-examples-lowlevel/ws-client/minimal-ws-client-tx/minimal-ws-client.c similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client-tx/minimal-ws-client.c rename to minimal-examples-lowlevel/ws-client/minimal-ws-client-tx/minimal-ws-client.c diff --git a/minimal-examples/ws-client/minimal-ws-client/CMakeLists.txt b/minimal-examples-lowlevel/ws-client/minimal-ws-client/CMakeLists.txt similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client/CMakeLists.txt rename to minimal-examples-lowlevel/ws-client/minimal-ws-client/CMakeLists.txt diff --git a/minimal-examples/ws-client/minimal-ws-client/README.md b/minimal-examples-lowlevel/ws-client/minimal-ws-client/README.md similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client/README.md rename to minimal-examples-lowlevel/ws-client/minimal-ws-client/README.md diff --git a/minimal-examples/ws-client/minimal-ws-client/libwebsockets.org.cer b/minimal-examples-lowlevel/ws-client/minimal-ws-client/libwebsockets.org.cer similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client/libwebsockets.org.cer rename to minimal-examples-lowlevel/ws-client/minimal-ws-client/libwebsockets.org.cer diff --git a/minimal-examples/ws-client/minimal-ws-client/minimal-ws-client.c b/minimal-examples-lowlevel/ws-client/minimal-ws-client/minimal-ws-client.c similarity index 100% rename from minimal-examples/ws-client/minimal-ws-client/minimal-ws-client.c rename to minimal-examples-lowlevel/ws-client/minimal-ws-client/minimal-ws-client.c diff --git a/minimal-examples/ws-server/README.md b/minimal-examples-lowlevel/ws-server/README.md similarity index 100% rename from minimal-examples/ws-server/README.md rename to minimal-examples-lowlevel/ws-server/README.md diff --git a/minimal-examples/ws-server/minimal-ws-broker/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/CMakeLists.txt similarity index 100% rename from minimal-examples/ws-server/minimal-ws-broker/CMakeLists.txt rename to minimal-examples-lowlevel/ws-server/minimal-ws-broker/CMakeLists.txt diff --git a/minimal-examples/ws-server/minimal-ws-broker/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/README.md similarity index 100% rename from minimal-examples/ws-server/minimal-ws-broker/README.md rename to minimal-examples-lowlevel/ws-server/minimal-ws-broker/README.md diff --git a/minimal-examples/ws-server/minimal-ws-broker/minimal-ws-broker.c b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/minimal-ws-broker.c similarity index 100% rename from minimal-examples/ws-server/minimal-ws-broker/minimal-ws-broker.c rename to minimal-examples-lowlevel/ws-server/minimal-ws-broker/minimal-ws-broker.c diff --git a/minimal-examples/ws-server/minimal-ws-broker/mount-origin/example.js b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/mount-origin/example.js similarity index 100% rename from minimal-examples/ws-server/minimal-ws-broker/mount-origin/example.js rename to minimal-examples-lowlevel/ws-server/minimal-ws-broker/mount-origin/example.js diff --git a/minimal-examples/ws-server/minimal-ws-broker/mount-origin/favicon.ico b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/ws-server/minimal-ws-broker/mount-origin/favicon.ico rename to minimal-examples-lowlevel/ws-server/minimal-ws-broker/mount-origin/favicon.ico diff --git a/minimal-examples/ws-server/minimal-ws-broker/mount-origin/index.html b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/mount-origin/index.html similarity index 100% rename from minimal-examples/ws-server/minimal-ws-broker/mount-origin/index.html rename to minimal-examples-lowlevel/ws-server/minimal-ws-broker/mount-origin/index.html diff --git a/minimal-examples/ws-server/minimal-ws-broker/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/ws-server/minimal-ws-broker/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/ws-server/minimal-ws-broker/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/ws-server/minimal-ws-broker/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/ws-server/minimal-ws-broker/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/ws-server/minimal-ws-broker/mount-origin/strict-csp.svg diff --git a/minimal-examples/ws-server/minimal-ws-broker/protocol_lws_minimal.c b/minimal-examples-lowlevel/ws-server/minimal-ws-broker/protocol_lws_minimal.c similarity index 100% rename from minimal-examples/ws-server/minimal-ws-broker/protocol_lws_minimal.c rename to minimal-examples-lowlevel/ws-server/minimal-ws-broker/protocol_lws_minimal.c diff --git a/minimal-examples/ws-server/minimal-ws-raw-proxy/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/CMakeLists.txt similarity index 100% rename from minimal-examples/ws-server/minimal-ws-raw-proxy/CMakeLists.txt rename to minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/CMakeLists.txt diff --git a/minimal-examples/ws-server/minimal-ws-raw-proxy/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/README.md similarity index 100% rename from minimal-examples/ws-server/minimal-ws-raw-proxy/README.md rename to minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/README.md diff --git a/minimal-examples/ws-server/minimal-ws-raw-proxy/localhost-100y.cert b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/localhost-100y.cert similarity index 100% rename from minimal-examples/ws-server/minimal-ws-raw-proxy/localhost-100y.cert rename to minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/localhost-100y.cert diff --git a/minimal-examples/ws-server/minimal-ws-raw-proxy/localhost-100y.key b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/localhost-100y.key similarity index 100% rename from minimal-examples/ws-server/minimal-ws-raw-proxy/localhost-100y.key rename to minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/localhost-100y.key diff --git a/minimal-examples/ws-server/minimal-ws-raw-proxy/minimal-ws-raw-proxy.c b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/minimal-ws-raw-proxy.c similarity index 100% rename from minimal-examples/ws-server/minimal-ws-raw-proxy/minimal-ws-raw-proxy.c rename to minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/minimal-ws-raw-proxy.c diff --git a/minimal-examples/ws-server/minimal-ws-raw-proxy/mount-origin/example.js b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/mount-origin/example.js similarity index 100% rename from minimal-examples/ws-server/minimal-ws-raw-proxy/mount-origin/example.js rename to minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/mount-origin/example.js diff --git a/minimal-examples/ws-server/minimal-ws-raw-proxy/mount-origin/favicon.ico b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/ws-server/minimal-ws-raw-proxy/mount-origin/favicon.ico rename to minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/mount-origin/favicon.ico diff --git a/minimal-examples/ws-server/minimal-ws-raw-proxy/mount-origin/index.html b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/mount-origin/index.html similarity index 100% rename from minimal-examples/ws-server/minimal-ws-raw-proxy/mount-origin/index.html rename to minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/mount-origin/index.html diff --git a/minimal-examples/ws-server/minimal-ws-raw-proxy/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/ws-server/minimal-ws-raw-proxy/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/ws-server/minimal-ws-raw-proxy/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/ws-server/minimal-ws-raw-proxy/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/ws-server/minimal-ws-raw-proxy/mount-origin/strict-csp.svg diff --git a/minimal-examples/ws-server/minimal-ws-server-echo/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-server-echo/CMakeLists.txt similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-echo/CMakeLists.txt rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-echo/CMakeLists.txt diff --git a/minimal-examples/ws-server/minimal-ws-server-echo/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-server-echo/README.md similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-echo/README.md rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-echo/README.md diff --git a/minimal-examples/ws-server/minimal-ws-server-echo/minimal-ws-server-echo.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-echo/minimal-ws-server-echo.c similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-echo/minimal-ws-server-echo.c rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-echo/minimal-ws-server-echo.c diff --git a/minimal-examples/ws-server/minimal-ws-server-echo/protocol_lws_minimal_server_echo.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-echo/protocol_lws_minimal_server_echo.c similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-echo/protocol_lws_minimal_server_echo.c rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-echo/protocol_lws_minimal_server_echo.c diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd-bulk/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/CMakeLists.txt similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd-bulk/CMakeLists.txt rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/CMakeLists.txt diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd-bulk/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/README.md similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd-bulk/README.md rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/README.md diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd-bulk/minimal-ws-server-pmd-bulk.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/minimal-ws-server-pmd-bulk.c similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd-bulk/minimal-ws-server-pmd-bulk.c rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/minimal-ws-server-pmd-bulk.c diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd-bulk/mount-origin/example.js b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/mount-origin/example.js similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd-bulk/mount-origin/example.js rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/mount-origin/example.js diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd-bulk/mount-origin/favicon.ico b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd-bulk/mount-origin/favicon.ico rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/mount-origin/favicon.ico diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd-bulk/mount-origin/index.html b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/mount-origin/index.html similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd-bulk/mount-origin/index.html rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/mount-origin/index.html diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd-bulk/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd-bulk/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd-bulk/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd-bulk/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/mount-origin/strict-csp.svg diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd-bulk/protocol_lws_minimal_pmd_bulk.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/protocol_lws_minimal_pmd_bulk.c similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd-bulk/protocol_lws_minimal_pmd_bulk.c rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-bulk/protocol_lws_minimal_pmd_bulk.c diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd-corner/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/CMakeLists.txt similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd-corner/CMakeLists.txt rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/CMakeLists.txt diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd-corner/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/README.md similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd-corner/README.md rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/README.md diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd-corner/minimal-ws-server-pmd-corner.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/minimal-ws-server-pmd-corner.c similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd-corner/minimal-ws-server-pmd-corner.c rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/minimal-ws-server-pmd-corner.c diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd-corner/mount-origin/example.js b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/mount-origin/example.js similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd-corner/mount-origin/example.js rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/mount-origin/example.js diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd-corner/mount-origin/favicon.ico b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd-corner/mount-origin/favicon.ico rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/mount-origin/favicon.ico diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd-corner/mount-origin/index.html b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/mount-origin/index.html similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd-corner/mount-origin/index.html rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/mount-origin/index.html diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd-corner/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd-corner/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd-corner/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd-corner/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/mount-origin/strict-csp.svg diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd-corner/protocol_lws_minimal.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/protocol_lws_minimal.c similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd-corner/protocol_lws_minimal.c rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd-corner/protocol_lws_minimal.c diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/CMakeLists.txt similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd/CMakeLists.txt rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/CMakeLists.txt diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/README.md similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd/README.md rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/README.md diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd/minimal-ws-server-pmd.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/minimal-ws-server-pmd.c similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd/minimal-ws-server-pmd.c rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/minimal-ws-server-pmd.c diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd/mount-origin/example.js b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/mount-origin/example.js similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd/mount-origin/example.js rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/mount-origin/example.js diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd/mount-origin/favicon.ico b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd/mount-origin/favicon.ico rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/mount-origin/favicon.ico diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd/mount-origin/index.html b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/mount-origin/index.html similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd/mount-origin/index.html rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/mount-origin/index.html diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/mount-origin/strict-csp.svg diff --git a/minimal-examples/ws-server/minimal-ws-server-pmd/protocol_lws_minimal.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/protocol_lws_minimal.c similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-pmd/protocol_lws_minimal.c rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-pmd/protocol_lws_minimal.c diff --git a/minimal-examples/ws-server/minimal-ws-server-ring/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/CMakeLists.txt similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-ring/CMakeLists.txt rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/CMakeLists.txt diff --git a/minimal-examples/ws-server/minimal-ws-server-ring/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/README.md similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-ring/README.md rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/README.md diff --git a/minimal-examples/ws-server/minimal-ws-server-ring/minimal-ws-server-ring.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/minimal-ws-server-ring.c similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-ring/minimal-ws-server-ring.c rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/minimal-ws-server-ring.c diff --git a/minimal-examples/ws-server/minimal-ws-server-ring/mount-origin/example.js b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/mount-origin/example.js similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-ring/mount-origin/example.js rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/mount-origin/example.js diff --git a/minimal-examples/ws-server/minimal-ws-server-ring/mount-origin/favicon.ico b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-ring/mount-origin/favicon.ico rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/mount-origin/favicon.ico diff --git a/minimal-examples/ws-server/minimal-ws-server-ring/mount-origin/index.html b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/mount-origin/index.html similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-ring/mount-origin/index.html rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/mount-origin/index.html diff --git a/minimal-examples/ws-server/minimal-ws-server-ring/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-ring/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/ws-server/minimal-ws-server-ring/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-ring/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/mount-origin/strict-csp.svg diff --git a/minimal-examples/ws-server/minimal-ws-server-ring/protocol_lws_minimal.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/protocol_lws_minimal.c similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-ring/protocol_lws_minimal.c rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-ring/protocol_lws_minimal.c diff --git a/minimal-examples/ws-server/minimal-ws-server-threadpool/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/CMakeLists.txt similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threadpool/CMakeLists.txt rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/CMakeLists.txt diff --git a/minimal-examples/ws-server/minimal-ws-server-threadpool/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/README.md similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threadpool/README.md rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/README.md diff --git a/minimal-examples/ws-server/minimal-ws-server-threadpool/minimal-ws-server-threadpool.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/minimal-ws-server-threadpool.c similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threadpool/minimal-ws-server-threadpool.c rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/minimal-ws-server-threadpool.c diff --git a/minimal-examples/ws-server/minimal-ws-server-threadpool/mount-origin/example.js b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/mount-origin/example.js similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threadpool/mount-origin/example.js rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/mount-origin/example.js diff --git a/minimal-examples/ws-server/minimal-ws-server-threadpool/mount-origin/favicon.ico b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threadpool/mount-origin/favicon.ico rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/mount-origin/favicon.ico diff --git a/minimal-examples/ws-server/minimal-ws-server-threadpool/mount-origin/index.html b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/mount-origin/index.html similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threadpool/mount-origin/index.html rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/mount-origin/index.html diff --git a/minimal-examples/ws-server/minimal-ws-server-threadpool/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threadpool/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/ws-server/minimal-ws-server-threadpool/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threadpool/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/mount-origin/strict-csp.svg diff --git a/minimal-examples/ws-server/minimal-ws-server-threadpool/protocol_lws_minimal_threadpool.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/protocol_lws_minimal_threadpool.c similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threadpool/protocol_lws_minimal_threadpool.c rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threadpool/protocol_lws_minimal_threadpool.c diff --git a/minimal-examples/ws-server/minimal-ws-server-threads-foreign-libuv-smp/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/CMakeLists.txt similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads-foreign-libuv-smp/CMakeLists.txt rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/CMakeLists.txt diff --git a/minimal-examples/ws-server/minimal-ws-server-threads-foreign-libuv-smp/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/README.md similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads-foreign-libuv-smp/README.md rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/README.md diff --git a/minimal-examples/ws-server/minimal-ws-server-threads-foreign-libuv-smp/minimal-ws-server.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/minimal-ws-server.c similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads-foreign-libuv-smp/minimal-ws-server.c rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/minimal-ws-server.c diff --git a/minimal-examples/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/example.js b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/example.js similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/example.js rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/example.js diff --git a/minimal-examples/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/favicon.ico b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/favicon.ico rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/favicon.ico diff --git a/minimal-examples/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/index.html b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/index.html similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/index.html rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/index.html diff --git a/minimal-examples/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/mount-origin/strict-csp.svg diff --git a/minimal-examples/ws-server/minimal-ws-server-threads-foreign-libuv-smp/protocol_lws_minimal.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/protocol_lws_minimal.c similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads-foreign-libuv-smp/protocol_lws_minimal.c rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-foreign-libuv-smp/protocol_lws_minimal.c diff --git a/minimal-examples/ws-server/minimal-ws-server-threads-smp/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/CMakeLists.txt similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads-smp/CMakeLists.txt rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/CMakeLists.txt diff --git a/minimal-examples/ws-server/minimal-ws-server-threads-smp/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/README.md similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads-smp/README.md rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/README.md diff --git a/minimal-examples/ws-server/minimal-ws-server-threads-smp/minimal-ws-server.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/minimal-ws-server.c similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads-smp/minimal-ws-server.c rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/minimal-ws-server.c diff --git a/minimal-examples/ws-server/minimal-ws-server-threads-smp/mount-origin/example.js b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/mount-origin/example.js similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads-smp/mount-origin/example.js rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/mount-origin/example.js diff --git a/minimal-examples/ws-server/minimal-ws-server-threads-smp/mount-origin/favicon.ico b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads-smp/mount-origin/favicon.ico rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/mount-origin/favicon.ico diff --git a/minimal-examples/ws-server/minimal-ws-server-threads-smp/mount-origin/index.html b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/mount-origin/index.html similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads-smp/mount-origin/index.html rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/mount-origin/index.html diff --git a/minimal-examples/ws-server/minimal-ws-server-threads-smp/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads-smp/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/ws-server/minimal-ws-server-threads-smp/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads-smp/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/mount-origin/strict-csp.svg diff --git a/minimal-examples/ws-server/minimal-ws-server-threads-smp/protocol_lws_minimal.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/protocol_lws_minimal.c similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads-smp/protocol_lws_minimal.c rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads-smp/protocol_lws_minimal.c diff --git a/minimal-examples/ws-server/minimal-ws-server-threads/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/CMakeLists.txt similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads/CMakeLists.txt rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/CMakeLists.txt diff --git a/minimal-examples/ws-server/minimal-ws-server-threads/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/README.md similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads/README.md rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/README.md diff --git a/minimal-examples/ws-server/minimal-ws-server-threads/minimal-ws-server.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/minimal-ws-server.c similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads/minimal-ws-server.c rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/minimal-ws-server.c diff --git a/minimal-examples/ws-server/minimal-ws-server-threads/mount-origin/example.js b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/mount-origin/example.js similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads/mount-origin/example.js rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/mount-origin/example.js diff --git a/minimal-examples/ws-server/minimal-ws-server-threads/mount-origin/favicon.ico b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads/mount-origin/favicon.ico rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/mount-origin/favicon.ico diff --git a/minimal-examples/ws-server/minimal-ws-server-threads/mount-origin/index.html b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/mount-origin/index.html similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads/mount-origin/index.html rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/mount-origin/index.html diff --git a/minimal-examples/ws-server/minimal-ws-server-threads/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/ws-server/minimal-ws-server-threads/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/mount-origin/strict-csp.svg diff --git a/minimal-examples/ws-server/minimal-ws-server-threads/protocol_lws_minimal.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/protocol_lws_minimal.c similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-threads/protocol_lws_minimal.c rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-threads/protocol_lws_minimal.c diff --git a/minimal-examples/ws-server/minimal-ws-server-timer/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/CMakeLists.txt similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-timer/CMakeLists.txt rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/CMakeLists.txt diff --git a/minimal-examples/ws-server/minimal-ws-server-timer/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/README.md similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-timer/README.md rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/README.md diff --git a/minimal-examples/ws-server/minimal-ws-server-timer/localhost-100y.cert b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/localhost-100y.cert similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-timer/localhost-100y.cert rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/localhost-100y.cert diff --git a/minimal-examples/ws-server/minimal-ws-server-timer/localhost-100y.key b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/localhost-100y.key similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-timer/localhost-100y.key rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/localhost-100y.key diff --git a/minimal-examples/ws-server/minimal-ws-server-timer/minimal-ws-server.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/minimal-ws-server.c similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-timer/minimal-ws-server.c rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/minimal-ws-server.c diff --git a/minimal-examples/ws-server/minimal-ws-server-timer/mount-origin/example.js b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/mount-origin/example.js similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-timer/mount-origin/example.js rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/mount-origin/example.js diff --git a/minimal-examples/ws-server/minimal-ws-server-timer/mount-origin/favicon.ico b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-timer/mount-origin/favicon.ico rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/mount-origin/favicon.ico diff --git a/minimal-examples/ws-server/minimal-ws-server-timer/mount-origin/index.html b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/mount-origin/index.html similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-timer/mount-origin/index.html rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/mount-origin/index.html diff --git a/minimal-examples/ws-server/minimal-ws-server-timer/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-timer/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/ws-server/minimal-ws-server-timer/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server-timer/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/ws-server/minimal-ws-server-timer/mount-origin/strict-csp.svg diff --git a/minimal-examples/ws-server/minimal-ws-server/CMakeLists.txt b/minimal-examples-lowlevel/ws-server/minimal-ws-server/CMakeLists.txt similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server/CMakeLists.txt rename to minimal-examples-lowlevel/ws-server/minimal-ws-server/CMakeLists.txt diff --git a/minimal-examples/ws-server/minimal-ws-server/README.md b/minimal-examples-lowlevel/ws-server/minimal-ws-server/README.md similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server/README.md rename to minimal-examples-lowlevel/ws-server/minimal-ws-server/README.md diff --git a/minimal-examples/ws-server/minimal-ws-server/localhost-100y.cert b/minimal-examples-lowlevel/ws-server/minimal-ws-server/localhost-100y.cert similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server/localhost-100y.cert rename to minimal-examples-lowlevel/ws-server/minimal-ws-server/localhost-100y.cert diff --git a/minimal-examples/ws-server/minimal-ws-server/localhost-100y.key b/minimal-examples-lowlevel/ws-server/minimal-ws-server/localhost-100y.key similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server/localhost-100y.key rename to minimal-examples-lowlevel/ws-server/minimal-ws-server/localhost-100y.key diff --git a/minimal-examples/ws-server/minimal-ws-server/minimal-ws-server.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server/minimal-ws-server.c similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server/minimal-ws-server.c rename to minimal-examples-lowlevel/ws-server/minimal-ws-server/minimal-ws-server.c diff --git a/minimal-examples/ws-server/minimal-ws-server/mount-origin/example.js b/minimal-examples-lowlevel/ws-server/minimal-ws-server/mount-origin/example.js similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server/mount-origin/example.js rename to minimal-examples-lowlevel/ws-server/minimal-ws-server/mount-origin/example.js diff --git a/minimal-examples/ws-server/minimal-ws-server/mount-origin/favicon.ico b/minimal-examples-lowlevel/ws-server/minimal-ws-server/mount-origin/favicon.ico similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server/mount-origin/favicon.ico rename to minimal-examples-lowlevel/ws-server/minimal-ws-server/mount-origin/favicon.ico diff --git a/minimal-examples/ws-server/minimal-ws-server/mount-origin/index.html b/minimal-examples-lowlevel/ws-server/minimal-ws-server/mount-origin/index.html similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server/mount-origin/index.html rename to minimal-examples-lowlevel/ws-server/minimal-ws-server/mount-origin/index.html diff --git a/minimal-examples/ws-server/minimal-ws-server/mount-origin/libwebsockets.org-logo.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server/mount-origin/libwebsockets.org-logo.svg similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server/mount-origin/libwebsockets.org-logo.svg rename to minimal-examples-lowlevel/ws-server/minimal-ws-server/mount-origin/libwebsockets.org-logo.svg diff --git a/minimal-examples/ws-server/minimal-ws-server/mount-origin/strict-csp.svg b/minimal-examples-lowlevel/ws-server/minimal-ws-server/mount-origin/strict-csp.svg similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server/mount-origin/strict-csp.svg rename to minimal-examples-lowlevel/ws-server/minimal-ws-server/mount-origin/strict-csp.svg diff --git a/minimal-examples/ws-server/minimal-ws-server/protocol_lws_minimal.c b/minimal-examples-lowlevel/ws-server/minimal-ws-server/protocol_lws_minimal.c similarity index 100% rename from minimal-examples/ws-server/minimal-ws-server/protocol_lws_minimal.c rename to minimal-examples-lowlevel/ws-server/minimal-ws-server/protocol_lws_minimal.c diff --git a/minimal-examples/CMakeLists.txt b/minimal-examples/CMakeLists.txt index 8591c2ef3..2fab2af06 100644 --- a/minimal-examples/CMakeLists.txt +++ b/minimal-examples/CMakeLists.txt @@ -1,7 +1,7 @@ # # libwebsockets - small server side websockets and web server implementation # -# Copyright (C) 2010 - 2020 Andy Green +# Copyright (C) 2010 - 2021 Andy Green # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to @@ -38,6 +38,7 @@ include_directories(${LWS_LIB_BUILD_INC_PATHS}) link_libraries(${LIB_LIST_AT_END}) SUBDIRLIST(SUBDIRS "${PROJECT_SOURCE_DIR}/minimal-examples") + FOREACH(subdir ${SUBDIRS}) SUBDIRLIST(SUBDIRS2 "${PROJECT_SOURCE_DIR}/minimal-examples/${subdir}") diff --git a/minimal-examples/README.md b/minimal-examples/README.md index 956256d53..73725721b 100644 --- a/minimal-examples/README.md +++ b/minimal-examples/README.md @@ -1,89 +1,9 @@ -|name|demonstrates| ----|--- -client-server|Minimal examples providing client and server connections simultaneously -crypto|Minimal examples related to using lws crypto apis -dbus-server|Minimal examples showing how to integrate DBUS into lws event loop -http-client|Minimal examples providing an http client -http-server|Minimal examples providing an http server -raw|Minimal examples related to adopting raw file or socket descriptors into the event loop -secure-streams|Minimal examples related to the Secure Streams client api -ws-client|Minimal examples providing a ws client -ws-server|Minimal examples providing a ws server (and an http server) +# minimal-examples -## FAQ +These are examples using the high-level Secure Streams features of lws. -### Getting started - -Build and install lws itself first (note that after installing lws on \*nix, you need to run `ldconfig` one time so the OS can learn about the new library. Lws installs in `/usr/local` by default, Debian / Ubuntu ldconfig knows to look there already, but Fedora / CentOS need you to add the line `/usr/local/lib` to `/etc/ld.so.conf` and run ldconfig) - -Then start with the simplest: - -`http-server/minimal-http-server` - -### Why are most of the sources split into a main C file file and a protocol file? - -Lws supports three ways to implement the protocol callback code: - - - you can just add it all in the same source file - - - you can separate it as these examples do, and #include it - into the main sources - - - you can build it as a standalone plugin that is discovered - and loaded at runtime. - -The way these examples are structured, you can easily also build -the protocol callback as a plugin just with a different -CMakeLists.txt... see https://github.com/warmcat/libwebsockets/tree/master/plugin-standalone -for an example. - -### Why would we want the protocol as a plugin? - -You will notice a lot of the main C code is the same boilerplate -repeated for each example. The actual interesting part is in -the protocol callback only. - -Lws provides (-DLWS_WITH_LWSWS=1) a generic lightweight server app called 'lwsws' that -can be configured by JSON. Combined with your protocol as a plugin, -it means you don't actually have to make a special server "app" -part, you can just use lwsws and pass per-vhost configuration -from JSON into your protocol. (Of course in some cases you have -an existing app you are bolting lws on to, then you don't care -about this for that particular case). - -Because lwsws has no dependency on whatever your plugin does, it -can mix and match different protocols randomly without needing any code -changes. It reduces the size of the task to just writing the -code you care about in your protocol handler, and nothing else to write -or maintain. - -Lwsws supports advanced features like reload, where it starts a new server -instance with changed config or different plugins, while keeping the old -instance around until the last connection to it closes. - -### I get why there is a pss, but why is there a vhd? - -The pss is instantiated per-connection. But there are almost always -other variables that have a lifetime longer than a single connection. - -You could make these variables "filescope" one-time globals, but that -means your protocol cannot instantiate multiple times. - -Lws supports vhosts (virtual hosts), for example both https://warmcat.com -and https://libwebsockets are running on the same lwsws instance on the -same server and same IP... each of these is a separate vhost. - -Your protocol may be enabled on multiple vhosts, each of these vhosts -provides a different vhd specific to the protocol instance on that -vhost. For example many of the samples keep a linked-list head to -a list of live pss in the vhd... that means it's cleanly a list of -pss opened **on that vhost**. If another vhost has the protocol -enabled, connections to that will point to a different vhd, and the -linked-list head on that vhd will only list connections to his vhost. - -The example "ws-server/minimal-ws-server-threads" demonstrates how to deliver -external configuration data to a specific vhost + protocol -combination using code. In lwsws, this is simply a matter of setting -the desired JSON config. +There are lower-level examples in `./minimal-examples-lowlevel` that +cover more usecases. However the capability of Secure Streams is +continuing to cover more cases and it is quite a bit simpler to use. diff --git a/minimal-examples/client/binance/CMakeLists.txt b/minimal-examples/client/binance/CMakeLists.txt new file mode 100644 index 000000000..d9897a1f0 --- /dev/null +++ b/minimal-examples/client/binance/CMakeLists.txt @@ -0,0 +1,53 @@ +project(lws-minimal-ss-binance C) +cmake_minimum_required(VERSION 2.8.12) +find_package(libwebsockets CONFIG REQUIRED) +list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR}) +include(CheckIncludeFile) +include(CheckCSourceCompiles) +include(LwsCheckRequirements) + +set(SRCS main.c binance-ss.c) + +set(requirements 1) +require_lws_config(LWS_ROLE_WS 1 requirements) +require_lws_config(LWS_WITH_CLIENT 1 requirements) +require_lws_config(LWS_WITHOUT_EXTENSIONS 0 requirements) +require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements) + +require_lws_config(LWS_WITH_SECURE_STREAMS_PROXY_API 1 has_ss_proxy) + +if (requirements) + add_executable(${PROJECT_NAME} ${SRCS}) + + if (websockets_shared) + target_link_libraries(${PROJECT_NAME} + websockets_shared + ${LIBWEBSOCKETS_DEP_LIBS}) + add_dependencies(${PROJECT_NAME} websockets_shared) + else() + target_link_libraries(${PROJECT_NAME} + websockets + ${LIBWEBSOCKETS_DEP_LIBS}) + endif() + + if (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR has_ss_proxy OR + LWS_WITH_SECURE_STREAMS_PROXY_API) + + add_compile_options(-DLWS_SS_USE_SSPC) + add_executable(${PROJECT_NAME}-client ${SRCS}) + + if (websockets_shared) + target_link_libraries(${PROJECT_NAME}-client + websockets_shared + ${LIBWEBSOCKETS_DEP_LIBS}) + add_dependencies(${PROJECT_NAME}-client + websockets_shared) + else() + target_link_libraries(${PROJECT_NAME}-client + websockets + ${LIBWEBSOCKETS_DEP_LIBS}) + endif() + endif() + + +endif() diff --git a/minimal-examples/client/binance/README.md b/minimal-examples/client/binance/README.md new file mode 100644 index 000000000..5155ddd99 --- /dev/null +++ b/minimal-examples/client/binance/README.md @@ -0,0 +1,56 @@ +# lws minimal secure streams binance + +This is a Secure Streams version of minimal-ws-client-binance. + +"policy.json" contains all the information about endpoints, protocols and +connection validation, tagged by streamtype name. + +The example tries to load it from the cwd, it lives in +./minimal-examples/secure-streams/minimal-secure-streams-binance dir, so +either run it from there, or copy the policy.json to your cwd. It's also +possible to put the policy json in the code as a string and pass that at +context creation time. + +The secure stream object represents a nailed-up connection that outlives any +single socket connection, and can manage reconnections / retries according to +the policy to keep the connection nailed up automatically. + +Secure Streams provides the same simplified communication api without any +protocol dependencies. + +## build + +Lws must have been built with `LWS_ROLE_WS=1`, `LWS_WITH_SECURE_STREAMS=1`, and +`LWS_WITHOUT_EXTENSIONS=0` + +``` + $ cmake . && make +``` + +## Commandline Options + +Option|Meaning +---|--- +-d|Set logging verbosity + +## usage + +``` +$ ./bin/lws-minimal-ws-client-binance +[2021/08/15 06:42:40:8409] U: LWS minimal Secure Streams binance client +[2021/08/15 06:42:40:8410] N: LWS: 4.2.99-v4.2.0-156-g8f352f65e8, NET CLI SRV H1 H2 WS SS-JSON-POL SSPROX ConMon FLTINJ IPV6-on +[2021/08/15 06:42:40:8410] N: ++ [495958|wsi|0|pipe] (1) +[2021/08/15 06:42:40:8411] N: ++ [495958|vh|0|netlink] (1) +[2021/08/15 06:42:40:8433] N: ++ [495958|vh|1|digicert||-1] (2) +[2021/08/15 06:42:40:8471] N: ++ [495958|wsiSScli|0|binance] (1) +[2021/08/15 06:42:40:8471] N: [495958|wsiSScli|0|binance]: lws_ss_check_next_state_ss: (unset) -> LWSSSCS_CREATING +[2021/08/15 06:42:40:8472] N: [495958|wsiSScli|0|binance]: lws_ss_check_next_state_ss: LWSSSCS_CREATING -> LWSSSCS_CONNECTING +[2021/08/15 06:42:40:8472] N: ++ [495958|wsicli|0|WS/h1/fstream.binance.com/([495958|wsiSScli|0|binance])] (1) +[2021/08/15 06:42:41:8802] N: [495958|wsiSScli|0|binance]: lws_ss_check_next_state_ss: LWSSSCS_CONNECTING -> LWSSSCS_CONNECTED +[2021/08/15 06:42:42:8803] N: sul_hz_cb: price: min: 4669185¢, max: 4672159¢, avg: 4670061¢, (53 prices/s) +[2021/08/15 06:42:42:8803] N: sul_hz_cb: elatency: min: 131ms, max: 292ms, avg: 154ms, (53 msg/s) +[2021/08/15 06:42:43:8803] N: sul_hz_cb: price: min: 4669646¢, max: 4672159¢, avg: 4669953¢, (34 prices/s) +[2021/08/15 06:42:43:8803] N: sul_hz_cb: elatency: min: 130ms, max: 149ms, avg: 133ms, (34 msg/s) +[2021/08/15 06:42:44:8804] N: sul_hz_cb: price: min: 4669455¢, max: 4672159¢, avg: 4669904¢, (26 prices/s) +... +``` diff --git a/minimal-examples/client/binance/binance-ss.c b/minimal-examples/client/binance/binance-ss.c new file mode 100644 index 000000000..e428d04dd --- /dev/null +++ b/minimal-examples/client/binance/binance-ss.c @@ -0,0 +1,203 @@ +/* + * lws-minimal-secure-streams-binance + * + * Written in 2010-2021 by Andy Green + * Kutoga + * + * This file is made available under the Creative Commons CC0 1.0 + * Universal Public Domain Dedication. + * + * This demonstrates a Secure Streams implementation of a client that connects + * to binance ws server efficiently. + * + * Build lws with -DLWS_WITH_SECURE_STREAMS=1 -DLWS_WITHOUT_EXTENSIONS=0 + * + * "policy.json" contains all the information about endpoints, protocols and + * connection validation, tagged by streamtype name. + * + * The example tries to load it from the cwd, it lives + * in ./minimal-examples/secure-streams/minimal-secure-streams-binance dir, so + * either run it from there, or copy the policy.json to your cwd. It's also + * possible to put the policy json in the code as a string and pass that at + * context creation time. + */ + +#include +#include +#include +#include + +extern int test_result; + +typedef struct range { + uint64_t sum; + uint64_t lowest; + uint64_t highest; + + unsigned int samples; +} range_t; + +LWS_SS_USER_TYPEDEF + lws_sorted_usec_list_t sul_hz; /* 1hz summary dump */ + + range_t e_lat_range; + range_t price_range; +} binance_t; + + +static void +range_reset(range_t *r) +{ + r->sum = r->highest = 0; + r->lowest = 999999999999ull; + r->samples = 0; +} + +static uint64_t +get_us_timeofday(void) +{ + struct timeval tv; + + gettimeofday(&tv, NULL); + + return (uint64_t)((lws_usec_t)tv.tv_sec * LWS_US_PER_SEC) + + (uint64_t)tv.tv_usec; +} + +static uint64_t +pennies(const char *s) +{ + uint64_t price = (uint64_t)atoll(s) * 100; + + s = strchr(s, '.'); + + if (s && isdigit(s[1]) && isdigit(s[2])) + price = price + (uint64_t)((10 * (s[1] - '0')) + (s[2] - '0')); + + return price; +} + +static void +sul_hz_cb(lws_sorted_usec_list_t *sul) +{ + binance_t *bin = lws_container_of(sul, binance_t, sul_hz); + + /* + * We are called once a second to dump statistics on the connection + */ + + lws_sul_schedule(lws_ss_get_context(bin->ss), 0, &bin->sul_hz, + sul_hz_cb, LWS_US_PER_SEC); + + if (bin->price_range.samples) + lwsl_ss_user(lws_ss_from_user(bin), + "price: min: %llu¢, max: %llu¢, avg: %llu¢, " + "(%d prices/s)", + (unsigned long long)bin->price_range.lowest, + (unsigned long long)bin->price_range.highest, + (unsigned long long)(bin->price_range.sum / + bin->price_range.samples), + bin->price_range.samples); + if (bin->e_lat_range.samples) + lwsl_ss_user(lws_ss_from_user(bin), + "elatency: min: %llums, max: %llums, " + "avg: %llums, (%d msg/s)", + (unsigned long long)bin->e_lat_range.lowest / 1000, + (unsigned long long)bin->e_lat_range.highest / 1000, + (unsigned long long)(bin->e_lat_range.sum / + bin->e_lat_range.samples) / 1000, + bin->e_lat_range.samples); + + range_reset(&bin->e_lat_range); + range_reset(&bin->price_range); + + test_result = 0; +} + + +static lws_ss_state_return_t +binance_rx(void *userobj, const uint8_t *in, size_t len, int flags) +{ + binance_t *bin = (binance_t *)userobj; + uint64_t latency_us, now_us; + char numbuf[16]; + uint64_t price; + const char *p; + size_t alen; + + now_us = (uint64_t)get_us_timeofday(); + + p = lws_json_simple_find((const char *)in, len, "\"depthUpdate\"", + &alen); + if (!p) + return LWSSSSRET_OK; + + p = lws_json_simple_find((const char *)in, len, "\"E\":", &alen); + if (!p) { + lwsl_err("%s: no E JSON\n", __func__); + return LWSSSSRET_OK; + } + + lws_strnncpy(numbuf, p, alen, sizeof(numbuf)); + latency_us = now_us - ((uint64_t)atoll(numbuf) * LWS_US_PER_MS); + + if (latency_us < bin->e_lat_range.lowest) + bin->e_lat_range.lowest = latency_us; + if (latency_us > bin->e_lat_range.highest) + bin->e_lat_range.highest = latency_us; + + bin->e_lat_range.sum += latency_us; + bin->e_lat_range.samples++; + + p = lws_json_simple_find((const char *)in, len, "\"a\":[[\"", &alen); + if (!p) + return LWSSSSRET_OK; + + lws_strnncpy(numbuf, p, alen, sizeof(numbuf)); + price = pennies(numbuf); + + if (price < bin->price_range.lowest) + bin->price_range.lowest = price; + if (price > bin->price_range.highest) + bin->price_range.highest = price; + + bin->price_range.sum += price; + bin->price_range.samples++; + + return LWSSSSRET_OK; +} + +static lws_ss_state_return_t +binance_state(void *userobj, void *h_src, lws_ss_constate_t state, + lws_ss_tx_ordinal_t ack) +{ + binance_t *bin = (binance_t *)userobj; + + lwsl_ss_info(bin->ss, "%s (%d), ord 0x%x", + lws_ss_state_name((int)state), state, (unsigned int)ack); + + switch (state) { + + case LWSSSCS_CONNECTED: + lws_sul_schedule(lws_ss_get_context(bin->ss), 0, &bin->sul_hz, + sul_hz_cb, LWS_US_PER_SEC); + range_reset(&bin->e_lat_range); + range_reset(&bin->price_range); + + return LWSSSSRET_OK; + + case LWSSSCS_DISCONNECTED: + lws_sul_cancel(&bin->sul_hz); + break; + + default: + break; + } + + return LWSSSSRET_OK; +} + +LWS_SS_INFO("binance", binance_t) + .rx = binance_rx, + .state = binance_state, +}; diff --git a/minimal-examples/client/binance/example-policy.json b/minimal-examples/client/binance/example-policy.json new file mode 100644 index 000000000..1ff4e0413 --- /dev/null +++ b/minimal-examples/client/binance/example-policy.json @@ -0,0 +1,38 @@ +{ + "release": "01234567", + "product": "myproduct", + "schema-version": 1, + "retry": [{ + "default": { + "backoff": [1000, 2000, 3000, 4000, 5000], + "conceal": 65535, + "jitterpc": 20, + "svalidping": 30, + "svalidhup": 35 + } + }], + "certs": [{ + "digicert_global_root": "MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQkCAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=" + } + ], + "trust_stores": [{ + "name": "digicert", + "stack": ["digicert_global_root"] + } + ], + "s": [ + { "binance": { + "endpoint": "fstream.binance.com", + "port": 443, + "protocol": "ws", + "http_url": "/stream?streams=btcusdt@depth@0ms/btcusdt@bookTicker/btcusdt@aggTrade", + "nailed_up": true, + "ws_prioritize_reads": true, + "tls": true, + "tls_trust_store": "digicert", + "retry": "default" + } + } + ] +} + diff --git a/minimal-examples/client/binance/main.c b/minimal-examples/client/binance/main.c new file mode 100644 index 000000000..fad9a59b9 --- /dev/null +++ b/minimal-examples/client/binance/main.c @@ -0,0 +1,79 @@ +/* + * lws-minimal-secure-streams-binance + * + * Written in 2010-2021 by Andy Green + * Kutoga + * + * This file is made available under the Creative Commons CC0 1.0 + * Universal Public Domain Dedication. + * + * This demonstrates a Secure Streams implementation of a client that connects + * to binance ws server efficiently. + * + * Build lws with -DLWS_WITH_SECURE_STREAMS=1 -DLWS_WITHOUT_EXTENSIONS=0 + * + * "example-policy.json" contains all the information about endpoints, protocols + * and connection validation, tagged by streamtype name. + * + * The example tries to load it from the cwd, it lives + * in ./minimal-examples/client/binance dir, so either run it from there, or + * copy the example-policy.json to your cwd. It's also possible to put the + * policy json in the code as a string and pass that at context creation time. + * + * When built to use the SSPC proxy, the local policy is not used since the + * proxy takes care of that. + */ + +#include +#include + +static struct lws_context *cx; +static int interrupted; +int test_result = 1; + +extern const lws_ss_info_t ssi_binance_t; + +static const struct lws_extension extensions[] = { + { + "permessage-deflate", lws_extension_callback_pm_deflate, + "permessage-deflate" "; client_no_context_takeover" + "; client_max_window_bits" + }, + { NULL, NULL, NULL /* terminator */ } +}; + +static void +sigint_handler(int sig) +{ + lws_default_loop_exit(cx); +} + +int main(int argc, const char **argv) +{ + struct lws_context_creation_info info; + + lws_context_info_defaults(&info, "example-policy.json"); + lws_cmdline_option_handle_builtin(argc, argv, &info); + signal(SIGINT, sigint_handler); + + lwsl_user("LWS minimal Secure Streams binance client\n"); + + info.extensions = extensions; + + cx = lws_create_context(&info); + if (!cx) { + lwsl_err("lws init failed\n"); + return 1; + } + + if (lws_ss_create(cx, 0, &ssi_binance_t, NULL, NULL, NULL, NULL)) { + lwsl_cx_err(cx, "failed to create secure stream"); + interrupted = 1; + } + + lws_context_default_loop_run_destroy(cx); + + /* process ret 0 if actual is as expected (0, or--expected-exit 123) */ + + return lws_cmdline_passfail(argc, argv, test_result); +} diff --git a/minimal-examples/client/hello_world/CMakeLists.txt b/minimal-examples/client/hello_world/CMakeLists.txt new file mode 100644 index 000000000..632117210 --- /dev/null +++ b/minimal-examples/client/hello_world/CMakeLists.txt @@ -0,0 +1,193 @@ +project(lws-minimal-ss-hello_world C) +cmake_minimum_required(VERSION 2.8.12) +find_package(libwebsockets CONFIG REQUIRED) +list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR}) +include(CheckCSourceCompiles) +include(LwsCheckRequirements) + +set(requirements 1) +require_lws_config(LWS_ROLE_H1 1 requirements) +require_lws_config(LWS_WITHOUT_CLIENT 0 requirements) +require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements) +require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements) + +require_lws_config(LWS_WITH_SYS_FAULT_INJECTION 1 has_fault_injection) +require_lws_config(LWS_WITH_SECURE_STREAMS_PROXY_API 1 has_ss_proxy) +require_lws_config(LWS_WITH_SYS_STATE 1 has_sys_state) + +CHECK_C_SOURCE_COMPILES("#include \nint main(void) {\ni#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)\n return 0;\n #else\n fail\n #endif\n return 0;\n}\n" HAS_LWS_WITH_SECURE_STREAMS_PROXY_API) + +if (requirements) + + add_executable(lws-minimal-ss-hello_world + main.c + hello_world-ss.c) + + if (websockets_shared) + target_link_libraries(${PROJECT_NAME} + websockets_shared + ${LIBWEBSOCKETS_DEP_LIBS}) + add_dependencies(${PROJECT_NAME} + websockets_shared) + else() + target_link_libraries(${PROJECT_NAME} + websockets + ${LIBWEBSOCKETS_DEP_LIBS}) + endif() + + ### --- this section related to also building example with SSPC / Proxy ---> + + if (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR has_ss_proxy OR + LWS_WITH_SECURE_STREAMS_PROXY_API) + add_compile_options(-DLWS_SS_USE_SSPC) + + add_executable(${PROJECT_NAME}-client + main.c + hello_world-ss.c) + + if (websockets_shared) + target_link_libraries(${PROJECT_NAME}-client + websockets_shared + ${LIBWEBSOCKETS_DEP_LIBS}) + add_dependencies(${PROJECT_NAME}-client + websockets_shared) + else() + target_link_libraries(${PROJECT_NAME}-client + websockets + ${LIBWEBSOCKETS_DEP_LIBS}) + endif() + endif() + + ### <--- this section related to building with SSPC / Proxy END + + + + ### ---everything else related to ctest / CI -----> + + find_program(VALGRIND "valgrind") + + if (LWS_CTEST_INTERNET_AVAILABLE AND NOT WIN32) + + # + # When running in CI, wait for a lease on the resources + # before starting this test, so the server does not get + # thousands of simultaneous tls connection attempts + # + # sai-resource holds the lease on the resources until + # the time given in seconds or the sai-resource instance + # exits, whichever happens first + # + # If running under Sai, creates a lock test called "res_sspcmin" + # + + sai_resource(warmcat_conns 1 40 sspcmin-hello-world) + + # + # simple test not via proxy + # + + if (VALGRIND) + message("testing via valgrind") + add_test(NAME mss-warmcat COMMAND + ${VALGRIND} --tool=memcheck --leak-check=yes --num-callers=20 + $) + else() + add_test(NAME mss-warmcat COMMAND ${PROJECT_NAME}) + endif() + + set_tests_properties(mss-warmcat + PROPERTIES + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/client/hello_world + TIMEOUT 40) + if (DEFINED ENV{SAI_OVN}) + set_tests_properties(mss-warmcat PROPERTIES FIXTURES_REQUIRED "res_msspcmin") + endif() + + if (has_fault_injection) + if (VALGRIND) + add_test(NAME mss-warmcat-fi1 COMMAND + ${VALGRIND} --tool=memcheck --leak-check=yes --num-callers=20 + $ + --fault-injection "ss/ss_create_destroy_me" + --expected-exit 1) + add_test(NAME mss-warmcat-fi2 COMMAND + ${VALGRIND} --tool=memcheck --leak-check=yes --num-callers=20 + $ + --fault-injection "ss/ss_no_streamtype_policy" + --expected-exit 1) + else() + add_test(NAME mss-warmcat-fi1 COMMAND lws-minimal-secure-streams + --fault-injection "ss/ss_create_destroy_me" + --expected-exit 1) + add_test(NAME mss-warmcat-fi2 COMMAND lws-minimal-secure-streams + --fault-injection "ss/ss_no_streamtype_policy" + --expected-exit 1) + endif() + + set_tests_properties(mss-warmcat-fi1 + mss-warmcat-fi2 + PROPERTIES + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/client/hello_world + TIMEOUT 5) + + endif() + + + if (has_sys_state AND + (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR LWS_WITH_SECURE_STREAMS_PROXY_API)) + + # + # Define test dep to bring up and take down the test + # proxy + # + + if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") + # uds abstract namespace for linux + set(CTEST_SOCKET_PATH "@ctest-mssp-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}") + else() + # filesystem socket for others + set(CTEST_SOCKET_PATH "/tmp/ctest-mssp-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}") + endif() + add_test(NAME st_mssproxy COMMAND + ${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh + mssproxy $ + -i ${CTEST_SOCKET_PATH} ) + set_tests_properties(st_mssproxy PROPERTIES WORKING_DIRECTORY . FIXTURES_SETUP mssproxy TIMEOUT 800) + + add_test(NAME ki_mssproxy COMMAND + ${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh + mssproxy $ + -i ${CTEST_SOCKET_PATH}) + set_tests_properties(ki_mssproxy PROPERTIES FIXTURES_CLEANUP mssproxy) + + # + # the client part that will connect to the proxy + # + + if (VALGRIND) + message("testing via valgrind") + add_test(NAME msspc-minimal COMMAND + ${VALGRIND} --tool=memcheck --leak-check=yes --num-callers=20 + $ --ssproxy-iface +${CTEST_SOCKET_PATH}) + else() + add_test(NAME msspc-minimal COMMAND ${PROJECT_NAME}-client --ssproxy-iface +${CTEST_SOCKET_PATH}) + endif() + + set(fixlist "mssproxy") + if (DEFINED ENV{SAI_OVN}) + list(APPEND fixlist "res_mssproxy") + endif() + + set_tests_properties(msspc-minimal PROPERTIES + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/client/hello_world + FIXTURES_REQUIRED "${fixlist}" + TIMEOUT 40) + + endif() + + endif() + + ### <--- related to ctest / CI END + +endif() + diff --git a/minimal-examples/client/hello_world/README.md b/minimal-examples/client/hello_world/README.md new file mode 100644 index 000000000..d1fdc526b --- /dev/null +++ b/minimal-examples/client/hello_world/README.md @@ -0,0 +1,45 @@ +# SS Example "hello_world" + +This is the simplest example, showing how to do an https +transaction using Secure Streams (SS). + +SS' approach is to segregate "policy" (where and how to connect and authenticate +for particular kinds of connection) from payloads that are transferred on the +connection. In this case, all the information about the example's policy is in +`example-policy.json`. + +|Source|Purpose| +|---|---| +|main.c|boilerplate to create the lws_context and event loop| +|hello_world-ss.c|the secure stream user code| +|example-policy.json|the example policy| + +## Build + +You should build and install lws itself first. Then with this directory as the +cwd, you can use `cmake . && make` to build the example. This produces +`./lws-minimal-ss-hello_world`. + +If lws was configured to support SS Proxying with +`-DLWS_WITH_SECURE_STREAMS_PROXY_API=1`, then a second executable is also +produced `./lws-minimal-ss-hello_world-client`. This does not try to do its own +networking, but instead wants to connect to an SS Proxy process that will fulfil +connections itself using its own policy. + +## Running + +You should be able to run `./lws-minimal-ss-hello_world` directly and see it +fetch a webpage (just the start and end of each chunk are logged). + +To go via the SS Proxy, run `./lws-minimal-ss-hello_world-client` and an SS +Proxy, eg, the example one found in `./minimal-examples/ssproxy/ssproxy-socket`. + +## Options + +|Commandline option|Meaning| +|---|---| +|-d \|Enable logging levels (default 1031 (USER, ERR, WARN, NOTICE), 1039 = +INFO, 1151 = +INFO, DEBUG), `-DCMAKE_BUILD_TYPE=DEBUG` needed for logs more verbose that NOTICE +|--ssproxy-port \|If going via an SS Proxy, default is Unix Domain Socket @proxy.ss.lws, you can force a different proxy's TCP port with this| +|--ssproxy-ads \|Set non-default hostname or IP address proxy is on| +|--ssproxy-iface \|Set non-default UDS path if starts with +, else interface to bind TCP connection to for proxy| + diff --git a/minimal-examples/client/hello_world/example-policy.json b/minimal-examples/client/hello_world/example-policy.json new file mode 100644 index 000000000..fd3afeaa1 --- /dev/null +++ b/minimal-examples/client/hello_world/example-policy.json @@ -0,0 +1,39 @@ +{ + "release": "1", + "product": "sx-hello_world", + "schema-version": 1, + "retry": [{ + "default": { + "backoff": [1000, 2000, 3000, 5000, 10000], + "conceal": 5, + "jitterpc": 20, + "svalidping": 30, + "svalidhup": 35 + } + }], + "certs": [{ + "dst_root_x3": "MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ" + } + ], + "trust_stores": [{ + "name": "le_via_dst", + "stack": [ "dst_root_x3" ] + }], + "s": [ + { + "sx-hello_world": { + "endpoint": "warmcat.com", + "port": 443, + "protocol": "h2", + "http_method": "GET", + "http_url": "index.html", + "tls": true, + "opportunistic": true, + "retry": "default", + "timeout_ms": 2000, + "tls_trust_store": "le_via_dst" + } + } + ] +} + diff --git a/minimal-examples/client/hello_world/hello_world-ss.c b/minimal-examples/client/hello_world/hello_world-ss.c new file mode 100644 index 000000000..58321ec62 --- /dev/null +++ b/minimal-examples/client/hello_world/hello_world-ss.c @@ -0,0 +1,71 @@ +/* + * hello_world example + * + * Written in 2010-2021 by Andy Green + * + * This file is made available under the Creative Commons CC0 1.0 + * Universal Public Domain Dedication. + * + * Demonstrates the simplest example using the LWS high-level SS apis. + * + * - main.c: boilerplate to create the lws_context and event loop + * - hello_world-ss.c: (this file) the secure stream user code + * - example-policy.json: the example policy + */ + +#include +#include + +extern int test_result; + +LWS_SS_USER_TYPEDEF + /* Your per-stream instantiation members go here */ +} hello_world_t; + +static lws_ss_state_return_t +hello_world_rx(void *userobj, const uint8_t *in, size_t len, int flags) +{ + hello_world_t *g = (hello_world_t *)userobj; + + lwsl_ss_user(lws_ss_from_user(g), "RX %zu, flags 0x%x", len, + (unsigned int)flags); + + if (len) { /* log the first 16 and last 16 bytes of the chunk */ + lwsl_hexdump_notice(in, len >= 16 ? 16 : len); + if (len >= 16) + lwsl_hexdump_notice(in + len - 16, 16); + } + + if ((flags & LWSSS_FLAG_EOM) == LWSSS_FLAG_EOM) + /* We received the whole message */ + test_result &= ~2; + + return LWSSSSRET_OK; +} + +static lws_ss_state_return_t +hello_world_state(void *userobj, void *h_src, lws_ss_constate_t state, + lws_ss_tx_ordinal_t ack) +{ + hello_world_t *g = (hello_world_t *)userobj; + + switch ((int)state) { + case LWSSSCS_CREATING: /* start the transaction as soon as we exist */ + return lws_ss_request_tx(lws_ss_from_user(g)); + + case LWSSSCS_QOS_ACK_REMOTE: /* server liked our request */ + test_result &= ~1; + break; + + case LWSSSCS_DISCONNECTED: /* for our example, disconnect = done */ + lws_default_loop_exit(lws_ss_cx_from_user(g)); + break; + } + + return LWSSSSRET_OK; +} + +LWS_SS_INFO("sx-hello_world", hello_world_t) + .rx = hello_world_rx, + .state = hello_world_state, +}; diff --git a/minimal-examples/client/hello_world/main.c b/minimal-examples/client/hello_world/main.c new file mode 100644 index 000000000..739a8116d --- /dev/null +++ b/minimal-examples/client/hello_world/main.c @@ -0,0 +1,60 @@ +/* + * hello_world example + * + * Written in 2010-2021 by Andy Green + * + * This file is made available under the Creative Commons CC0 1.0 + * Universal Public Domain Dedication. + * + * Demonstrates the simplest example using the LWS high-level SS apis. + * + * - main.c: (this file) boilerplate to create the lws_context + * and event loop + * - hello_world-ss.c: the secure stream user code + * - example-policy.json: the example policy + */ + +#include +#include + +/* b0: clr when peer ACKed request, b1: clr when recieved whole response */ +int test_result = 3; + +extern const lws_ss_info_t ssi_hello_world_t; /* from hello_world-ss.c */ + +static struct lws_context *cx; /* so the SIGINT handler below can access it */ + +static void +sigint_handler(int sig) +{ + lws_default_loop_exit(cx); +} + +int +main(int argc, const char **argv) +{ + struct lws_context_creation_info info; + + lws_context_info_defaults(&info, "example-policy.json"); + lws_cmdline_option_handle_builtin(argc, argv, &info); + signal(SIGINT, sigint_handler); + + lwsl_user("LWS hello_world example [-d]\n"); + + if (!(cx = lws_create_context(&info))) { + lwsl_err("lws init failed\n"); + return 1; + } + + if (lws_ss_create(cx, 0, &ssi_hello_world_t, NULL, NULL, NULL, NULL)) { + lwsl_cx_err(cx, "failed to create get secure stream"); + lws_context_destroy(cx); + return 1; + } + + lws_context_default_loop_run_destroy(cx); + + /* process ret 0 if actual is as expected (0, or--expected-exit 123) */ + + return lws_cmdline_passfail(argc, argv, test_result); +} diff --git a/minimal-examples/client/http-post/CMakeLists.txt b/minimal-examples/client/http-post/CMakeLists.txt new file mode 100644 index 000000000..6a4a47a19 --- /dev/null +++ b/minimal-examples/client/http-post/CMakeLists.txt @@ -0,0 +1,198 @@ +project(lws-minimal-ss-http-post C) +cmake_minimum_required(VERSION 2.8.12) +find_package(libwebsockets CONFIG REQUIRED) +list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR}) +include(CheckCSourceCompiles) +include(LwsCheckRequirements) + +set(requirements 1) +require_lws_config(LWS_ROLE_H1 1 requirements) +require_lws_config(LWS_WITHOUT_CLIENT 0 requirements) +require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements) +require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements) + +require_lws_config(LWS_WITH_SYS_FAULT_INJECTION 1 has_fault_injection) +require_lws_config(LWS_WITH_SECURE_STREAMS_PROXY_API 1 has_ss_proxy) +require_lws_config(LWS_WITH_SYS_STATE 1 has_sys_state) + +CHECK_C_SOURCE_COMPILES("#include \nint main(void) {\ni#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)\n return 0;\n #else\n fail\n #endif\n return 0;\n}\n" HAS_LWS_WITH_SECURE_STREAMS_PROXY_API) + +if (requirements) + + set(SRCS main.c http-post-ss.c) + + add_executable(${PROJECT_NAME} ${SRCS}) + + if (websockets_shared) + target_link_libraries(${PROJECT_NAME} + websockets_shared + ${LIBWEBSOCKETS_DEP_LIBS}) + add_dependencies(${PROJECT_NAME} + websockets_shared) + else() + target_link_libraries(${PROJECT_NAME} + websockets + ${LIBWEBSOCKETS_DEP_LIBS}) + endif() + + ### --- this section related to also building example with SSPC / Proxy ---> + + if (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR has_ss_proxy OR + LWS_WITH_SECURE_STREAMS_PROXY_API) + add_compile_options(-DLWS_SS_USE_SSPC) + + add_executable(${PROJECT_NAME}-client ${SRCS}) + + if (websockets_shared) + target_link_libraries(${PROJECT_NAME}-client + websockets_shared + ${LIBWEBSOCKETS_DEP_LIBS}) + add_dependencies(${PROJECT_NAME}-client + websockets_shared) + else() + target_link_libraries(${PROJECT_NAME}-client + websockets + ${LIBWEBSOCKETS_DEP_LIBS}) + endif() + endif() + + ### <--- this section related to building with SSPC / Proxy END + + + + ### ---everything else related to ctest / CI -----> + + find_program(VALGRIND "valgrind") + + if (LWS_CTEST_INTERNET_AVAILABLE AND NOT WIN32) + + # + # When running in CI, wait for a lease on the resources + # before starting this test, so the server does not get + # thousands of simultaneous tls connection attempts + # + # sai-resource holds the lease on the resources until + # the time given in seconds or the sai-resource instance + # exits, whichever happens first + # + # If running under Sai, creates a lock test called "res_sspcmin" + # + + sai_resource(warmcat_conns 1 40 sspcmin-http-post) + + # + # simple test not via proxy + # + + if (VALGRIND) + message("testing via valgrind") + add_test(NAME msshttp-post-warmcat COMMAND + ${VALGRIND} --tool=memcheck --leak-check=yes --num-callers=20 + $) + else() + add_test(NAME msshttp-post-warmcat COMMAND ${PROJECT_NAME}) + endif() + + set_tests_properties(msshttp-post-warmcat + PROPERTIES + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/client/http-post + TIMEOUT 40) + if (DEFINED ENV{SAI_OVN}) + set_tests_properties(msshttp-post-warmcat PROPERTIES FIXTURES_REQUIRED "res_msspcmin") + endif() + + if (has_fault_injection) + if (VALGRIND) + add_test(NAME msshttp-post-warmcat-fi1 COMMAND + ${VALGRIND} --tool=memcheck --leak-check=yes --num-callers=20 + $ + --fault-injection "ss/ss_create_destroy_me" + --expected-exit 1) + add_test(NAME msshttp-post-warmcat-fi2 COMMAND + ${VALGRIND} --tool=memcheck --leak-check=yes --num-callers=20 + $ + --fault-injection "ss/ss_no_streamtype_policy" + --expected-exit 1) + else() + add_test(NAME msshttp-post-warmcat-fi1 COMMAND lws-minimal-secure-streams + --fault-injection "ss/ss_create_destroy_me" + --expected-exit 1) + add_test(NAME msshttp-post-warmcat-fi2 COMMAND lws-minimal-secure-streams + --fault-injection "ss/ss_no_streamtype_policy" + --expected-exit 1) + endif() + + set_tests_properties(msshttp-post-warmcat-fi1 + msshttp-post-warmcat-fi2 + PROPERTIES + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/client/http-post + TIMEOUT 5) + + endif() + + + if (has_sys_state AND (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR has_ss_proxy OR + LWS_WITH_SECURE_STREAMS_PROXY_API)) + + # + # Define test dep to bring up and take down the test + # proxy + # + + if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") + # uds abstract namespace for linux + set(CTEST_SOCKET_PATH "@ctest-mssphttp-post--$ENV{SAI_PROJECT}-$ENV{SAI_OVN}") + else() + # filesystem socket for others + set(CTEST_SOCKET_PATH "/tmp/ctest-mssphttp-post-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}") + endif() + add_test(NAME st_msshttp-post-proxy COMMAND + ${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh + msshttp-post-proxy $ + -i ${CTEST_SOCKET_PATH} ) + set_tests_properties(st_msshttp-post-proxy PROPERTIES + WORKING_DIRECTORY . + FIXTURES_SETUP msshttp-post-proxy + TIMEOUT 800) + + add_test(NAME ki_msshttp-post-proxy COMMAND + ${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh + msshttp-post-proxy $ + -i ${CTEST_SOCKET_PATH}) + set_tests_properties(ki_msshttp-post-proxy PROPERTIES + FIXTURES_CLEANUP msshttp-post-proxy) + + # + # the client part that will connect to the proxy + # + + if (VALGRIND) + message("testing via valgrind") + add_test(NAME msspc-http-post-minimal COMMAND + ${VALGRIND} --tool=memcheck --leak-check=yes --num-callers=20 + $ + --ssproxy-iface +${CTEST_SOCKET_PATH}) + else() + add_test(NAME msspc-http-post-minimal COMMAND + ${PROJECT_NAME}-client + --ssproxy-iface +${CTEST_SOCKET_PATH}) + endif() + + set(fixlist "msshttp-post-proxy") + if (DEFINED ENV{SAI_OVN}) + list(APPEND fixlist "res_msshttp-post-proxy") + endif() + + set_tests_properties(msspc-http-post-minimal PROPERTIES + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/client/http-post + FIXTURES_REQUIRED "${fixlist}" + TIMEOUT 40) + + endif() + + endif() + + ### <--- related to ctest / CI END + +endif() + diff --git a/minimal-examples/client/http-post/README.md b/minimal-examples/client/http-post/README.md new file mode 100644 index 000000000..d1fdc526b --- /dev/null +++ b/minimal-examples/client/http-post/README.md @@ -0,0 +1,45 @@ +# SS Example "hello_world" + +This is the simplest example, showing how to do an https +transaction using Secure Streams (SS). + +SS' approach is to segregate "policy" (where and how to connect and authenticate +for particular kinds of connection) from payloads that are transferred on the +connection. In this case, all the information about the example's policy is in +`example-policy.json`. + +|Source|Purpose| +|---|---| +|main.c|boilerplate to create the lws_context and event loop| +|hello_world-ss.c|the secure stream user code| +|example-policy.json|the example policy| + +## Build + +You should build and install lws itself first. Then with this directory as the +cwd, you can use `cmake . && make` to build the example. This produces +`./lws-minimal-ss-hello_world`. + +If lws was configured to support SS Proxying with +`-DLWS_WITH_SECURE_STREAMS_PROXY_API=1`, then a second executable is also +produced `./lws-minimal-ss-hello_world-client`. This does not try to do its own +networking, but instead wants to connect to an SS Proxy process that will fulfil +connections itself using its own policy. + +## Running + +You should be able to run `./lws-minimal-ss-hello_world` directly and see it +fetch a webpage (just the start and end of each chunk are logged). + +To go via the SS Proxy, run `./lws-minimal-ss-hello_world-client` and an SS +Proxy, eg, the example one found in `./minimal-examples/ssproxy/ssproxy-socket`. + +## Options + +|Commandline option|Meaning| +|---|---| +|-d \|Enable logging levels (default 1031 (USER, ERR, WARN, NOTICE), 1039 = +INFO, 1151 = +INFO, DEBUG), `-DCMAKE_BUILD_TYPE=DEBUG` needed for logs more verbose that NOTICE +|--ssproxy-port \|If going via an SS Proxy, default is Unix Domain Socket @proxy.ss.lws, you can force a different proxy's TCP port with this| +|--ssproxy-ads \|Set non-default hostname or IP address proxy is on| +|--ssproxy-iface \|Set non-default UDS path if starts with +, else interface to bind TCP connection to for proxy| + diff --git a/minimal-examples/client/http-post/example-policy.json b/minimal-examples/client/http-post/example-policy.json new file mode 100644 index 000000000..2e1698c74 --- /dev/null +++ b/minimal-examples/client/http-post/example-policy.json @@ -0,0 +1,42 @@ +{ + "release": "1", + "product": "sx-http-post", + "schema-version": 1, + "retry": [{ + "default": { + "backoff": [1000, 2000, 3000, 5000, 10000], + "conceal": 5, + "jitterpc": 20, + "svalidping": 30, + "svalidhup": 35 + } + }], + "certs": [{ + "dst_root_x3": "MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ" + } + ], + "trust_stores": [{ + "name": "le_via_dst", + "stack": [ "dst_root_x3" ] + }], + "s": [ + { + "minpost": { + "endpoint": "libwebsockets.org", + "port": 443, + "protocol": "h1", + "http_method": "POST", + "http_url": "testserver/formtest", + "metadata": [ + { "ctype": "Content-Type:" } + ], + "tls": true, + "opportunistic": true, + "allow_redirects": true, + "retry": "default", + "tls_trust_store": "le_via_dst" + } + } + ] +} + diff --git a/minimal-examples/client/http-post/http-post-ss.c b/minimal-examples/client/http-post/http-post-ss.c new file mode 100644 index 000000000..814772f27 --- /dev/null +++ b/minimal-examples/client/http-post/http-post-ss.c @@ -0,0 +1,214 @@ +/* + * SS http-post example + * + * Written in 2010-2021 by Andy Green + * + * This file is made available under the Creative Commons CC0 1.0 + * Universal Public Domain Dedication. + * + * Demonstrates http post using the LWS high-level SS apis. + * + * - main.c: boilerplate to create the lws_context and event loop + * - http-post-ss.c: (this file) the secure stream user code + * - example-policy.json: the example policy + */ + +#include +#include + +extern int test_result; + +static const char * const postbody = + "--boundary\r\n" + "Content-Disposition: form-data; name=\"text\"\r\n" + "\r\n" + "value1\r\n" + "--boundary\r\n" + "Content-Disposition: form-data; " + "name=\"field2\"; filename=\"example.txt\"\r\n" + "\r\n" + "value2\r\n" + "00-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "01-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "02-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "03-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "04-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "05-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "06-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "07-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "08-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "09-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "0a-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "0b-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "0c-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "0d-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "0e-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "0f-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "10-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "11-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "12-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "13-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "14-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "15-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "16-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "17-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "18-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "19-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "1a-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "1b-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "1c-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "1d-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "1e-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "1f-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "20-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "21-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "22-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "23-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "24-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "25-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "26-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "27-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "28-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "29-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "2a-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "2b-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "2c-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "2d-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "2e-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "2f-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "30-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "31-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "32-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "33-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "34-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "35-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "36-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "37-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "38-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "39-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "3a-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "3b-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "3c-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "3d-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "3e-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "3f-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "40-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "41-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "42-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "43-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "44-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "45-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "46-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "47-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "48-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "49-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "4a-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "4b-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "4c-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "4d-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "4e-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "4f-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "50-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "51-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "52-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "53-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef\r\n" + "--boundary--\r\n"; + +LWS_SS_USER_TYPEDEF + const char *payload; + size_t size; + size_t pos; +} http_post_t; + +static lws_ss_state_return_t +http_post_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len, + int *flags) +{ + http_post_t *g = (http_post_t *)userobj; + lws_ss_state_return_t r = LWSSSSRET_OK; + + if (g->size == g->pos) + return LWSSSSRET_TX_DONT_SEND; + + if (*len > g->size - g->pos) + *len = g->size - g->pos; + + if (!g->pos) + *flags |= LWSSS_FLAG_SOM; + + memcpy(buf, g->payload + g->pos, *len); + g->pos += *len; + + if (g->pos != g->size) + /* more to do */ + r = lws_ss_request_tx(lws_ss_from_user(g)); + else + *flags |= LWSSS_FLAG_EOM; + + lwsl_ss_user(lws_ss_from_user(g), "TX %zu, flags 0x%x, r %d", *len, + (unsigned int)*flags, (int)r); + + return r; +} + +static lws_ss_state_return_t +http_post_rx(void *userobj, const uint8_t *in, size_t len, int flags) +{ + http_post_t *g = (http_post_t *)userobj; + + lwsl_ss_user(lws_ss_from_user(g), "RX %zu, flags 0x%x", len, + (unsigned int)flags); + + lwsl_hexdump_notice(in, len); + + if ((flags & LWSSS_FLAG_EOM) == LWSSS_FLAG_EOM) + /* We received the whole response */ + test_result &= ~2; + + return LWSSSSRET_OK; +} + +static lws_ss_state_return_t +http_post_state(void *userobj, void *h_src, lws_ss_constate_t state, + lws_ss_tx_ordinal_t ack) +{ + http_post_t *g = (http_post_t *)userobj; + + switch ((int)state) { + case LWSSSCS_CREATING: + if (lws_ss_set_metadata(lws_ss_from_user(g), "ctype", + "multipart/form-data;boundary=\"boundary\"", + 39)) + return LWSSSSRET_DISCONNECT_ME; + + /* provide a hint about the payload size */ + g->pos = 0; + g->payload = postbody; + g->size = strlen(g->payload); + + lwsl_ss_user(lws_ss_from_user(g), "Preparing to send %zu", + g->size); + + return lws_ss_request_tx_len(lws_ss_from_user(g), + (unsigned long)g->size); + + case LWSSSCS_CONNECTED: + return lws_ss_request_tx(lws_ss_from_user(g)); + + case LWSSSCS_QOS_ACK_REMOTE: /* server liked our request */ + test_result &= ~1; + break; + + case LWSSSCS_DISCONNECTED: /* for our example, disconnect = done */ + lws_default_loop_exit(lws_ss_cx_from_user(g)); + break; + } + + return LWSSSSRET_OK; +} + +LWS_SS_INFO("minpost", http_post_t) + .tx = http_post_tx, + .rx = http_post_rx, + .state = http_post_state, +}; diff --git a/minimal-examples/client/http-post/main.c b/minimal-examples/client/http-post/main.c new file mode 100644 index 000000000..402a15c7f --- /dev/null +++ b/minimal-examples/client/http-post/main.c @@ -0,0 +1,60 @@ +/* + * http post example + * + * Written in 2010-2021 by Andy Green + * + * This file is made available under the Creative Commons CC0 1.0 + * Universal Public Domain Dedication. + * + * Demonstrates http post using the LWS high-level SS apis. + * + * - main.c: (this file) boilerplate to create the lws_context + * and event loop + * - http-post-ss.c: the secure stream user code + * - example-policy.json: the example policy + */ + +#include +#include + +/* b0: clr when peer ACKed request, b1: clr when recieved whole response */ +int test_result = 3; + +extern const lws_ss_info_t ssi_http_post_t; /* from hello_world-ss.c */ + +static struct lws_context *cx; /* so the SIGINT handler below can access it */ + +static void +sigint_handler(int sig) +{ + lws_default_loop_exit(cx); +} + +int +main(int argc, const char **argv) +{ + struct lws_context_creation_info info; + + lws_context_info_defaults(&info, "example-policy.json"); + lws_cmdline_option_handle_builtin(argc, argv, &info); + signal(SIGINT, sigint_handler); + + lwsl_user("LWS SS http-post example [-d]\n"); + + if (!(cx = lws_create_context(&info))) { + lwsl_err("lws init failed\n"); + return 1; + } + + if (lws_ss_create(cx, 0, &ssi_http_post_t, NULL, NULL, NULL, NULL)) { + lwsl_cx_err(cx, "failed to create get secure stream"); + lws_context_destroy(cx); + return 1; + } + + lws_context_default_loop_run_destroy(cx); + + /* process ret 0 if actual is as expected (0, or--expected-exit 123) */ + + return lws_cmdline_passfail(argc, argv, test_result); +} diff --git a/minimal-examples/client/ws-echo/CMakeLists.txt b/minimal-examples/client/ws-echo/CMakeLists.txt new file mode 100644 index 000000000..86759e4bb --- /dev/null +++ b/minimal-examples/client/ws-echo/CMakeLists.txt @@ -0,0 +1,194 @@ +project(lws-minimal-ss-ws-echo C) +cmake_minimum_required(VERSION 2.8.12) +find_package(libwebsockets CONFIG REQUIRED) +list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR}) +include(CheckCSourceCompiles) +include(LwsCheckRequirements) + +set(requirements 1) +require_lws_config(LWS_ROLE_H1 1 requirements) +require_lws_config(LWS_WITHOUT_CLIENT 0 requirements) +require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements) +require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements) + +require_lws_config(LWS_WITH_SYS_FAULT_INJECTION 1 has_fault_injection) +require_lws_config(LWS_WITH_SECURE_STREAMS_PROXY_API 1 has_ss_proxy) +require_lws_config(LWS_WITH_SYS_STATE 1 has_sys_state) + +CHECK_C_SOURCE_COMPILES("#include \nint main(void) {\ni#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API)\n return 0;\n #else\n fail\n #endif\n return 0;\n}\n" HAS_LWS_WITH_SECURE_STREAMS_PROXY_API) + +if (requirements) + + set(SRCS main.c ws-echo-ss.c) + + add_executable(${PROJECT_NAME} ${SRCS}) + + if (websockets_shared) + target_link_libraries(${PROJECT_NAME} + websockets_shared + ${LIBWEBSOCKETS_DEP_LIBS}) + add_dependencies(${PROJECT_NAME} + websockets_shared) + else() + target_link_libraries(${PROJECT_NAME} + websockets + ${LIBWEBSOCKETS_DEP_LIBS}) + endif() + + ### --- this section related to also building example with SSPC / Proxy ---> + + if (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR has_ss_proxy OR + LWS_WITH_SECURE_STREAMS_PROXY_API) + add_compile_options(-DLWS_SS_USE_SSPC) + + add_executable(${PROJECT_NAME}-client ${SRCS}) + + if (websockets_shared) + target_link_libraries(${PROJECT_NAME}-client + websockets_shared + ${LIBWEBSOCKETS_DEP_LIBS}) + add_dependencies(${PROJECT_NAME}-client + websockets_shared) + else() + target_link_libraries(${PROJECT_NAME}-client + websockets + ${LIBWEBSOCKETS_DEP_LIBS}) + endif() + endif() + + ### <--- this section related to building with SSPC / Proxy END + + + + ### ---everything else related to ctest / CI -----> + + find_program(VALGRIND "valgrind") + + if (LWS_CTEST_INTERNET_AVAILABLE AND NOT WIN32) + + # + # When running in CI, wait for a lease on the resources + # before starting this test, so the server does not get + # thousands of simultaneous tls connection attempts + # + # sai-resource holds the lease on the resources until + # the time given in seconds or the sai-resource instance + # exits, whichever happens first + # + # If running under Sai, creates a lock test called "res_sspcmin" + # + + sai_resource(warmcat_conns 1 40 sspcmin-ws-echo) + + # + # simple test not via proxy + # + + if (VALGRIND) + message("testing via valgrind") + add_test(NAME mssws_echo-warmcat COMMAND + ${VALGRIND} --tool=memcheck --leak-check=yes --num-callers=20 + $) + else() + add_test(NAME mssws_echo-warmcat COMMAND ${PROJECT_NAME}) + endif() + + set_tests_properties(mssws_echo-warmcat + PROPERTIES + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/client/ws-echo + TIMEOUT 40) + if (DEFINED ENV{SAI_OVN}) + set_tests_properties(mssws_echo-warmcat PROPERTIES FIXTURES_REQUIRED "res_msspcmin") + endif() + + if (has_fault_injection) + if (VALGRIND) + add_test(NAME mssws_echo-warmcat-fi1 COMMAND + ${VALGRIND} --tool=memcheck --leak-check=yes --num-callers=20 + $ + --fault-injection "ss/ss_create_destroy_me" + --expected-exit 1) + add_test(NAME mssws_echo-warmcat-fi2 COMMAND + ${VALGRIND} --tool=memcheck --leak-check=yes --num-callers=20 + $ + --fault-injection "ss/ss_no_streamtype_policy" + --expected-exit 1) + else() + add_test(NAME mssws_echo-warmcat-fi1 COMMAND lws-minimal-secure-streams + --fault-injection "ss/ss_create_destroy_me" + --expected-exit 1) + add_test(NAME mssws_echo-warmcat-fi2 COMMAND lws-minimal-secure-streams + --fault-injection "ss/ss_no_streamtype_policy" + --expected-exit 1) + endif() + + set_tests_properties(mssws_echo-warmcat-fi1 + mssws_echo-warmcat-fi2 + PROPERTIES + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/client/ws-echo + TIMEOUT 5) + + endif() + + + if (has_sys_state AND (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR has_ss_proxy OR + LWS_WITH_SECURE_STREAMS_PROXY_API)) + + # + # Define test dep to bring up and take down the test + # proxy + # + + if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") + # uds abstract namespace for linux + set(CTEST_SOCKET_PATH "@ctest-msspws_echo--$ENV{SAI_PROJECT}-$ENV{SAI_OVN}") + else() + # filesystem socket for others + set(CTEST_SOCKET_PATH "/tmp/ctest-msspws_echo-$ENV{SAI_PROJECT}-$ENV{SAI_OVN}") + endif() + add_test(NAME st_mssws_echo-proxy COMMAND + ${CMAKE_SOURCE_DIR}/scripts/ctest-background.sh + mssws_echo-proxy $ + -i ${CTEST_SOCKET_PATH} ) + set_tests_properties(st_mssws_echo-proxy PROPERTIES WORKING_DIRECTORY . FIXTURES_SETUP mssws_echo-proxy TIMEOUT 800) + + add_test(NAME ki_mssws_echo-proxy COMMAND + ${CMAKE_SOURCE_DIR}/scripts/ctest-background-kill.sh + mssws_echo-proxy $ + -i ${CTEST_SOCKET_PATH}) + set_tests_properties(ki_mssws_echo-proxy PROPERTIES FIXTURES_CLEANUP mssws_echo-proxy) + + # + # the client part that will connect to the proxy + # + + if (VALGRIND) + message("testing via valgrind") + add_test(NAME msspcws-echo-minimal COMMAND + ${VALGRIND} --tool=memcheck --leak-check=yes --num-callers=20 + $ + --ssproxy-iface +${CTEST_SOCKET_PATH}) + else() + add_test(NAME msspcws-echo-minimal COMMAND + ${PROJECT_NAME}-client + --ssproxy-iface +${CTEST_SOCKET_PATH}) + endif() + + set(fixlist "mssws_echo-proxy") + if (DEFINED ENV{SAI_OVN}) + list(APPEND fixlist "res_mssws_echo-proxy") + endif() + + set_tests_properties(msspcws-echo-minimal PROPERTIES + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/minimal-examples/client/ws-echo + FIXTURES_REQUIRED "${fixlist}" + TIMEOUT 40) + + endif() + + endif() + + ### <--- related to ctest / CI END + +endif() + diff --git a/minimal-examples/client/ws-echo/README.md b/minimal-examples/client/ws-echo/README.md new file mode 100644 index 000000000..9ea8d4c76 --- /dev/null +++ b/minimal-examples/client/ws-echo/README.md @@ -0,0 +1,44 @@ +# SS Example "ws-echo" + +This shows a client doing ws echo, using Secure Streams. + +SS' approach is to segregate "policy" (where and how to connect and authenticate +for particular kinds of connection) from payloads that are transferred on the +connection. In this case, all the information about the example's policy is in +`example-policy.json`. + +|Source|Purpose| +|---|---| +|main.c|boilerplate to create the lws_context and event loop| +|ws-echo-ss.c|the secure stream user code| +|example-policy.json|the example policy| + +## Build + +You should build and install lws itself first. Then with this directory as the +cwd, you can use `cmake . && make` to build the example. This produces +`./lws-minimal-ss-ws-echo`. + +If lws was configured to support SS Proxying with +`-DLWS_WITH_SECURE_STREAMS_PROXY_API=1`, then a second executable is also +produced `./lws-minimal-ss-ws-echo-client`. This does not try to do its own +networking, but instead wants to connect to an SS Proxy process that will fulfil +connections itself using its own policy. + +## Running + +You should be able to run the example directly and see it start to send ws +messages every 500ms, and receive them back from the lws mirror server. + +To go via the SS Proxy, run `./lws-minimal-ss-ws-echo-client` and an SS +Proxy, eg, the example one found in `./minimal-examples/ssproxy/ssproxy-socket`. + +## Options + +|Commandline option|Meaning| +|---|---| +|-d \|Enable logging levels (default 1031 (USER, ERR, WARN, NOTICE), 1039 = +INFO, 1151 = +INFO, DEBUG), `-DCMAKE_BUILD_TYPE=DEBUG` needed for logs more verbose that NOTICE +|--ssproxy-port \|If going via an SS Proxy, default is Unix Domain Socket @proxy.ss.lws, you can force a different proxy's TCP port with this| +|--ssproxy-ads \|Set non-default hostname or IP address proxy is on| +|--ssproxy-iface \|Set non-default UDS path if starts with +, else interface to bind TCP connection to for proxy| + diff --git a/minimal-examples/client/ws-echo/example-policy.json b/minimal-examples/client/ws-echo/example-policy.json new file mode 100644 index 000000000..fa8c5bc2b --- /dev/null +++ b/minimal-examples/client/ws-echo/example-policy.json @@ -0,0 +1,40 @@ +{ + "release": "1", + "product": "sx-http-post", + "schema-version": 1, + "retry": [{ + "default": { + "backoff": [1000, 2000, 3000, 5000, 10000], + "conceal": 5, + "jitterpc": 20, + "svalidping": 30, + "svalidhup": 35 + } + }], + "certs": [{ + "dst_root_x3": "MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ" + } + ], + "trust_stores": [{ + "name": "le_via_dst", + "stack": [ "dst_root_x3" ] + }], + "s": [ + { + "sx_ws_echo": { + "endpoint": "libwebsockets.org", + "port": 443, + "protocol": "ws", + "ws_subprotocol": "lws-mirror-protocol", + "http_url": "", + "tls": true, + "nailed_up": true, + "ws_binary": true, + "allow_redirects": true, + "retry": "default", + "tls_trust_store": "le_via_dst" + } + } + ] +} + diff --git a/minimal-examples/client/ws-echo/main.c b/minimal-examples/client/ws-echo/main.c new file mode 100644 index 000000000..2b5f95b79 --- /dev/null +++ b/minimal-examples/client/ws-echo/main.c @@ -0,0 +1,60 @@ +/* + * ws-echo example + * + * Written in 2010-2021 by Andy Green + * + * This file is made available under the Creative Commons CC0 1.0 + * Universal Public Domain Dedication. + * + * Demonstrates http post using the LWS high-level SS apis. + * + * - main.c: (this file) boilerplate to create the lws_context + * and event loop + * - ws-echo-ss.c: the secure stream user code + * - example-policy.json: the example policy + */ + +#include +#include + +/* b0: clr when peer ACKed request, b1: clr when recieved whole response */ +int test_result = 3; + +extern const lws_ss_info_t ssi_ws_echo_t; /* from hello_world-ss.c */ + +static struct lws_context *cx; /* so the SIGINT handler below can access it */ + +static void +sigint_handler(int sig) +{ + lws_default_loop_exit(cx); +} + +int +main(int argc, const char **argv) +{ + struct lws_context_creation_info info; + + lws_context_info_defaults(&info, "example-policy.json"); + lws_cmdline_option_handle_builtin(argc, argv, &info); + signal(SIGINT, sigint_handler); + + lwsl_user("LWS SS ws-echo example [-d]\n"); + + if (!(cx = lws_create_context(&info))) { + lwsl_err("lws init failed\n"); + return 1; + } + + if (lws_ss_create(cx, 0, &ssi_ws_echo_t, NULL, NULL, NULL, NULL)) { + lwsl_cx_err(cx, "failed to create get secure stream"); + lws_context_destroy(cx); + return 1; + } + + lws_context_default_loop_run_destroy(cx); + + /* process ret 0 if actual is as expected (0, or--expected-exit 123) */ + + return lws_cmdline_passfail(argc, argv, test_result); +} diff --git a/minimal-examples/client/ws-echo/ws-echo-ss.c b/minimal-examples/client/ws-echo/ws-echo-ss.c new file mode 100644 index 000000000..85f241f0e --- /dev/null +++ b/minimal-examples/client/ws-echo/ws-echo-ss.c @@ -0,0 +1,134 @@ +/* + * SS ws-echo example + * + * Written in 2010-2021 by Andy Green + * + * This file is made available under the Creative Commons CC0 1.0 + * Universal Public Domain Dedication. + * + * Demonstrates http post using the LWS high-level SS apis. + * + * - main.c: boilerplate to create the lws_context and event loop + * - ws-echo-ss.c: (this file) the secure stream user code + * - example-policy.json: the example policy + */ + +#include +#include + +extern int test_result; + +LWS_SS_USER_TYPEDEF + lws_sorted_usec_list_t sul; + char msg[64]; + const char *payload; + size_t size; + size_t pos; + + int count; +} ws_echo_t; + +static lws_ss_state_return_t +ws_echo_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len, + int *flags) +{ + ws_echo_t *g = (ws_echo_t *)userobj; + lws_ss_state_return_t r = LWSSSSRET_OK; + + if (g->size == g->pos) + return LWSSSSRET_TX_DONT_SEND; + + if (*len > g->size - g->pos) + *len = g->size - g->pos; + + if (!g->pos) + *flags |= LWSSS_FLAG_SOM; + + memcpy(buf, g->payload + g->pos, *len); + g->pos += *len; + + if (g->pos != g->size) + /* more to do */ + r = lws_ss_request_tx(lws_ss_from_user(g)); + else + *flags |= LWSSS_FLAG_EOM; + + lwsl_ss_user(lws_ss_from_user(g), "TX %zu, flags 0x%x, r %d", *len, + (unsigned int)*flags, (int)r); + + return r; +} + +static lws_ss_state_return_t +ws_echo_rx(void *userobj, const uint8_t *in, size_t len, int flags) +{ + ws_echo_t *g = (ws_echo_t *)userobj; + + lwsl_ss_user(lws_ss_from_user(g), "RX %zu, flags 0x%x", len, + (unsigned int)flags); + + lwsl_hexdump_notice(in, len); + + if ((flags & LWSSS_FLAG_EOM) == LWSSS_FLAG_EOM) + /* We received the whole response */ + test_result &= ~2; + + return LWSSSSRET_OK; +} + +static void +sul_cb(lws_sorted_usec_list_t *sul) +{ + ws_echo_t *g = (ws_echo_t *)lws_container_of(sul, ws_echo_t, sul); + + /* provide a hint about the payload size */ + g->pos = 0; + g->payload = g->msg; + g->size = (size_t)lws_snprintf(g->msg, sizeof(g->msg), + "hello %d", g->count++); + + if (lws_ss_request_tx_len(lws_ss_from_user(g), (unsigned long)g->size)) + lwsl_notice("%s: req failed\n", __func__); + + lws_sul_schedule(lws_ss_cx_from_user(g), 0, &g->sul, sul_cb, + LWS_US_PER_SEC / 2); +} + +static lws_ss_state_return_t +ws_echo_state(void *userobj, void *h_src, lws_ss_constate_t state, + lws_ss_tx_ordinal_t ack) +{ + ws_echo_t *g = (ws_echo_t *)userobj; + + switch ((int)state) { + case LWSSSCS_CREATING: + /* run for 5s then exit */ + lws_ss_start_timeout(lws_ss_from_user(g), 5000); + break; + + case LWSSSCS_CONNECTED: + test_result &= ~1; + lws_sul_schedule(lws_ss_cx_from_user(g), 0, &g->sul, sul_cb, + LWS_US_PER_SEC / 2); + break; + + case LWSSSCS_TIMEOUT: + /* for this test, when our 5s are up, we exit the process */ + lws_sul_cancel(&g->sul); + lws_default_loop_exit(lws_ss_cx_from_user(g)); + break; + + case LWSSSCS_DISCONNECTED: /* for our example, disconnect = done */ + lws_sul_cancel(&g->sul); + lws_default_loop_exit(lws_ss_cx_from_user(g)); + break; + } + + return LWSSSSRET_OK; +} + +LWS_SS_INFO("sx_ws_echo", ws_echo_t) + .tx = ws_echo_tx, + .rx = ws_echo_rx, + .state = ws_echo_state, +}; diff --git a/minimal-examples/embedded/pico/pico-sspc-binance/README.md b/minimal-examples/embedded/pico/pico-sspc-binance/README.md index 3a10cf716..fcfa51970 100644 --- a/minimal-examples/embedded/pico/pico-sspc-binance/README.md +++ b/minimal-examples/embedded/pico/pico-sspc-binance/README.md @@ -55,7 +55,7 @@ keep up. ## Build This builds as a toplevel project using the pcio sdk, it builds -lws via a symlink, and links with liblws-sspc.a rather than libwebsockets.a +lws via a symlink, and links with libwebsockets.a built with `-DLWS_ONLY_SSPC` Adapt `PICO_SDK_PATH` below to where your pico sdk is installed @@ -70,8 +70,9 @@ unmount it. ## Running -On the PC, you need to build lws-minimal-secure-streams-custom-proxy-transport, -which needs lws built with `LWS_WITHOUT_EXTENSIONS=0`. This connects to +On the PC, you need to build `lws-minimal-ssproxy-custom-transport-uart`, from +`./minimal-examples/ssproxy/ssproxy-custom-transport-uart`, +which needs lws built with `-DLWS_WITHOUT_EXTENSIONS=0`. This connects to `/dev/ttyUSB0` and starts the mux + SS Proxy. On the Pico, you can monitor the serial console over USB to see logs via diff --git a/minimal-examples/embedded/pico/pico-sspc-binance/binance-ss.c b/minimal-examples/embedded/pico/pico-sspc-binance/binance-ss.c index 688c9290b..065e60da7 100644 --- a/minimal-examples/embedded/pico/pico-sspc-binance/binance-ss.c +++ b/minimal-examples/embedded/pico/pico-sspc-binance/binance-ss.c @@ -28,10 +28,7 @@ typedef struct range { unsigned int samples; } range_t; -typedef struct binance { - struct lws_ss_handle *ss; - void *opaque_data; - +LWS_SS_USER_TYPEDEF uint64_t data_in; uint64_t data_in_last_sec; @@ -99,7 +96,8 @@ sul_hz_cb(lws_sorted_usec_list_t *sul) (unsigned long)((bin->e_lat_range.sum / bin->e_lat_range.samples) / 1000), bin->e_lat_range.samples, - (unsigned long)((bin->data_in - bin->data_in_last_sec) / 1024)); + (unsigned long)((bin->data_in - + bin->data_in_last_sec) / 1024)); range_reset(&bin->e_lat_range); range_reset(&bin->price_range); @@ -217,11 +215,7 @@ binance_state(void *userobj, void *h_src, lws_ss_constate_t state, return LWSSSSRET_OK; } -const lws_ss_info_t ssi_binance = { - .handle_offset = offsetof(binance_t, ss), - .opaque_user_data_offset = offsetof(binance_t, opaque_data), +LWS_SS_INFO("binance", binance_t) .rx = binance_rx, .state = binance_state, - .user_alloc = sizeof(binance_t), - .streamtype = "binance", /* bind to corresponding policy */ }; diff --git a/minimal-examples/embedded/pico/pico-sspc-binance/get-ss.c b/minimal-examples/embedded/pico/pico-sspc-binance/get-ss.c index fc0145121..1df4e823c 100644 --- a/minimal-examples/embedded/pico/pico-sspc-binance/get-ss.c +++ b/minimal-examples/embedded/pico/pico-sspc-binance/get-ss.c @@ -1,7 +1,7 @@ /* * pico-sspc-binance * - * Written in 2010-2021 by Andy Green + * Written in 2010 - 2021 by Andy Green * * This file is made available under the Creative Commons CC0 1.0 * Universal Public Domain Dedication. @@ -12,10 +12,7 @@ #include "private.h" -typedef struct { - struct lws_ss_handle *ss; - void *opaque_data; - +LWS_SS_USER_TYPEDEF lws_sorted_usec_list_t sul5; } get_t; @@ -24,9 +21,8 @@ sul_start_get(lws_sorted_usec_list_t *sul) { get_t *g = lws_container_of(sul, get_t, sul5); - lwsl_ss_notice(g->ss, "conn"); - lws_ss_request_tx(g->ss); - lws_sul_schedule(lws_ss_get_context(g->ss), 0, sul, sul_start_get, + lws_ss_request_tx(lws_ss_from_user(g)); + lws_sul_schedule(lws_ss_cx_from_user(g), 0, sul, sul_start_get, 5 * LWS_US_PER_SEC); } @@ -35,7 +31,7 @@ get_rx(void *userobj, const uint8_t *in, size_t len, int flags) { get_t *g = (get_t *)userobj; - lwsl_ss_notice(g->ss, "RX %u, flags 0x%x", + lwsl_ss_notice(lws_ss_from_user(g), "RX %u, flags 0x%x", (unsigned int)len, (unsigned int)flags); if (len) { @@ -53,18 +49,12 @@ get_state(void *userobj, void *h_src, lws_ss_constate_t state, { get_t *g = (get_t *)userobj; - lwsl_ss_notice(g->ss, "%s (%d), ord 0x%x", + lwsl_ss_notice(lws_ss_from_user(g), "%s (%d), ord 0x%x", lws_ss_state_name((int)state), state, (unsigned int)ack); switch (state) { case LWSSSCS_CREATING: - /* - * ... also let's start a sul that creates a second stream to - * GET from libwebsockets.org every 5s, showing we are running - * multiple SS on the transport successfully. - */ - - lws_sul_schedule(lws_ss_get_context(g->ss), 0, &g->sul5, + lws_sul_schedule(lws_ss_cx_from_user(g), 0, &g->sul5, sul_start_get, 5 * LWS_US_PER_SEC); break; case LWSSSCS_DESTROYING: @@ -75,11 +65,7 @@ get_state(void *userobj, void *h_src, lws_ss_constate_t state, return LWSSSSRET_OK; } -const lws_ss_info_t ssi_get = { - .handle_offset = offsetof(get_t, ss), - .opaque_user_data_offset = offsetof(get_t, opaque_data), +LWS_SS_INFO("mintest-lws", get_t) .rx = get_rx, .state = get_state, - .user_alloc = sizeof(get_t), - .streamtype = "mintest-lws", /* bind to this policy */ }; diff --git a/minimal-examples/embedded/pico/pico-sspc-binance/main.c b/minimal-examples/embedded/pico/pico-sspc-binance/main.c index b2e56da0d..864924a31 100644 --- a/minimal-examples/embedded/pico/pico-sspc-binance/main.c +++ b/minimal-examples/embedded/pico/pico-sspc-binance/main.c @@ -79,12 +79,12 @@ main(void) * mux -> transport -> proxy -> binance wss */ - if (lws_ss_create(&cx, 0, &ssi_binance, NULL, NULL, NULL, NULL)) { + if (lws_ss_create(&cx, 0, &ssi_binance_t, NULL, NULL, NULL, NULL)) { printf("failed to create binance secure stream\n"); return 1; } - if (lws_ss_create(&cx, 0, &ssi_get, NULL, NULL, NULL, NULL)) { + if (lws_ss_create(&cx, 0, &ssi_get_t, NULL, NULL, NULL, NULL)) { printf("failed to create get secure stream\n"); return 1; } diff --git a/minimal-examples/embedded/pico/pico-sspc-binance/private.h b/minimal-examples/embedded/pico/pico-sspc-binance/private.h index 11949b965..5d061d313 100644 --- a/minimal-examples/embedded/pico/pico-sspc-binance/private.h +++ b/minimal-examples/embedded/pico/pico-sspc-binance/private.h @@ -40,5 +40,5 @@ void serial_handle_events(lws_transport_mux_t *tm); /* our SS bindings */ -extern const lws_ss_info_t ssi_binance; /* binance-ss.c */ -extern const lws_ss_info_t ssi_get; /* get-ss.c */ +extern const lws_ss_info_t ssi_binance_t, /* binance-ss.c */ + ssi_get_t; /* get-ss.c */ diff --git a/minimal-examples/server/hello_world/CMakeLists.txt b/minimal-examples/server/hello_world/CMakeLists.txt new file mode 100644 index 000000000..1a8fada6d --- /dev/null +++ b/minimal-examples/server/hello_world/CMakeLists.txt @@ -0,0 +1,52 @@ +project(lws-minimal-ss-server-hello_world C) +cmake_minimum_required(VERSION 2.8.12) +find_package(libwebsockets CONFIG REQUIRED) +list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR}) +include(CheckCSourceCompiles) +include(LwsCheckRequirements) + +set(SRCS main.c ss-server.c) + +set(requirements 1) +require_lws_config(LWS_ROLE_H1 1 requirements) +require_lws_config(LWS_WITH_SERVER 1 requirements) +require_lws_config(LWS_WITH_SYS_SMD 1 requirements) +require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements) +require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements) + +require_lws_config(LWS_WITH_SECURE_STREAMS_PROXY_API 1 has_ss_proxy) + +if (requirements) + add_executable(${PROJECT_NAME} ${SRCS}) + + if (websockets_shared) + target_link_libraries(${PROJECT_NAME} + websockets_shared + ${LIBWEBSOCKETS_DEP_LIBS}) + add_dependencies(${PROJECT_NAME} + websockets_shared) + else() + target_link_libraries(${PROJECT_NAME} + websockets + ${LIBWEBSOCKETS_DEP_LIBS}) + endif() + + if (HAS_LWS_WITH_SECURE_STREAMS_PROXY_API OR has_ss_proxy OR + LWS_WITH_SECURE_STREAMS_PROXY_API) + + add_compile_options(-DLWS_SS_USE_SSPC) + add_executable(${PROJECT_NAME}-client ${SRCS}) + + if (websockets_shared) + target_link_libraries(${PROJECT_NAME}-client + websockets_shared + ${LIBWEBSOCKETS_DEP_LIBS}) + add_dependencies(${PROJECT_NAME}-client + websockets_shared) + else() + target_link_libraries(${PROJECT_NAME}-client + websockets + ${LIBWEBSOCKETS_DEP_LIBS}) + endif() + endif() +endif() diff --git a/minimal-examples/server/hello_world/README.md b/minimal-examples/server/hello_world/README.md new file mode 100644 index 000000000..6e98f1180 --- /dev/null +++ b/minimal-examples/server/hello_world/README.md @@ -0,0 +1,72 @@ +# lws minimal secure streams server + +The application sets up a tls + ws server on https://localhost:7681 + +It does it using Secure Streams... information about how the server should +operate is held in JSON policy in main.c + +Visiting the server in a modern browser will fetch some html + JS, the JS will +create a ws link back to the server and the server will spam an incrementing +number that is displayed in the browser every 100ms. + +The app also has a SS client that works, but it's disabled by default since +we're interested in server. + +## build + +``` + $ cmake . && make +``` + +## usage + +Commandline option|Meaning +---|--- +-d |Debug verbosity in decimal, eg, -d15 + +``` +[2020/07/27 10:51:04:8994] U: LWS Secure Streams Server +[2020/07/27 10:51:04:9440] N: LWS: 4.0.99-v4.0.0-245-ge6eb4417a, loglevel 1031 +[2020/07/27 10:51:04:9444] N: NET CLI SRV H1 H2 WS MQTT SS-JSON-POL SSPROX ASYNC_DNS IPv6-absent +[2020/07/27 10:51:05:1685] N: lws_adopt_descriptor_vhost2: wsi 0x5317d30, vhost system ss_handle (nil) +[2020/07/27 10:51:05:1753] N: lws_adopt_descriptor_vhost2: wsi 0x53182c0, vhost system ss_handle (nil) +[2020/07/27 10:51:05:2129] N: lws_ss_policy_parser_cb: server 'self_localhost' keep 52 0x5318cc0 +[2020/07/27 10:51:05:2134] N: lws_ss_policy_parser_cb: server 'self_localhost_key' keep 53 0x5318cf8 +[2020/07/27 10:51:05:2192] N: lws_ss_policy_ref_trust_store: le_via_isrg trust store initial 'isrg_root_x1' +[2020/07/27 10:51:05:7804] N: smd_cb: creating server stream +[2020/07/27 10:51:05:7851] N: Vhost 'myserver' using TLS mode +[2020/07/27 10:51:05:8660] N: SSL ECDH curve 'prime256v1' +[2020/07/27 10:51:06:1035] N: vhost myserver: cert expiry: 729599d +[2020/07/27 10:51:06:1039] N: lws_ss_create: created server myserver +[2020/07/27 10:51:11:8650] N: lws_adopt_descriptor_vhost2: wsi 0x5b046e0, vhost myserver ss_handle 0x56e2be0 +[2020/07/27 10:51:11:8672] U: myss_srv_state: 0x5b52f60 LWSSSCS_CREATING, ord 0x0 +[2020/07/27 10:51:11:8693] U: myss_srv_state: 0x5b52f60 LWSSSCS_CONNECTING, ord 0x0 +[2020/07/27 10:51:11:8696] U: myss_srv_state: 0x5b52f60 LWSSSCS_CONNECTED, ord 0x0 +[2020/07/27 10:51:11:9743] U: myss_srv_state: 0x5ba2bd0 LWSSSCS_CREATING, ord 0x0 +[2020/07/27 10:51:11:9747] U: myss_srv_state: 0x5ba2bd0 LWSSSCS_CONNECTING, ord 0x0 +[2020/07/27 10:51:11:9747] U: myss_srv_state: 0x5ba2bd0 LWSSSCS_CONNECTED, ord 0x0 +[2020/07/27 10:51:12:0192] U: myss_srv_state: 0x5bad0a0 LWSSSCS_CREATING, ord 0x0 +[2020/07/27 10:51:12:0193] U: myss_srv_state: 0x5bad0a0 LWSSSCS_CONNECTING, ord 0x0 +[2020/07/27 10:51:12:0194] U: myss_srv_state: 0x5bad0a0 LWSSSCS_CONNECTED, ord 0x0 +[2020/07/27 10:51:12:0306] N: secstream_h1: LWS_CALLBACK_HTTP +[2020/07/27 10:51:12:0329] U: myss_srv_state: 0x5bad0a0 LWSSSCS_SERVER_TXN, ord 0x0 +[2020/07/27 10:51:12:0481] N: lws_h2_ws_handshake: Server SS 0x5ba2bd0 .wsi 0x5ba27b0 switching to ws protocol +[2020/07/27 10:51:12:0484] U: myss_srv_state: 0x5ba2bd0 LWSSSCS_SERVER_UPGRADE, ord 0x0 +[2020/07/27 10:51:12:0541] U: myss_srv_state: 0x5ba2bd0 LWSSSCS_CONNECTED, ord 0x0 +[2020/07/27 10:51:12:1222] U: myss_srv_state: 0x5bd1100 LWSSSCS_CREATING, ord 0x0 +[2020/07/27 10:51:12:1222] U: myss_srv_state: 0x5bd1100 LWSSSCS_CONNECTING, ord 0x0 +[2020/07/27 10:51:12:1223] U: myss_srv_state: 0x5bd1100 LWSSSCS_CONNECTED, ord 0x0 +[2020/07/27 10:51:12:1242] N: lws_h2_ws_handshake: Server SS 0x5bd1100 .wsi 0x5bd0ce0 switching to ws protocol +[2020/07/27 10:51:12:1243] U: myss_srv_state: 0x5bd1100 LWSSSCS_SERVER_UPGRADE, ord 0x0 +[2020/07/27 10:51:12:1246] U: myss_srv_state: 0x5bd1100 LWSSSCS_CONNECTED, ord 0x0 +^C[2020/07/27 10:51:15:2809] U: myss_srv_state: 0x5bad0a0 LWSSSCS_DISCONNECTED, ord 0x0 +[2020/07/27 10:51:15:2838] U: myss_srv_state: 0x5bad0a0 LWSSSCS_DESTROYING, ord 0x0 +[2020/07/27 10:51:15:2938] U: myss_srv_state: 0x5ba2bd0 LWSSSCS_DISCONNECTED, ord 0x0 +[2020/07/27 10:51:15:2946] U: myss_srv_state: 0x5ba2bd0 LWSSSCS_DESTROYING, ord 0x0 +[2020/07/27 10:51:15:2952] U: myss_srv_state: 0x5bd1100 LWSSSCS_DISCONNECTED, ord 0x0 +[2020/07/27 10:51:15:2953] U: myss_srv_state: 0x5bd1100 LWSSSCS_DESTROYING, ord 0x0 +[2020/07/27 10:51:15:2960] U: myss_srv_state: 0x5b52f60 LWSSSCS_DISCONNECTED, ord 0x0 +[2020/07/27 10:51:15:2961] U: myss_srv_state: 0x5b52f60 LWSSSCS_DESTROYING, ord 0x0 +[2020/07/27 10:51:15:3042] U: myss_srv_state: 0x56e2be0 LWSSSCS_DESTROYING, ord 0x0 +[2020/07/27 10:51:15:3378] U: Completed: OK +``` diff --git a/minimal-examples/server/hello_world/example-policy.json b/minimal-examples/server/hello_world/example-policy.json new file mode 100644 index 000000000..ae626a02c --- /dev/null +++ b/minimal-examples/server/hello_world/example-policy.json @@ -0,0 +1,33 @@ +{ + "release":"01234567", + "product":"myproduct", + "schema-version":1, + "retry": [{"default": {"backoff": [1000,2000,3000,5000,10000],"conceal":5,"jitterpc":20,"svalidping":300,"svalidhup":310}}], + "certs": [{ + "dst_root_x3": "MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ" + },{ + "self_localhost": "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" + },{ + "self_localhost_key": "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" + } +], + "trust_stores": [ + {"name": "le_via_dst", + "stack": ["dst_root_x3"]} + ],"s": [ { + "myserver": { + "server":true, + "port":7681, + "protocol":"h2", + "metadata": [ + {"mime": "Content-Type:", + "method": "","path": ""} + ], + "tls":true, + "server_cert":"self_localhost", + "server_key":"self_localhost_key" + } + } + ] +} + diff --git a/minimal-examples/server/hello_world/main.c b/minimal-examples/server/hello_world/main.c new file mode 100644 index 000000000..3f74d41bb --- /dev/null +++ b/minimal-examples/server/hello_world/main.c @@ -0,0 +1,65 @@ +/* + * lws-minimal-secure-streams-server + * + * Written in 2010-2021 by Andy Green + * + * This file is made available under the Creative Commons CC0 1.0 + * Universal Public Domain Dedication. + * + * Simplest possible SS https server + */ + +#include +#include + +extern const lws_ss_info_t ssi_myss_srv_t; + +static struct lws_context *cx; +int test_result = 0, multipart; + +static int +smd_cb(void *opaque, lws_smd_class_t c, lws_usec_t ts, void *buf, size_t len) +{ + if (!(c & LWSSMDCL_SYSTEM_STATE) || + lws_json_simple_strcmp(buf, len, "\"state\":", "OPERATIONAL") || + !lws_ss_create(cx, 0, &ssi_myss_srv_t, NULL, NULL, NULL, NULL)) + return 0; + + lwsl_err("%s: failed to create secure stream\n", __func__); + lws_default_loop_exit(cx); + + return -1; +} + +static void +sigint_handler(int sig) +{ + lws_default_loop_exit(cx); +} + +int +main(int argc, const char **argv) +{ + struct lws_context_creation_info info; + + lws_context_info_defaults(&info, "example-policy.json"); + lws_cmdline_option_handle_builtin(argc, argv, &info); + signal(SIGINT, sigint_handler); + + lwsl_user("LWS Secure Streams Server\n"); + + info.early_smd_cb = smd_cb; + info.early_smd_class_filter = LWSSMDCL_SYSTEM_STATE; + + cx = lws_create_context(&info); + if (!cx) { + lwsl_err("lws init failed\n"); + return 1; + } + + lws_context_default_loop_run_destroy(cx); + + /* process ret 0 if actual is as expected (0, or--expected-exit 123) */ + + return lws_cmdline_passfail(argc, argv, test_result); +} diff --git a/minimal-examples/server/hello_world/ss-server.c b/minimal-examples/server/hello_world/ss-server.c new file mode 100644 index 000000000..445ccf215 --- /dev/null +++ b/minimal-examples/server/hello_world/ss-server.c @@ -0,0 +1,87 @@ +/* + * lws-minimal-ss-server-hello_world + * + * Written in 2010-2021 by Andy Green + * + * This file is made available under the Creative Commons CC0 1.0 + * Universal Public Domain Dedication. + * + * Simple SS server that just serves one thing. + */ + +#include + +LWS_SS_USER_TYPEDEF + char payload[200]; + size_t size; + size_t pos; +} myss_srv_t; + +static lws_ss_state_return_t +myss_srv_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len, + int *flags) +{ + myss_srv_t *g = (myss_srv_t *)userobj; + lws_ss_state_return_t r = LWSSSSRET_OK; + + if (g->size == g->pos) + return LWSSSSRET_TX_DONT_SEND; + + if (*len > g->size - g->pos) + *len = g->size - g->pos; + + if (!g->pos) + *flags |= LWSSS_FLAG_SOM; + + memcpy(buf, g->payload + g->pos, *len); + g->pos += *len; + + if (g->pos != g->size) /* more to do */ + r = lws_ss_request_tx(lws_ss_from_user(g)); + else + *flags |= LWSSS_FLAG_EOM; + + lwsl_ss_user(lws_ss_from_user(g), "TX %zu, flags 0x%x, r %d", *len, + (unsigned int)*flags, (int)r); + + return r; +} + +static lws_ss_state_return_t +myss_srv_state(void *userobj, void *sh, lws_ss_constate_t state, + lws_ss_tx_ordinal_t ack) +{ + myss_srv_t *g = (myss_srv_t *)userobj; + + switch ((int)state) { + case LWSSSCS_CREATING: + return lws_ss_request_tx(lws_ss_from_user(g)); + + case LWSSSCS_SERVER_TXN: + /* + * A transaction is starting on an accepted connection. Say + * that we're OK with the transaction, prepare the user + * object with the response, and request tx to start sending it. + */ + lws_ss_server_ack(lws_ss_from_user(g), 0); + + if (lws_ss_set_metadata(lws_ss_from_user(g), "mime", + "text/html", 9)) + return LWSSSSRET_DISCONNECT_ME; + + g->size = (size_t)lws_snprintf(g->payload, sizeof(g->payload), + "Hello World: %lu", + (unsigned long)lws_now_usecs()); + g->pos = 0; + + return lws_ss_request_tx_len(lws_ss_from_user(g), + (unsigned long)g->size); + } + + return LWSSSSRET_OK; +} + +LWS_SS_INFO("myserver", myss_srv_t) + .tx = myss_srv_tx, + .state = myss_srv_state, +}; diff --git a/minimal-examples/secure-streams/minimal-secure-streams-custom-proxy-transport/CMakeLists.txt b/minimal-examples/ssproxy/ssproxy-custom-transport-uart/CMakeLists.txt similarity index 69% rename from minimal-examples/secure-streams/minimal-secure-streams-custom-proxy-transport/CMakeLists.txt rename to minimal-examples/ssproxy/ssproxy-custom-transport-uart/CMakeLists.txt index c38f4bd3f..4f9db511f 100644 --- a/minimal-examples/secure-streams/minimal-secure-streams-custom-proxy-transport/CMakeLists.txt +++ b/minimal-examples/ssproxy/ssproxy-custom-transport-uart/CMakeLists.txt @@ -1,11 +1,10 @@ -project(lws-minimal-secure-streams-custom-proxy-transport C) +project(lws-minimal-ssproxy-custom-transport-uart C) cmake_minimum_required(VERSION 2.8.12) find_package(libwebsockets CONFIG REQUIRED) list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR}) include(CheckCSourceCompiles) include(LwsCheckRequirements) -set(SAMP lws-minimal-secure-streams-custom-proxy-transport) set(SRCS main.c transport-serial.c) set(requirements 1) @@ -19,12 +18,17 @@ require_lws_config(LWS_WITH_SYS_STATE 1 requirements) # non-linux don't have B2000000 2Mbps USB serial baud rate constants if (requirements AND ${CMAKE_SYSTEM_NAME} STREQUAL "Linux") - add_executable(${SAMP} ${SRCS}) + add_executable(${PROJECT_NAME} ${SRCS}) if (websockets_shared) - target_link_libraries(${SAMP} websockets_shared ${LIBWEBSOCKETS_DEP_LIBS}) - add_dependencies(${SAMP} websockets_shared) + target_link_libraries(${PROJECT_NAME} + websockets_shared + ${LIBWEBSOCKETS_DEP_LIBS}) + add_dependencies(${PROJECT_NAME} + websockets_shared) else() - target_link_libraries(${SAMP} websockets ${LIBWEBSOCKETS_DEP_LIBS}) + target_link_libraries(${PROJECT_NAME} + websockets + ${LIBWEBSOCKETS_DEP_LIBS}) endif() endif() diff --git a/minimal-examples/ssproxy/ssproxy-custom-transport-uart/README.md b/minimal-examples/ssproxy/ssproxy-custom-transport-uart/README.md new file mode 100644 index 000000000..29d713f49 --- /dev/null +++ b/minimal-examples/ssproxy/ssproxy-custom-transport-uart/README.md @@ -0,0 +1,158 @@ +# lws minimal ssproxy UART transport + +Operates as a secure streams proxy, with a custom transport +for a UART + +See ./minimal-examples/embedded/pico/pico-sspc-binance for an RPi pico +based device that wants to use the proxy over UART. + +## build + +``` + $ cmake . && make +``` + +## usage + +Commandline option|Meaning +---|--- +-d |Debug verbosity in decimal, eg, -d15 +-f| Force connecting to the wrong endpoint to check backoff retry flow +-p |If not given, proxy listens on a Unix Domain Socket, if given listen on specified tcp port +-i |Optionally specify the UDS path (no -p) or network interface to bind to (if -p also given) + +``` +[2021/10/04 11:05:55:8347] U: LWS secure streams Proxy [-d] +[2021/10/04 11:05:55:8348] N: LWS: 4.2.99-v4.2.0-215-g0e30e05c8a, NET CLI SRV H1 H2 WS MQTT SS-JSON-POL SSPROX MbedTLS ConMon IPv6-absent +[2021/10/04 11:05:55:8350] N: ++ [1316112|wsi|0|pipe] (1) +[2021/10/04 11:05:55:8350] N: ++ [1316112|vh|0|netlink] (1) +[2021/10/04 11:05:55:8351] N: ++ [1316112|vh|1|default||-1] (2) +[2021/10/04 11:05:55:8354] N: ++ [1316112|vh|2|le_via_isrg||-1] (3) +[2021/10/04 11:05:55:8355] N: ++ [1316112|vh|3|_ss_default||-1] (4) +[2021/10/04 11:05:55:8355] U: cb_proxy_serial_transport: PROTOCOL_INIT default +[2021/10/04 11:05:55:8356] N: ++ [1316112|wsiSScli|0|captive_portal_detect] (1) +[2021/10/04 11:05:55:8356] N: [1316112|wsiSScli|0|captive_portal_detect]: lws_ss_check_next_state_ss: (unset) -> LWSSSCS_CREATING +[2021/10/04 11:05:55:8356] N: [1316112|wsiSScli|0|captive_portal_detect]: lws_ss_check_next_state_ss: LWSSSCS_CREATING -> LWSSSCS_POLL +[2021/10/04 11:05:55:8356] N: [1316112|wsiSScli|0|captive_portal_detect]: lws_ss_check_next_state_ss: LWSSSCS_POLL -> LWSSSCS_CONNECTING +[2021/10/04 11:05:55:8356] N: ++ [1316112|wsicli|0|GET/h1/connectivitycheck.android.com/([1316112|wsiSScli|0|captive_portal_det] (1) +[2021/10/04 11:05:55:8452] N: lws_ss_sys_cpd: CPD already ongoing +[2021/10/04 11:05:55:9454] N: ++ [1316112|wsiSScli|1|fetch_policy] (2) +[2021/10/04 11:05:55:9454] N: [1316112|wsiSScli|1|fetch_policy]: lws_ss_check_next_state_ss: (unset) -> LWSSSCS_CREATING +[2021/10/04 11:05:55:9455] N: [1316112|wsiSScli|1|fetch_policy]: lws_ss_check_next_state_ss: LWSSSCS_CREATING -> LWSSSCS_POLL +[2021/10/04 11:05:55:9455] N: [1316112|wsiSScli|1|fetch_policy]: lws_ss_check_next_state_ss: LWSSSCS_POLL -> LWSSSCS_CONNECTING +[2021/10/04 11:05:55:9455] N: ++ [1316112|wsicli|1|GET/h1/warmcat.com/([1316112|wsiSScli|1|fetch_policy])] (2) +[2021/10/04 11:05:56:0537] N: [1316112|wsiSScli|0|captive_portal_detect]: lws_ss_check_next_state_ss: LWSSSCS_CONNECTING -> LWSSSCS_CONNECTED +[2021/10/04 11:05:56:0538] N: [1316112|wsiSScli|0|captive_portal_detect]: lws_ss_check_next_state_ss: LWSSSCS_CONNECTED -> LWSSSCS_QOS_ACK_REMOTE +[2021/10/04 11:05:56:0538] N: lws_system_cpd_set: setting CPD result OK +[2021/10/04 11:05:56:0538] N: [1316112|wsiSScli|0|captive_portal_detect]: lws_ss_check_next_state_ss: LWSSSCS_QOS_ACK_REMOTE -> LWSSSCS_DISCONNECTED +[2021/10/04 11:05:56:0538] N: [1316112|wsiSScli|0|captive_portal_detect]: lws_ss_check_next_state_ss: LWSSSCS_DISCONNECTED -> LWSSSCS_DESTROYING +[2021/10/04 11:05:56:0538] N: -- [1316112|wsiSScli|0|captive_portal_detect] (1) 218.222ms +[2021/10/04 11:05:56:0539] N: -- [1316112|wsicli|0|GET/h1/connectivitycheck.android.com/([1316112|wsiSScli|0|captive_portal_det] (1) 218.250ms +[2021/10/04 11:05:56:1210] N: [1316112|wsiSScli|1|fetch_policy]: lws_ss_check_next_state_ss: LWSSSCS_CONNECTING -> LWSSSCS_CONNECTED +[2021/10/04 11:05:56:1546] N: [1316112|wsiSScli|1|fetch_policy]: lws_ss_check_next_state_ss: LWSSSCS_CONNECTED -> LWSSSCS_QOS_ACK_REMOTE +[2021/10/04 11:05:56:1546] W: lws_ss_destroy: conn->ss->wsi 0 0 +[2021/10/04 11:05:56:1547] N: -- [1316112|wsicli|1|GET/h1/warmcat.com/([1316112|wsiSScli|1|fetch_policy])] (0) 209.245ms +[2021/10/04 11:05:56:1548] N: [1316112|wsiSScli|1|fetch_policy]: lws_ss_check_next_state_ss: LWSSSCS_QOS_ACK_REMOTE -> LWSSSCS_DISCONNECTED +[2021/10/04 11:05:56:1548] N: [1316112|wsiSScli|1|fetch_policy]: lws_ss_check_next_state_ss: LWSSSCS_DISCONNECTED -> LWSSSCS_DESTROYING +[2021/10/04 11:05:56:1548] N: -- [1316112|wsiSScli|1|fetch_policy] (0) 209.356ms +[2021/10/04 11:05:56:1548] N: -- [1316112|vh|2|le_via_isrg||-1] (3) 319.414ms +[2021/10/04 11:05:56:1548] N: ++ [1316112|vh|4|s3-root-cert||-1] (4) +[2021/10/04 11:05:56:1548] N: ++ [1316112|vh|5|digicert||-1] (5) +[2021/10/04 11:05:56:1549] N: ++ [1316112|vh|6|le_via_isrg||-1] (6) +[2021/10/04 11:05:56:1549] N: ++ [1316112|vh|7|arca1||-1] (7) +[2021/10/04 11:05:56:1549] N: ++ [1316112|vh|8|mqtt_amz_iot||-1] (8) +[2021/10/04 11:05:56:1549] N: ++ [1316112|vh|9|avs_via_starfield||-1] (9) +[2021/10/04 11:05:56:1550] N: ++ [1316112|vh|a|api_amazon_com||-1] (10) +[2021/10/04 11:05:56:1550] U: lws_transport_mux_init_proxy_server: priv_inward (nil) +[2021/10/04 11:05:56:2099] N: open_serial_port: serial port opened 6 +[2021/10/04 11:05:56:2099] U: txp_serial_init_proxy_server: txp_priv_inward 0x1c70080 +[2021/10/04 11:05:56:2099] N: ++ [1316112|wsisrv|0|adopted] (1) +[2021/10/04 11:05:56:2099] N: LWS_CALLBACK_RAW_ADOPT_FILE +[2021/10/04 11:05:56:2099] U: txp_serial_init_proxy_server: OK (txp_priv_in 0x1c70080) +[2021/10/04 11:05:56:2099] U: lws_transport_mux_init_proxy_server: OK +[2021/10/04 11:05:56:2099] N: sul_ping_cb: issuing ping +[2021/10/04 11:05:56:2241] N: +[2021/10/04 11:05:56:2242] N: 0000: F9 F6 00 00 00 00 1F 2F 89 9C F7 00 00 01 27 29 ......./......') +[2021/10/04 11:05:56:2242] N: 0010: 4E A2 7B 00 00 00 00 1F 2F 8A 71 N.{...../.q +[2021/10/04 11:05:56:2242] N: +[2021/10/04 11:05:56:2242] U: lws_transport_mux_rx_parse: got PING +[2021/10/04 11:05:56:2242] U: lws_transport_mux_rx_parse: got PONG +[2021/10/04 11:05:56:2242] U: lws_transport_set_link: ******* transport mux link is UP +[2021/10/04 11:05:56:2400] N: +[2021/10/04 11:05:56:2400] N: 0000: F8 00 00 00 00 1F 2F C1 12 ....../.. +[2021/10/04 11:05:56:2400] N: +[2021/10/04 11:05:56:2400] U: lws_transport_mux_rx_parse: got PONGACK: ustime 523223314 +[2021/10/04 11:05:56:7500] N: +[2021/10/04 11:05:56:7500] N: 0000: F0 FF F0 FE .... +[2021/10/04 11:05:56:7501] N: +[2021/10/04 11:05:56:7501] N: ltm_ch_opens +[2021/10/04 11:05:56:7501] N: ltm_ch_opens +[2021/10/04 11:05:56:7659] N: +[2021/10/04 11:05:56:7659] N: 0000: F5 FF 00 13 AA 00 10 01 FF FF FF FF 1D 64 29 1F .............d). +[2021/10/04 11:05:56:7659] N: 0010: 62 69 6E 61 6E 63 65 F5 FE 00 17 AA 00 14 01 FF binance......... +[2021/10/04 11:05:56:7659] N: 0020: FF FF FF 1D C8 CA BB 6D 69 6E 74 65 73 74 2D 6C .......mintest-l +[2021/10/04 11:05:56:7659] N: 0030: 77 73 ws +[2021/10/04 11:05:56:7659] N: +[2021/10/04 11:05:56:7659] N: ltm_ch_payload +[2021/10/04 11:05:56:7659] N: lws_transport_path_proxy_dump: ltm_ch_payload: MUX: 0x1c70080, IN: ops txp_inside_proxy, priv (nil), ONW: ops txp_inside_proxy, priv (nil) +[2021/10/04 11:05:56:7659] N: ++ [1316112|wsiSScli|2|binance|v1|4294967295] (1) +[2021/10/04 11:05:56:7659] N: [1316112|wsiSScli|2|binance|v1|4294967295]: lws_ss_check_next_state_ss: (unset) -> LWSSSCS_CREATING +[2021/10/04 11:05:56:7659] N: lws_sss_proxy_onward_state: [1316112|wsiSScli|2|binance|v1|4294967295]: initializing dsh max len 262144 +[2021/10/04 11:05:56:7659] N: [1316112|wsiSScli|2|binance|v1|4294967295]: lws_ss_check_next_state_ss: LWSSSCS_CREATING -> LWSSSCS_CONNECTING +[2021/10/04 11:05:56:7659] N: ++ [1316112|wsicli|2|WS/h1/fstream.binance.com/([1316112|wsiSScli|2|binance|v1|4294967295])] (1) +[2021/10/04 11:05:56:7675] N: ltm_ch_payload +[2021/10/04 11:05:56:7675] N: lws_transport_path_proxy_dump: ltm_ch_payload: MUX: 0x1c70080, IN: ops txp_inside_proxy, priv (nil), ONW: ops txp_inside_proxy, priv (nil) +[2021/10/04 11:05:56:7675] N: ++ [1316112|wsiSScli|3|mintest-lws|v1|4294967295] (2) +[2021/10/04 11:05:56:7675] N: [1316112|wsiSScli|3|mintest-lws|v1|4294967295]: lws_ss_check_next_state_ss: (unset) -> LWSSSCS_CREATING +[2021/10/04 11:05:56:7675] N: lws_sss_proxy_onward_state: [1316112|wsiSScli|3|mintest-lws|v1|4294967295]: initializing dsh max len 32768 +[2021/10/04 11:05:56:7818] N: +[2021/10/04 11:05:56:7818] N: 0000: F5 FF 00 03 AB 00 00 ....... +[2021/10/04 11:05:56:7818] N: +[2021/10/04 11:05:56:7818] N: ltm_ch_payload +[2021/10/04 11:05:56:7818] N: lws_transport_path_proxy_dump: ltm_ch_payload: MUX: 0x1c70080, IN: ops txp_inside_proxy, priv (nil), ONW: ops txp_inside_proxy, priv (nil) +[2021/10/04 11:05:56:7818] N: lws_ss_proxy_deserialize_parse: ONWARD_CONNECT +[2021/10/04 11:05:57:8864] N: [1316112|wsiSScli|2|binance|v1|4294967295]: lws_ss_check_next_state_ss: LWSSSCS_CONNECTING -> LWSSSCS_CONNECTED +[2021/10/04 11:05:57:8980] N: +[2021/10/04 11:05:57:8981] N: 0000: F5 FE 00 03 AB 00 00 ....... +[2021/10/04 11:05:57:8981] N: +[2021/10/04 11:05:57:8981] N: ltm_ch_payload +[2021/10/04 11:05:57:8981] N: lws_transport_path_proxy_dump: ltm_ch_payload: MUX: 0x1c70080, IN: ops txp_inside_proxy, priv (nil), ONW: ops txp_inside_proxy, priv (nil) +[2021/10/04 11:05:57:8981] N: lws_ss_proxy_deserialize_parse: ONWARD_CONNECT +[2021/10/04 11:05:57:8981] N: [1316112|wsiSScli|3|mintest-lws|v1|4294967295]: lws_ss_check_next_state_ss: LWSSSCS_CREATING -> LWSSSCS_CONNECTING +[2021/10/04 11:05:57:8981] N: ++ [1316112|wsiSSPonw|0|GET/h1/libwebsockets.org/([1316112|wsiSScli|3|mintest-lws|v1|4294967295])] (1) +[2021/10/04 11:05:57:9173] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 696 +[2021/10/04 11:05:57:9309] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 896 +[2021/10/04 11:05:57:9513] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 512 +[2021/10/04 11:05:57:9663] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 264 +[2021/10/04 11:05:57:9860] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 472 +[2021/10/04 11:05:58:0126] N: [1316112|wsiSScli|3|mintest-lws|v1|4294967295]: lws_ss_check_next_state_ss: LWSSSCS_CONNECTING -> LWSSSCS_CONNECTED +[2021/10/04 11:05:58:0136] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 1744 +[2021/10/04 11:05:58:0136] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 3344 +[2021/10/04 11:05:58:0136] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 3720 +[2021/10/04 11:05:58:0136] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 5392 +[2021/10/04 11:05:58:0136] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 6752 +[2021/10/04 11:05:58:0136] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 6840 +[2021/10/04 11:05:58:0137] N: [1316112|wsiSScli|3|mintest-lws|v1|4294967295]: lws_ss_check_next_state_ss: LWSSSCS_CONNECTED -> LWSSSCS_QOS_ACK_REMOTE +[2021/10/04 11:05:58:0137] N: [1316112|wsiSScli|3|mintest-lws|v1|4294967295]: lws_ss_check_next_state_ss: LWSSSCS_QOS_ACK_REMOTE -> LWSSSCS_DISCONNECTED +[2021/10/04 11:05:58:0138] N: -- [1316112|wsiSSPonw|0|GET/h1/libwebsockets.org/([1316112|wsiSScli|3|mintest-lws|v1|4294967295])] (0) 115.696ms +[2021/10/04 11:05:58:0197] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 464 +[2021/10/04 11:05:58:0555] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 464 +[2021/10/04 11:05:58:0936] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 848 +[2021/10/04 11:05:58:1322] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 552 +[2021/10/04 11:05:58:1647] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 1016 +[2021/10/04 11:05:58:2000] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 448 +[2021/10/04 11:05:58:2313] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 888 +[2021/10/04 11:05:58:2514] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 264 +[2021/10/04 11:05:58:2562] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 464 +[2021/10/04 11:05:58:2639] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 952 +[2021/10/04 11:05:58:2972] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 2072 +[2021/10/04 11:05:58:3304] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 1776 +[2021/10/04 11:05:58:3321] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 1976 +[2021/10/04 11:05:58:3364] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 1048 +[2021/10/04 11:05:58:3464] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 1248 +[2021/10/04 11:05:58:3515] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 264 +[2021/10/04 11:05:58:3629] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 1088 +[2021/10/04 11:05:58:3706] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 272 +[2021/10/04 11:05:58:3714] N: lws_ss_serialize_rx_payload: dsh c2p 0, p2c 264 +... +``` diff --git a/minimal-examples/secure-streams/minimal-secure-streams-custom-proxy-transport/main.c b/minimal-examples/ssproxy/ssproxy-custom-transport-uart/main.c similarity index 62% rename from minimal-examples/secure-streams/minimal-secure-streams-custom-proxy-transport/main.c rename to minimal-examples/ssproxy/ssproxy-custom-transport-uart/main.c index d66f25ddd..e16f24cf0 100644 --- a/minimal-examples/secure-streams/minimal-secure-streams-custom-proxy-transport/main.c +++ b/minimal-examples/ssproxy/ssproxy-custom-transport-uart/main.c @@ -1,7 +1,7 @@ /* * lws-minimal-secure-streams-custom-proxy-transport * - * Written in 2010-2020 by Andy Green + * Written in 2010-2021 by Andy Green * * This file is made available under the Creative Commons CC0 1.0 * Universal Public Domain Dedication. @@ -15,17 +15,12 @@ #include #include -#if defined(__APPLE__) || defined(__linux__) -#include -#include -#endif - #include "private.h" -static int bad = 1, port = 0 /* unix domain socket */; +static int test_result = 1, port = 0 /* unix domain socket */; static const char *ibind = "/dev/ttyUSB0"; static lws_state_notify_link_t nl; -static struct lws_context *context; +static struct lws_context *cx; int interrupted; /* @@ -112,63 +107,15 @@ static const char * const default_ss_policy = "}" ; -static const char *canned_root_token_payload = - "grant_type=refresh_token" - "&refresh_token=Atzr|IwEBIJedGXjDqsU_vMxykqOMg" - "SHfYe3CPcedueWEMWSDMaDnEmiW8RlR1Kns7Cb4B-TOSnqp7ifVsY4BMY2B8tpHfO39XP" - "zfu9HapGjTR458IyHX44FE71pWJkGZ79uVBpljP4sazJuk8XS3Oe_yLnm_DIO6fU1nU3Y" - "0flYmsOiOAQE_gRk_pdlmEtHnpMA-9rLw3mkY5L89Ty9kUygBsiFaYatouROhbsTn8-jW" - "k1zZLUDpT6ICtBXSnrCIg0pUbZevPFhTwdXd6eX-u4rq0W-XaDvPWFO7au-iPb4Zk5eZE" - "iX6sissYrtNmuEXc2uHu7MnQO1hHCaTdIO2CANVumf-PHSD8xseamyh04sLV5JgFzY45S" - "KvKMajiUZuLkMokOx86rjC2Hdkx5DO7G-dbG1ufBDG-N79pFMSs7Ck5pc283IdLoJkCQc" - "AGvTX8o8I29QqkcGou-9TKhOJmpX8As94T61ok0UqqEKPJ7RhfQHHYdCtsdwxgvfVr9qI" - "xL_hDCcTho8opCVX-6QhJHl6SQFlTw13" - "&client_id=" - "amzn1.application-oa2-client.4823334c434b4190a2b5a42c07938a2d"; - -#if defined(LWS_WITH_SECURE_STREAMS_AUTH_SIGV4) -static char *aws_keyid = NULL, - *aws_key = NULL; -#endif - static int app_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link, int current, int target) { struct lws_context *context = lws_system_context_from_system_mgr(mgr); - lws_system_blob_t *ab = lws_system_get_blob(context, - LWS_SYSBLOB_TYPE_AUTH, 1 /* AUTH_IDX_ROOT */); - size_t size; - /* - * For the things we care about, let's notice if we are trying to get - * past them when we haven't solved them yet, and make the system - * state wait while we trigger the dependent action. - */ switch (target) { - case LWS_SYSTATE_REGISTERED: - size = lws_system_blob_get_size(ab); - if (size) - break; - - /* let's register our canned root token so auth can use it */ - lws_system_blob_direct_set(ab, - (const uint8_t *)canned_root_token_payload, - strlen(canned_root_token_payload)); - break; case LWS_SYSTATE_OPERATIONAL: if (current == LWS_SYSTATE_OPERATIONAL) { -#if defined(LWS_WITH_SECURE_STREAMS_AUTH_SIGV4) - - if (lws_aws_filesystem_credentials_helper( - "~/.aws/credentials", - "aws_access_key_id", - "aws_secret_access_key", - &aws_keyid, &aws_key)) - return -1; - - lws_ss_sigv4_set_aws_key(context, 0, aws_keyid, aws_key); -#endif /* * At this point we have DHCP, ntp, system auth token * and we can reasonably create the proxy @@ -178,18 +125,9 @@ app_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link, __func__); return -1; } + test_result = 0; } break; - case LWS_SYSTATE_POLICY_INVALID: - /* - * This is a NOP since we used direct set... but in a real - * system this could easily change to be done on the heap, then - * this would be important - */ - lws_system_blob_destroy(lws_system_get_blob(context, - LWS_SYSBLOB_TYPE_AUTH, - 1 /* AUTH_IDX_ROOT */)); - break; } return 0; @@ -199,30 +137,6 @@ static lws_state_notify_link_t * const app_notifier_list[] = { &nl, NULL }; -#if defined(LWS_WITH_SYS_METRICS) - -static int -my_metric_report(lws_metric_pub_t *mp) -{ - lws_metric_bucket_t *sub = mp->u.hist.head; - char buf[192]; - - do { - if (lws_metrics_format(mp, &sub, buf, sizeof(buf))) - lwsl_user("%s: %s\n", __func__, buf); - } while ((mp->flags & LWSMTFL_REPORT_HIST) && sub); - - /* 0 = leave metric to accumulate, 1 = reset the metric */ - - return 1; -} - -static const lws_system_ops_t system_ops = { - .metric_report = my_metric_report, -}; - -#endif - const struct lws_protocols *ppcols[] = { &protocol_sspc_serial_transport, NULL @@ -243,24 +157,19 @@ lws_transport_info_t info_serial = { .flags = LWSTMINFO_SERVER, }; -\ static void sigint_handler(int sig) { - lwsl_notice("%s\n", __func__); - interrupted = 1; - lws_cancel_service(context); + lws_default_loop_exit(cx); } int main(int argc, const char **argv) { struct lws_context_creation_info info; const char *p; - int n = 0; - memset(&info, 0, sizeof info); + lws_context_info_defaults(&info, default_ss_policy); lws_cmdline_option_handle_builtin(argc, argv, &info); - signal(SIGINT, sigint_handler); /* connect to ssproxy via UDS by default, else via tcp with this port */ @@ -278,8 +187,6 @@ int main(int argc, const char **argv) LWS_SERVER_OPTION_H2_JUST_FIX_WINDOW_UPDATE_OVERFLOW | LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; info.fd_limit_per_thread = 1 + 26 + 1; - info.pss_policies_json = default_ss_policy; - info.port = CONTEXT_PORT_NO_LISTEN; info.pprotocols = ppcols; /* integrate us with lws system state management when context created */ @@ -290,38 +197,16 @@ int main(int argc, const char **argv) info.pt_serv_buf_size = (unsigned int)((6144 * 2) + 2048); info.max_http_header_data = (unsigned short)(6144 + 2048); -#if defined(LWS_WITH_SYS_METRICS) - info.system_ops = &system_ops; - info.metrics_prefix = "ssproxy"; -#endif - info.txp_ops_ssproxy = &lws_transport_mux_proxy_ops; info.txp_ssproxy_info = &info_mux; - context = lws_create_context(&info); - if (!context) { + cx = lws_create_context(&info); + if (!cx) { lwsl_err("lws init failed\n"); return 1; } - /* the event loop */ + lws_context_default_loop_run_destroy(cx); - do { - n = lws_service(context, 0); - } while (n >= 0 && !interrupted); - - bad = 0; - -#if defined(LWS_WITH_SECURE_STREAMS_AUTH_SIGV4) - if (aws_keyid) - free(aws_keyid); - if (aws_key) - free(aws_key); -#endif - - lws_context_destroy(context); - - lwsl_user("Completed: %s\n", bad ? "failed" : "OK"); - - return bad; + return lws_cmdline_passfail(argc, argv, test_result); } diff --git a/minimal-examples/secure-streams/minimal-secure-streams-custom-proxy-transport/private.h b/minimal-examples/ssproxy/ssproxy-custom-transport-uart/private.h similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-custom-proxy-transport/private.h rename to minimal-examples/ssproxy/ssproxy-custom-transport-uart/private.h diff --git a/minimal-examples/secure-streams/minimal-secure-streams-custom-proxy-transport/transport-serial.c b/minimal-examples/ssproxy/ssproxy-custom-transport-uart/transport-serial.c similarity index 98% rename from minimal-examples/secure-streams/minimal-secure-streams-custom-proxy-transport/transport-serial.c rename to minimal-examples/ssproxy/ssproxy-custom-transport-uart/transport-serial.c index 9d898ccb7..fcced4d4d 100644 --- a/minimal-examples/secure-streams/minimal-secure-streams-custom-proxy-transport/transport-serial.c +++ b/minimal-examples/ssproxy/ssproxy-custom-transport-uart/transport-serial.c @@ -7,7 +7,7 @@ * Universal Public Domain Dedication. * * - * This is a version of minimal-secure-streams-proxy that uses a custom + * This is an SS Proxy that uses the UART + lws_transport_mux as the custom * transport. */ diff --git a/minimal-examples/ssproxy/ssproxy-socket/CMakeLists.txt b/minimal-examples/ssproxy/ssproxy-socket/CMakeLists.txt new file mode 100644 index 000000000..db257bf4d --- /dev/null +++ b/minimal-examples/ssproxy/ssproxy-socket/CMakeLists.txt @@ -0,0 +1,32 @@ +project(lws-minimal-ss-proxy C) +cmake_minimum_required(VERSION 2.8.12) +find_package(libwebsockets CONFIG REQUIRED) +list(APPEND CMAKE_MODULE_PATH ${LWS_CMAKE_DIR}) +include(CheckCSourceCompiles) +include(LwsCheckRequirements) + +set(SRCS main.c) + +set(requirements 1) +require_lws_config(LWS_ROLE_H1 1 requirements) +require_lws_config(LWS_WITHOUT_CLIENT 0 requirements) +require_lws_config(LWS_WITH_SECURE_STREAMS 1 requirements) +require_lws_config(LWS_WITH_SECURE_STREAMS_PROXY_API 1 requirements) +require_lws_config(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY 0 requirements) +require_lws_config(LWS_WITH_SYS_STATE 1 requirements) + +if (requirements) + add_executable(${PROJECT_NAME} ${SRCS}) + + if (websockets_shared) + target_link_libraries(${PROJECT_NAME} + websockets_shared + ${LIBWEBSOCKETS_DEP_LIBS}) + add_dependencies(${PROJECT_NAME} + websockets_shared) + else() + target_link_libraries(${PROJECT_NAME} + websockets + ${LIBWEBSOCKETS_DEP_LIBS}) + endif() +endif() diff --git a/minimal-examples/secure-streams/minimal-secure-streams-proxy/README.md b/minimal-examples/ssproxy/ssproxy-socket/README.md similarity index 100% rename from minimal-examples/secure-streams/minimal-secure-streams-proxy/README.md rename to minimal-examples/ssproxy/ssproxy-socket/README.md diff --git a/minimal-examples/ssproxy/ssproxy-socket/main.c b/minimal-examples/ssproxy/ssproxy-socket/main.c new file mode 100644 index 000000000..1fc96b706 --- /dev/null +++ b/minimal-examples/ssproxy/ssproxy-socket/main.c @@ -0,0 +1,198 @@ +/* + * lws-minimal-secure-streams-proxy + * + * Written in 2010-2021 by Andy Green + * + * This file is made available under the Creative Commons CC0 1.0 + * Universal Public Domain Dedication. + * + * + * This shows how to instantiate an SS Proxy... when clients are built with + * LWS_SS_USE_SSPC defined as a compiler preprocessor symbol, instead of doing + * their own SS networking, they connect out to an SS Proxy, by default at a + * Unix Domain Socket address @proxy.ss.lws, although you can also listen on + * TCP. + * + * The central networking management can then optimize connections, eg, sharing + * an h2 bundle to the same endpoint even though streams inside are from + * different processes. + * + * The proxy's policy can be a literal string, a local file, or brought in at + * init from over the network. In this example, there's a small literal policy + * that tells the proxy to download + * https://warmcat.com/policy/minimal-proxy-v4.2-v2.json and use that, for + * convenience that includes all the minimal example streamtypes. + */ + +#include +#include +#include + +static int test_result = 1, port = 0 /* unix domain socket */; +static const char *ibind = NULL; /* default to unix domain skt "proxy.ss.lws" */ +static lws_state_notify_link_t nl; +static struct lws_context *cx; + +/* + * We just define enough policy so it can fetch the latest one from warmcat.com + * securely. You'd probably want to provide a JSON file + */ + +static const char * const default_ss_policy = + "{" + "\"release\":" "\"01234567\"," + "\"product\":" "\"myproduct\"," + "\"schema-version\":" "1," + "\"retry\": [" /* named backoff / retry strategies */ + "{\"default\": {" + "\"backoff\": [" "1000," + "2000," + "3000," + "5000," + "10000" + "]," + "\"conceal\":" "5," + "\"jitterpc\":" "20," + "\"svalidping\":" "30," + "\"svalidhup\":" "35" + "}}" + "]," + "\"certs\": [" /* named individual certificates in BASE64 DER */ + /* + * Let's Encrypt certs for warmcat.com / libwebsockets.org + * + * We fetch the real policy from there using SS and switch to + * using that. + */ + "{\"dst_root_x3\": \"" + "MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/" + "MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT" + "DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow" + "PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD" + "Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB" + "AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O" + "rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq" + "OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b" + "xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw" + "7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD" + "aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV" + "HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG" + "SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69" + "ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr" + "AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz" + "R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5" + "JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo" + "Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ" + "\"}" + "]," + "\"trust_stores\": [" /* named cert chains */ + "{" + "\"name\": \"le_via_dst\"," + "\"stack\": [" + "\"dst_root_x3\"" + "]" + "}" + "]," + "\"s\": [{" + "\"captive_portal_detect\": {" + "\"endpoint\": \"connectivitycheck.android.com\"," + "\"http_url\": \"generate_204\"," + "\"port\": 80," + "\"protocol\": \"h1\"," + "\"http_method\": \"GET\"," + "\"opportunistic\": true," + "\"http_expect\": 204," + "\"http_fail_redirect\": true" + "}," + "\"fetch_policy\": {" + "\"endpoint\":" "\"warmcat.com\"," + "\"port\":" "443," + "\"protocol\":" "\"h1\"," + "\"http_method\":" "\"GET\"," + "\"http_url\":" "\"policy/minimal-proxy-v4.2-v2.json\"," + "\"tls\":" "true," + "\"opportunistic\":" "true," + "\"retry\":" "\"default\"," + "\"tls_trust_store\":" "\"le_via_dst\"" + "}}" + "}" +; + +static int +app_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link, + int current, int target) +{ + struct lws_context *context = lws_system_context_from_system_mgr(mgr); + + switch (target) { + case LWS_SYSTATE_OPERATIONAL: + if (current == LWS_SYSTATE_OPERATIONAL) { + /* + * At this point we have DHCP, ntp, system auth token + * and we can reasonably create the proxy + */ + if (lws_ss_proxy_create(context, ibind, port)) { + lwsl_err("%s: failed to create ss proxy\n", + __func__); + return -1; + } + test_result = 0; /* we passed if we started proxy */ + } + break; + } + + return 0; +} + +static lws_state_notify_link_t * const app_notifier_list[] = { + &nl, NULL +}; + +static void +sigint_handler(int sig) +{ + lws_default_loop_exit(cx); +} + +int main(int argc, const char **argv) +{ + struct lws_context_creation_info info; + const char *p; + + lws_context_info_defaults(&info, default_ss_policy); + lws_cmdline_option_handle_builtin(argc, argv, &info); + signal(SIGINT, sigint_handler); + + /* connect to ssproxy via UDS by default, else via tcp with this port */ + if ((p = lws_cmdline_option(argc, argv, "-p"))) + port = atoi(p); + + /* UDS "proxy.ss.lws" in abstract namespace, else this socket path; + * when -p given this can specify the network interface to bind to */ + if ((p = lws_cmdline_option(argc, argv, "-i"))) + ibind = p; + + lwsl_user("LWS secure streams Proxy [-d]\n"); + + info.options = LWS_SERVER_OPTION_EXPLICIT_VHOSTS | + LWS_SERVER_OPTION_H2_JUST_FIX_WINDOW_UPDATE_OVERFLOW | + LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; + info.fd_limit_per_thread = 1 + 26 + 1; + + nl.name = "app"; + nl.notify_cb = app_system_state_nf; + info.register_notifier_list = app_notifier_list; + + info.pt_serv_buf_size = (unsigned int)((6144 * 2) + 2048); + info.max_http_header_data = (unsigned short)(6144 + 2048); + + cx = lws_create_context(&info); + if (!cx) { + lwsl_err("lws init failed\n"); + return 1; + } + + lws_context_default_loop_run_destroy(cx); + + return lws_cmdline_passfail(argc, argv, test_result); +}