1d4afb5ceSopenharmony_ci/* 2d4afb5ceSopenharmony_ci * lws-minimal-secure-streams-hugeurl 3d4afb5ceSopenharmony_ci * 4d4afb5ceSopenharmony_ci * Written in 2010-2021 by Andy Green <andy@warmcat.com> 5d4afb5ceSopenharmony_ci * 6d4afb5ceSopenharmony_ci * This file is made available under the Creative Commons CC0 1.0 7d4afb5ceSopenharmony_ci * Universal Public Domain Dedication. 8d4afb5ceSopenharmony_ci * 9d4afb5ceSopenharmony_ci * 10d4afb5ceSopenharmony_ci * This checks huge url operations via httpbin.org 11d4afb5ceSopenharmony_ci */ 12d4afb5ceSopenharmony_ci 13d4afb5ceSopenharmony_ci#include <libwebsockets.h> 14d4afb5ceSopenharmony_ci#include <string.h> 15d4afb5ceSopenharmony_ci#include <signal.h> 16d4afb5ceSopenharmony_ci 17d4afb5ceSopenharmony_cistatic unsigned int timeout_ms = 3000; 18d4afb5ceSopenharmony_cistatic int interrupted, bad = 1, h1; 19d4afb5ceSopenharmony_cistatic lws_state_notify_link_t nl; 20d4afb5ceSopenharmony_cistatic size_t hugeurl_size = 4000; 21d4afb5ceSopenharmony_cistatic char *hugeurl, *check; 22d4afb5ceSopenharmony_ci 23d4afb5ceSopenharmony_ci#if !defined(LWS_SS_USE_SSPC) 24d4afb5ceSopenharmony_cistatic const char * const default_ss_policy = 25d4afb5ceSopenharmony_ci "{" 26d4afb5ceSopenharmony_ci "\"release\":" "\"01234567\"," 27d4afb5ceSopenharmony_ci "\"product\":" "\"myproduct\"," 28d4afb5ceSopenharmony_ci "\"schema-version\":" "1," 29d4afb5ceSopenharmony_ci#if defined(VIA_LOCALHOST_SOCKS) 30d4afb5ceSopenharmony_ci "\"via-socks5\":" "\"127.0.0.1:1080\"," 31d4afb5ceSopenharmony_ci#endif 32d4afb5ceSopenharmony_ci 33d4afb5ceSopenharmony_ci "\"retry\": [" /* named backoff / retry strategies */ 34d4afb5ceSopenharmony_ci "{\"default\": {" 35d4afb5ceSopenharmony_ci "\"backoff\": [" "1000," 36d4afb5ceSopenharmony_ci "2000," 37d4afb5ceSopenharmony_ci "3000," 38d4afb5ceSopenharmony_ci "5000," 39d4afb5ceSopenharmony_ci "10000" 40d4afb5ceSopenharmony_ci "]," 41d4afb5ceSopenharmony_ci "\"conceal\":" "5," 42d4afb5ceSopenharmony_ci "\"jitterpc\":" "20," 43d4afb5ceSopenharmony_ci "\"svalidping\":" "30," 44d4afb5ceSopenharmony_ci "\"svalidhup\":" "35" 45d4afb5ceSopenharmony_ci "}}" 46d4afb5ceSopenharmony_ci "]," 47d4afb5ceSopenharmony_ci "\"certs\": [" /* named individual certificates in BASE64 DER */ 48d4afb5ceSopenharmony_ci /* 49d4afb5ceSopenharmony_ci * Let's Encrypt certs for warmcat.com / libwebsockets.org 50d4afb5ceSopenharmony_ci * 51d4afb5ceSopenharmony_ci * We fetch the real policy from there using SS and switch to 52d4afb5ceSopenharmony_ci * using that. 53d4afb5ceSopenharmony_ci */ 54d4afb5ceSopenharmony_ci "{\"amazon_root_ca_1\": \"" 55d4afb5ceSopenharmony_ci "MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0" 56d4afb5ceSopenharmony_ci "BAQsFADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQ" 57d4afb5ceSopenharmony_ci "QDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExN" 58d4afb5ceSopenharmony_ci "zAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcG" 59d4afb5ceSopenharmony_ci "A1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggE" 60d4afb5ceSopenharmony_ci "PADCCAQoCggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrA" 61d4afb5ceSopenharmony_ci "IthtOgQ3pOsqTQNroBvo3bSMgHFzZM9O6II8c+6zf1tRn4SWiw3te5djgdY" 62d4afb5ceSopenharmony_ci "Z6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQgLKm+a/sRxmPUDgH" 63d4afb5ceSopenharmony_ci "3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0" 64d4afb5ceSopenharmony_ci "tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyz" 65d4afb5ceSopenharmony_ci "iKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIq" 66d4afb5ceSopenharmony_ci "g0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw" 67d4afb5ceSopenharmony_ci "HQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwU" 68d4afb5ceSopenharmony_ci "AA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9r" 69d4afb5ceSopenharmony_ci "bxenDIU5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/m" 70d4afb5ceSopenharmony_ci "sv0tadQ1wUsN+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96L" 71d4afb5ceSopenharmony_ci "XFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bld" 72d4afb5ceSopenharmony_ci "ZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8o" 73d4afb5ceSopenharmony_ci "b2xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5" 74d4afb5ceSopenharmony_ci "\"}" 75d4afb5ceSopenharmony_ci "]," 76d4afb5ceSopenharmony_ci "\"trust_stores\": [" /* named cert chains */ 77d4afb5ceSopenharmony_ci "{" 78d4afb5ceSopenharmony_ci "\"name\": \"arca1\"," 79d4afb5ceSopenharmony_ci "\"stack\": [" 80d4afb5ceSopenharmony_ci "\"amazon_root_ca_1\"" 81d4afb5ceSopenharmony_ci "]" 82d4afb5ceSopenharmony_ci "}" 83d4afb5ceSopenharmony_ci "]," 84d4afb5ceSopenharmony_ci "\"s\": [{" 85d4afb5ceSopenharmony_ci 86d4afb5ceSopenharmony_ci "\"httpbin_anything_h1\": {" 87d4afb5ceSopenharmony_ci "\"endpoint\":" "\"httpbin.org\"," 88d4afb5ceSopenharmony_ci "\"port\":" "443," 89d4afb5ceSopenharmony_ci "\"protocol\":" "\"h1\"," 90d4afb5ceSopenharmony_ci "\"http_method\":" "\"GET\"," 91d4afb5ceSopenharmony_ci "\"http_url\":" "\"anything?x=${hugearg}\"," 92d4afb5ceSopenharmony_ci "\"nghttp2_quirk_end_stream\":" "true," 93d4afb5ceSopenharmony_ci "\"h2q_oflow_txcr\":" "true," 94d4afb5ceSopenharmony_ci "\"metadata\": [{" 95d4afb5ceSopenharmony_ci "\"hugearg\":" "\"\"" 96d4afb5ceSopenharmony_ci "}]," 97d4afb5ceSopenharmony_ci "\"tls\":" "true," 98d4afb5ceSopenharmony_ci "\"opportunistic\":" "true," 99d4afb5ceSopenharmony_ci "\"retry\":" "\"default\"," 100d4afb5ceSopenharmony_ci "\"tls_trust_store\":" "\"arca1\"" 101d4afb5ceSopenharmony_ci "}},{" 102d4afb5ceSopenharmony_ci "\"httpbin_anything_h2\": {" 103d4afb5ceSopenharmony_ci "\"endpoint\":" "\"httpbin.org\"," 104d4afb5ceSopenharmony_ci "\"port\":" "443," 105d4afb5ceSopenharmony_ci "\"protocol\":" "\"h2\"," 106d4afb5ceSopenharmony_ci "\"http_method\":" "\"GET\"," 107d4afb5ceSopenharmony_ci "\"http_url\":" "\"anything?x=${hugearg}\"," 108d4afb5ceSopenharmony_ci "\"nghttp2_quirk_end_stream\":" "true," 109d4afb5ceSopenharmony_ci "\"h2q_oflow_txcr\":" "true," 110d4afb5ceSopenharmony_ci "\"metadata\": [{" 111d4afb5ceSopenharmony_ci "\"hugearg\":" "\"\"" 112d4afb5ceSopenharmony_ci "}]," 113d4afb5ceSopenharmony_ci "\"tls\":" "true," 114d4afb5ceSopenharmony_ci "\"opportunistic\":" "true," 115d4afb5ceSopenharmony_ci "\"retry\":" "\"default\"," 116d4afb5ceSopenharmony_ci "\"tls_trust_store\":" "\"arca1\"" 117d4afb5ceSopenharmony_ci "}},{" 118d4afb5ceSopenharmony_ci /* 119d4afb5ceSopenharmony_ci * "captive_portal_detect" describes 120d4afb5ceSopenharmony_ci * what to do in order to check if the path to 121d4afb5ceSopenharmony_ci * the Internet is being interrupted by a 122d4afb5ceSopenharmony_ci * captive portal. If there's a larger policy 123d4afb5ceSopenharmony_ci * fetched from elsewhere, it should also include 124d4afb5ceSopenharmony_ci * this since it needs to be done at least after 125d4afb5ceSopenharmony_ci * every DHCP acquisition 126d4afb5ceSopenharmony_ci */ 127d4afb5ceSopenharmony_ci "\"captive_portal_detect\": {" 128d4afb5ceSopenharmony_ci "\"endpoint\": \"connectivitycheck.android.com\"," 129d4afb5ceSopenharmony_ci "\"http_url\": \"generate_204\"," 130d4afb5ceSopenharmony_ci "\"port\": 80," 131d4afb5ceSopenharmony_ci "\"protocol\": \"h1\"," 132d4afb5ceSopenharmony_ci "\"http_method\": \"GET\"," 133d4afb5ceSopenharmony_ci "\"opportunistic\": true," 134d4afb5ceSopenharmony_ci "\"http_expect\": 204," 135d4afb5ceSopenharmony_ci "\"http_fail_redirect\": true" 136d4afb5ceSopenharmony_ci "}}" 137d4afb5ceSopenharmony_ci "]}" 138d4afb5ceSopenharmony_ci; 139d4afb5ceSopenharmony_ci 140d4afb5ceSopenharmony_ci#endif 141d4afb5ceSopenharmony_ci 142d4afb5ceSopenharmony_citypedef struct myss { 143d4afb5ceSopenharmony_ci struct lws_ss_handle *ss; 144d4afb5ceSopenharmony_ci void *opaque_data; 145d4afb5ceSopenharmony_ci /* ... application specific state ... */ 146d4afb5ceSopenharmony_ci lws_sorted_usec_list_t sul; 147d4afb5ceSopenharmony_ci struct lejp_ctx ctx; 148d4afb5ceSopenharmony_ci size_t comp; 149d4afb5ceSopenharmony_ci 150d4afb5ceSopenharmony_ci char started; 151d4afb5ceSopenharmony_ci} myss_t; 152d4afb5ceSopenharmony_ci 153d4afb5ceSopenharmony_ci 154d4afb5ceSopenharmony_cistatic const char * const lejp_tokens[] = { 155d4afb5ceSopenharmony_ci "url" 156d4afb5ceSopenharmony_ci}; 157d4afb5ceSopenharmony_ci 158d4afb5ceSopenharmony_ci/* 159d4afb5ceSopenharmony_ci * Parse the "url" member of the JSON, and collect the part after the first '=' 160d4afb5ceSopenharmony_ci * into the prepared buffer "check". 161d4afb5ceSopenharmony_ci */ 162d4afb5ceSopenharmony_ci 163d4afb5ceSopenharmony_cistatic signed char 164d4afb5ceSopenharmony_cilws_httpbin_json_cb(struct lejp_ctx *ctx, char reason) 165d4afb5ceSopenharmony_ci{ 166d4afb5ceSopenharmony_ci myss_t *m = (myss_t *)ctx->user; 167d4afb5ceSopenharmony_ci const char *p = ctx->buf; 168d4afb5ceSopenharmony_ci size_t l = ctx->npos; 169d4afb5ceSopenharmony_ci 170d4afb5ceSopenharmony_ci if (!(reason & LEJP_FLAG_CB_IS_VALUE)) 171d4afb5ceSopenharmony_ci return 0; 172d4afb5ceSopenharmony_ci 173d4afb5ceSopenharmony_ci if (ctx->path_match - 1) 174d4afb5ceSopenharmony_ci return 0; 175d4afb5ceSopenharmony_ci 176d4afb5ceSopenharmony_ci if (!m->started) 177d4afb5ceSopenharmony_ci while (l--) 178d4afb5ceSopenharmony_ci if (*p++ == '=') { 179d4afb5ceSopenharmony_ci m->started = 1; 180d4afb5ceSopenharmony_ci break; 181d4afb5ceSopenharmony_ci } 182d4afb5ceSopenharmony_ci 183d4afb5ceSopenharmony_ci if (!m->started) 184d4afb5ceSopenharmony_ci return 0; 185d4afb5ceSopenharmony_ci 186d4afb5ceSopenharmony_ci if (m->comp + l > hugeurl_size) { 187d4afb5ceSopenharmony_ci lwsl_err("%s: returned url string too large %u, %u\n", 188d4afb5ceSopenharmony_ci __func__, (unsigned int)m->comp, (unsigned int)l); 189d4afb5ceSopenharmony_ci 190d4afb5ceSopenharmony_ci return -1; 191d4afb5ceSopenharmony_ci } 192d4afb5ceSopenharmony_ci 193d4afb5ceSopenharmony_ci memcpy(check + m->comp, p, l); 194d4afb5ceSopenharmony_ci m->comp += l; 195d4afb5ceSopenharmony_ci 196d4afb5ceSopenharmony_ci return 0; 197d4afb5ceSopenharmony_ci} 198d4afb5ceSopenharmony_ci 199d4afb5ceSopenharmony_ci/* secure streams payload interface */ 200d4afb5ceSopenharmony_ci 201d4afb5ceSopenharmony_cistatic lws_ss_state_return_t 202d4afb5ceSopenharmony_cimyss_rx(void *userobj, const uint8_t *buf, size_t len, int flags) 203d4afb5ceSopenharmony_ci{ 204d4afb5ceSopenharmony_ci myss_t *m = (myss_t *)userobj; 205d4afb5ceSopenharmony_ci 206d4afb5ceSopenharmony_ci if (flags & LWSSS_FLAG_SOM) 207d4afb5ceSopenharmony_ci lejp_construct(&m->ctx, lws_httpbin_json_cb, m, 208d4afb5ceSopenharmony_ci lejp_tokens, LWS_ARRAY_SIZE(lejp_tokens)); 209d4afb5ceSopenharmony_ci 210d4afb5ceSopenharmony_ci if (len) { 211d4afb5ceSopenharmony_ci int pr = lejp_parse(&m->ctx, buf, (int)len); 212d4afb5ceSopenharmony_ci 213d4afb5ceSopenharmony_ci if (pr != LEJP_CONTINUE && pr < 0) { 214d4afb5ceSopenharmony_ci lwsl_err("%s: parse failed line %u: %d: %s\n", __func__, 215d4afb5ceSopenharmony_ci (unsigned int)m->ctx.line, pr, 216d4afb5ceSopenharmony_ci lejp_error_to_string(pr)); 217d4afb5ceSopenharmony_ci 218d4afb5ceSopenharmony_ci return LWSSSSRET_DESTROY_ME; 219d4afb5ceSopenharmony_ci } 220d4afb5ceSopenharmony_ci } 221d4afb5ceSopenharmony_ci 222d4afb5ceSopenharmony_ci if (flags & LWSSS_FLAG_EOM) { 223d4afb5ceSopenharmony_ci 224d4afb5ceSopenharmony_ci interrupted = 1; 225d4afb5ceSopenharmony_ci 226d4afb5ceSopenharmony_ci /* confirm that what we collected is the expected size */ 227d4afb5ceSopenharmony_ci 228d4afb5ceSopenharmony_ci if (m->comp != hugeurl_size) { 229d4afb5ceSopenharmony_ci lwsl_err("%s: wrong urlarg size recovered %d %d\n", 230d4afb5ceSopenharmony_ci __func__, (int)m->comp, (int)hugeurl_size); 231d4afb5ceSopenharmony_ci return LWSSSSRET_OK; 232d4afb5ceSopenharmony_ci } 233d4afb5ceSopenharmony_ci 234d4afb5ceSopenharmony_ci /* confirm what we sent is the same as what we collected */ 235d4afb5ceSopenharmony_ci 236d4afb5ceSopenharmony_ci if (memcmp(hugeurl, check, hugeurl_size)) { 237d4afb5ceSopenharmony_ci lwsl_err("%s: huge url content mismatch\n", __func__); 238d4afb5ceSopenharmony_ci 239d4afb5ceSopenharmony_ci return LWSSSSRET_OK; 240d4afb5ceSopenharmony_ci } 241d4afb5ceSopenharmony_ci 242d4afb5ceSopenharmony_ci lwsl_user("%s: return hugeurl len %u matches OK\n", __func__, 243d4afb5ceSopenharmony_ci (unsigned int)hugeurl_size); 244d4afb5ceSopenharmony_ci 245d4afb5ceSopenharmony_ci bad = 0; 246d4afb5ceSopenharmony_ci } 247d4afb5ceSopenharmony_ci 248d4afb5ceSopenharmony_ci return LWSSSSRET_OK; 249d4afb5ceSopenharmony_ci} 250d4afb5ceSopenharmony_ci 251d4afb5ceSopenharmony_cistatic lws_ss_state_return_t 252d4afb5ceSopenharmony_cimyss_state(void *userobj, void *sh, lws_ss_constate_t state, 253d4afb5ceSopenharmony_ci lws_ss_tx_ordinal_t ack) 254d4afb5ceSopenharmony_ci{ 255d4afb5ceSopenharmony_ci myss_t *m = (myss_t *)userobj; 256d4afb5ceSopenharmony_ci 257d4afb5ceSopenharmony_ci lwsl_user("%s: %s (%d), ord 0x%x\n", __func__, 258d4afb5ceSopenharmony_ci lws_ss_state_name((int)state), state, (unsigned int)ack); 259d4afb5ceSopenharmony_ci 260d4afb5ceSopenharmony_ci switch (state) { 261d4afb5ceSopenharmony_ci case LWSSSCS_CREATING: 262d4afb5ceSopenharmony_ci lws_ss_start_timeout(m->ss, timeout_ms); 263d4afb5ceSopenharmony_ci 264d4afb5ceSopenharmony_ci /* let's make the hugeurl part */ 265d4afb5ceSopenharmony_ci 266d4afb5ceSopenharmony_ci hugeurl = malloc(hugeurl_size + 1); 267d4afb5ceSopenharmony_ci if (!hugeurl) { 268d4afb5ceSopenharmony_ci lwsl_err("OOM\n"); 269d4afb5ceSopenharmony_ci return LWSSSSRET_DESTROY_ME; 270d4afb5ceSopenharmony_ci } 271d4afb5ceSopenharmony_ci 272d4afb5ceSopenharmony_ci check = malloc(hugeurl_size + 1); 273d4afb5ceSopenharmony_ci if (!check) { 274d4afb5ceSopenharmony_ci lwsl_err("OOM\n"); 275d4afb5ceSopenharmony_ci free(hugeurl); 276d4afb5ceSopenharmony_ci hugeurl = NULL; 277d4afb5ceSopenharmony_ci return LWSSSSRET_DESTROY_ME; 278d4afb5ceSopenharmony_ci } 279d4afb5ceSopenharmony_ci 280d4afb5ceSopenharmony_ci /* Create the big, random, urlarg */ 281d4afb5ceSopenharmony_ci 282d4afb5ceSopenharmony_ci lws_hex_random(lws_ss_get_context(m->ss), hugeurl, 283d4afb5ceSopenharmony_ci hugeurl_size + 1); 284d4afb5ceSopenharmony_ci if (lws_ss_set_metadata(m->ss, "hugearg", hugeurl, hugeurl_size)) 285d4afb5ceSopenharmony_ci return LWSSSSRET_DISCONNECT_ME; 286d4afb5ceSopenharmony_ci 287d4afb5ceSopenharmony_ci return lws_ss_client_connect(m->ss); 288d4afb5ceSopenharmony_ci 289d4afb5ceSopenharmony_ci case LWSSSCS_ALL_RETRIES_FAILED: 290d4afb5ceSopenharmony_ci /* if we're out of retries, we want to close the app and FAIL */ 291d4afb5ceSopenharmony_ci interrupted = 1; 292d4afb5ceSopenharmony_ci break; 293d4afb5ceSopenharmony_ci case LWSSSCS_QOS_ACK_REMOTE: 294d4afb5ceSopenharmony_ci lwsl_notice("%s: LWSSSCS_QOS_ACK_REMOTE\n", __func__); 295d4afb5ceSopenharmony_ci break; 296d4afb5ceSopenharmony_ci 297d4afb5ceSopenharmony_ci case LWSSSCS_TIMEOUT: 298d4afb5ceSopenharmony_ci lwsl_notice("%s: LWSSSCS_TIMEOUT\n", __func__); 299d4afb5ceSopenharmony_ci break; 300d4afb5ceSopenharmony_ci 301d4afb5ceSopenharmony_ci case LWSSSCS_USER_BASE: 302d4afb5ceSopenharmony_ci lwsl_notice("%s: LWSSSCS_USER_BASE\n", __func__); 303d4afb5ceSopenharmony_ci break; 304d4afb5ceSopenharmony_ci 305d4afb5ceSopenharmony_ci default: 306d4afb5ceSopenharmony_ci break; 307d4afb5ceSopenharmony_ci } 308d4afb5ceSopenharmony_ci 309d4afb5ceSopenharmony_ci return LWSSSSRET_OK; 310d4afb5ceSopenharmony_ci} 311d4afb5ceSopenharmony_ci 312d4afb5ceSopenharmony_cistatic lws_ss_info_t ssi = { 313d4afb5ceSopenharmony_ci .handle_offset = offsetof(myss_t, ss), 314d4afb5ceSopenharmony_ci .opaque_user_data_offset = offsetof(myss_t, opaque_data), 315d4afb5ceSopenharmony_ci .rx = myss_rx, 316d4afb5ceSopenharmony_ci .state = myss_state, 317d4afb5ceSopenharmony_ci .user_alloc = sizeof(myss_t), 318d4afb5ceSopenharmony_ci .streamtype = "httpbin_anything_h2" 319d4afb5ceSopenharmony_ci}; 320d4afb5ceSopenharmony_ci 321d4afb5ceSopenharmony_cistatic int 322d4afb5ceSopenharmony_ciapp_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link, 323d4afb5ceSopenharmony_ci int current, int target) 324d4afb5ceSopenharmony_ci{ 325d4afb5ceSopenharmony_ci struct lws_context *context = lws_system_context_from_system_mgr(mgr); 326d4afb5ceSopenharmony_ci 327d4afb5ceSopenharmony_ci /* 328d4afb5ceSopenharmony_ci * For the things we care about, let's notice if we are trying to get 329d4afb5ceSopenharmony_ci * past them when we haven't solved them yet, and make the system 330d4afb5ceSopenharmony_ci * state wait while we trigger the dependent action. 331d4afb5ceSopenharmony_ci */ 332d4afb5ceSopenharmony_ci if (target != LWS_SYSTATE_OPERATIONAL) 333d4afb5ceSopenharmony_ci return 0; 334d4afb5ceSopenharmony_ci 335d4afb5ceSopenharmony_ci if (current != LWS_SYSTATE_OPERATIONAL) 336d4afb5ceSopenharmony_ci return 0; 337d4afb5ceSopenharmony_ci 338d4afb5ceSopenharmony_ci if (h1) 339d4afb5ceSopenharmony_ci ssi.streamtype = "httpbin_anything_h1"; 340d4afb5ceSopenharmony_ci 341d4afb5ceSopenharmony_ci if (!lws_ss_create(context, 0, &ssi, NULL, NULL, NULL, NULL)) 342d4afb5ceSopenharmony_ci return 0; 343d4afb5ceSopenharmony_ci 344d4afb5ceSopenharmony_ci lwsl_err("%s: failed to create secure stream\n", __func__); 345d4afb5ceSopenharmony_ci 346d4afb5ceSopenharmony_ci return -1; 347d4afb5ceSopenharmony_ci} 348d4afb5ceSopenharmony_ci 349d4afb5ceSopenharmony_cistatic lws_state_notify_link_t * const app_notifier_list[] = { 350d4afb5ceSopenharmony_ci &nl, NULL 351d4afb5ceSopenharmony_ci}; 352d4afb5ceSopenharmony_ci 353d4afb5ceSopenharmony_cistatic void 354d4afb5ceSopenharmony_cisigint_handler(int sig) 355d4afb5ceSopenharmony_ci{ 356d4afb5ceSopenharmony_ci interrupted = 1; 357d4afb5ceSopenharmony_ci} 358d4afb5ceSopenharmony_ci 359d4afb5ceSopenharmony_ciint main(int argc, const char **argv) 360d4afb5ceSopenharmony_ci{ 361d4afb5ceSopenharmony_ci struct lws_context_creation_info info; 362d4afb5ceSopenharmony_ci struct lws_context *context; 363d4afb5ceSopenharmony_ci const char *p; 364d4afb5ceSopenharmony_ci int n = 0; 365d4afb5ceSopenharmony_ci 366d4afb5ceSopenharmony_ci signal(SIGINT, sigint_handler); 367d4afb5ceSopenharmony_ci 368d4afb5ceSopenharmony_ci memset(&info, 0, sizeof info); 369d4afb5ceSopenharmony_ci lws_cmdline_option_handle_builtin(argc, argv, &info); 370d4afb5ceSopenharmony_ci 371d4afb5ceSopenharmony_ci lwsl_user("LWS secure streams hugeurl test client [-d<verb>][-h <urlarg len>]\n"); 372d4afb5ceSopenharmony_ci 373d4afb5ceSopenharmony_ci info.fd_limit_per_thread = 1 + 6 + 1; 374d4afb5ceSopenharmony_ci info.port = CONTEXT_PORT_NO_LISTEN; 375d4afb5ceSopenharmony_ci#if defined(LWS_SS_USE_SSPC) 376d4afb5ceSopenharmony_ci info.protocols = lws_sspc_protocols; 377d4afb5ceSopenharmony_ci 378d4afb5ceSopenharmony_ci /* connect to ssproxy via UDS by default, else via 379d4afb5ceSopenharmony_ci * tcp connection to this port */ 380d4afb5ceSopenharmony_ci if ((p = lws_cmdline_option(argc, argv, "-p"))) 381d4afb5ceSopenharmony_ci info.ss_proxy_port = (uint16_t)atoi(p); 382d4afb5ceSopenharmony_ci 383d4afb5ceSopenharmony_ci /* UDS "proxy.ss.lws" in abstract namespace, else this socket 384d4afb5ceSopenharmony_ci * path; when -p given this can specify the network interface 385d4afb5ceSopenharmony_ci * to bind to */ 386d4afb5ceSopenharmony_ci if ((p = lws_cmdline_option(argc, argv, "-i"))) 387d4afb5ceSopenharmony_ci info.ss_proxy_bind = p; 388d4afb5ceSopenharmony_ci 389d4afb5ceSopenharmony_ci /* if -p given, -a specifies the proxy address to connect to */ 390d4afb5ceSopenharmony_ci if ((p = lws_cmdline_option(argc, argv, "-a"))) 391d4afb5ceSopenharmony_ci info.ss_proxy_address = p; 392d4afb5ceSopenharmony_ci#else 393d4afb5ceSopenharmony_ci info.pss_policies_json = default_ss_policy; 394d4afb5ceSopenharmony_ci info.options = LWS_SERVER_OPTION_EXPLICIT_VHOSTS | 395d4afb5ceSopenharmony_ci LWS_SERVER_OPTION_H2_JUST_FIX_WINDOW_UPDATE_OVERFLOW | 396d4afb5ceSopenharmony_ci LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; 397d4afb5ceSopenharmony_ci#endif 398d4afb5ceSopenharmony_ci 399d4afb5ceSopenharmony_ci if (lws_cmdline_option(argc, argv, "--h1")) 400d4afb5ceSopenharmony_ci h1 = 1; 401d4afb5ceSopenharmony_ci 402d4afb5ceSopenharmony_ci if ((p = lws_cmdline_option(argc, argv, "-h"))) 403d4afb5ceSopenharmony_ci hugeurl_size = (size_t)atol(p); 404d4afb5ceSopenharmony_ci 405d4afb5ceSopenharmony_ci if (hugeurl_size < 1 || hugeurl_size > 16384) { 406d4afb5ceSopenharmony_ci lwsl_err("%s: -h should be between 1 and 16384\n", __func__); 407d4afb5ceSopenharmony_ci return 1; 408d4afb5ceSopenharmony_ci } 409d4afb5ceSopenharmony_ci 410d4afb5ceSopenharmony_ci lwsl_user("%s: huge argument size: %u bytes\n", __func__, 411d4afb5ceSopenharmony_ci (unsigned int)hugeurl_size); 412d4afb5ceSopenharmony_ci 413d4afb5ceSopenharmony_ci info.pt_serv_buf_size = (unsigned int)((hugeurl_size * 2) + 2048); 414d4afb5ceSopenharmony_ci info.max_http_header_data = (unsigned short)(hugeurl_size + 2048); 415d4afb5ceSopenharmony_ci 416d4afb5ceSopenharmony_ci /* integrate us with lws system state management when context created */ 417d4afb5ceSopenharmony_ci 418d4afb5ceSopenharmony_ci nl.name = "app"; 419d4afb5ceSopenharmony_ci nl.notify_cb = app_system_state_nf; 420d4afb5ceSopenharmony_ci info.register_notifier_list = app_notifier_list; 421d4afb5ceSopenharmony_ci 422d4afb5ceSopenharmony_ci /* create the context */ 423d4afb5ceSopenharmony_ci 424d4afb5ceSopenharmony_ci context = lws_create_context(&info); 425d4afb5ceSopenharmony_ci if (!context) { 426d4afb5ceSopenharmony_ci lwsl_err("lws init failed\n"); 427d4afb5ceSopenharmony_ci return 1; 428d4afb5ceSopenharmony_ci } 429d4afb5ceSopenharmony_ci 430d4afb5ceSopenharmony_ci /* the event loop */ 431d4afb5ceSopenharmony_ci 432d4afb5ceSopenharmony_ci while (n >= 0 && !interrupted) 433d4afb5ceSopenharmony_ci n = lws_service(context, 0); 434d4afb5ceSopenharmony_ci 435d4afb5ceSopenharmony_ci lws_context_destroy(context); 436d4afb5ceSopenharmony_ci 437d4afb5ceSopenharmony_ci if (hugeurl) 438d4afb5ceSopenharmony_ci free(hugeurl); 439d4afb5ceSopenharmony_ci if (check) 440d4afb5ceSopenharmony_ci free(check); 441d4afb5ceSopenharmony_ci 442d4afb5ceSopenharmony_ci lwsl_user("Completed: %s\n", bad ? "failed" : "OK"); 443d4afb5ceSopenharmony_ci 444d4afb5ceSopenharmony_ci return bad; 445d4afb5ceSopenharmony_ci} 446