1d4afb5ceSopenharmony_ci/* 2d4afb5ceSopenharmony_ci * lws-minimal-secure-streams-proxy 3d4afb5ceSopenharmony_ci * 4d4afb5ceSopenharmony_ci * Written in 2010-2020 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 is the proxy part for examples built to use it to connect to... it has 11d4afb5ceSopenharmony_ci * the policy and the core SS function, but it doesn't contain any of the user 12d4afb5ceSopenharmony_ci * code "business logic"... that's in the clients. 13d4afb5ceSopenharmony_ci * 14d4afb5ceSopenharmony_ci * The proxy side has the policy and performs the onward connection proxying 15d4afb5ceSopenharmony_ci * fulfilment. The clients state the streamtype name they want and ask for the 16d4afb5ceSopenharmony_ci * client to do the connection part. 17d4afb5ceSopenharmony_ci * 18d4afb5ceSopenharmony_ci * Rideshare information is being parsed out at the proxy side; the SSS RX part 19d4afb5ceSopenharmony_ci * also brings with it rideshare names. 20d4afb5ceSopenharmony_ci * 21d4afb5ceSopenharmony_ci * Metadata is passed back over SSS from the client in the TX messages for the 22d4afb5ceSopenharmony_ci * proxy to use per the policy. 23d4afb5ceSopenharmony_ci */ 24d4afb5ceSopenharmony_ci 25d4afb5ceSopenharmony_ci#include <libwebsockets.h> 26d4afb5ceSopenharmony_ci#include <string.h> 27d4afb5ceSopenharmony_ci#include <signal.h> 28d4afb5ceSopenharmony_ci 29d4afb5ceSopenharmony_ci#if defined(__APPLE__) || defined(__linux__) 30d4afb5ceSopenharmony_ci#include <execinfo.h> 31d4afb5ceSopenharmony_ci#include <assert.h> 32d4afb5ceSopenharmony_ci#endif 33d4afb5ceSopenharmony_ci 34d4afb5ceSopenharmony_cistatic int interrupted, bad = 1, port = 0 /* unix domain socket */; 35d4afb5ceSopenharmony_cistatic const char *ibind = NULL; /* default to unix domain skt "proxy.ss.lws" */ 36d4afb5ceSopenharmony_cistatic lws_state_notify_link_t nl; 37d4afb5ceSopenharmony_cistatic struct lws_context *context; 38d4afb5ceSopenharmony_ci 39d4afb5ceSopenharmony_ci/* 40d4afb5ceSopenharmony_ci * We just define enough policy so it can fetch the latest one securely 41d4afb5ceSopenharmony_ci */ 42d4afb5ceSopenharmony_ci 43d4afb5ceSopenharmony_cistatic const char * const default_ss_policy = 44d4afb5ceSopenharmony_ci "{" 45d4afb5ceSopenharmony_ci "\"release\":" "\"01234567\"," 46d4afb5ceSopenharmony_ci "\"product\":" "\"myproduct\"," 47d4afb5ceSopenharmony_ci "\"schema-version\":" "1," 48d4afb5ceSopenharmony_ci "\"retry\": [" /* named backoff / retry strategies */ 49d4afb5ceSopenharmony_ci "{\"default\": {" 50d4afb5ceSopenharmony_ci "\"backoff\": [" "1000," 51d4afb5ceSopenharmony_ci "2000," 52d4afb5ceSopenharmony_ci "3000," 53d4afb5ceSopenharmony_ci "5000," 54d4afb5ceSopenharmony_ci "10000" 55d4afb5ceSopenharmony_ci "]," 56d4afb5ceSopenharmony_ci "\"conceal\":" "5," 57d4afb5ceSopenharmony_ci "\"jitterpc\":" "20," 58d4afb5ceSopenharmony_ci "\"svalidping\":" "30," 59d4afb5ceSopenharmony_ci "\"svalidhup\":" "35" 60d4afb5ceSopenharmony_ci "}}" 61d4afb5ceSopenharmony_ci "]," 62d4afb5ceSopenharmony_ci "\"certs\": [" /* named individual certificates in BASE64 DER */ 63d4afb5ceSopenharmony_ci /* 64d4afb5ceSopenharmony_ci * Let's Encrypt certs for warmcat.com / libwebsockets.org 65d4afb5ceSopenharmony_ci * 66d4afb5ceSopenharmony_ci * We fetch the real policy from there using SS and switch to 67d4afb5ceSopenharmony_ci * using that. 68d4afb5ceSopenharmony_ci */ 69d4afb5ceSopenharmony_ci "{\"isrg_root_x1\": \"" 70d4afb5ceSopenharmony_ci "MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw" 71d4afb5ceSopenharmony_ci "TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh" 72d4afb5ceSopenharmony_ci "cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4" 73d4afb5ceSopenharmony_ci "WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu" 74d4afb5ceSopenharmony_ci "ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY" 75d4afb5ceSopenharmony_ci "MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc" 76d4afb5ceSopenharmony_ci "h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+" 77d4afb5ceSopenharmony_ci "0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U" 78d4afb5ceSopenharmony_ci "A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW" 79d4afb5ceSopenharmony_ci "T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH" 80d4afb5ceSopenharmony_ci "B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC" 81d4afb5ceSopenharmony_ci "B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv" 82d4afb5ceSopenharmony_ci "KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn" 83d4afb5ceSopenharmony_ci "OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn" 84d4afb5ceSopenharmony_ci "jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw" 85d4afb5ceSopenharmony_ci "qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI" 86d4afb5ceSopenharmony_ci "rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV" 87d4afb5ceSopenharmony_ci "HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq" 88d4afb5ceSopenharmony_ci "hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL" 89d4afb5ceSopenharmony_ci "ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ" 90d4afb5ceSopenharmony_ci "3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK" 91d4afb5ceSopenharmony_ci "NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5" 92d4afb5ceSopenharmony_ci "ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur" 93d4afb5ceSopenharmony_ci "TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC" 94d4afb5ceSopenharmony_ci "jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc" 95d4afb5ceSopenharmony_ci "oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq" 96d4afb5ceSopenharmony_ci "4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA" 97d4afb5ceSopenharmony_ci "mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d" 98d4afb5ceSopenharmony_ci "emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=" 99d4afb5ceSopenharmony_ci "\"}" 100d4afb5ceSopenharmony_ci "]," 101d4afb5ceSopenharmony_ci "\"trust_stores\": [" /* named cert chains */ 102d4afb5ceSopenharmony_ci "{" 103d4afb5ceSopenharmony_ci "\"name\": \"le_via_isrg\"," 104d4afb5ceSopenharmony_ci "\"stack\": [" 105d4afb5ceSopenharmony_ci "\"isrg_root_x1\"" 106d4afb5ceSopenharmony_ci "]" 107d4afb5ceSopenharmony_ci "}" 108d4afb5ceSopenharmony_ci "]," 109d4afb5ceSopenharmony_ci "\"s\": [{" 110d4afb5ceSopenharmony_ci "\"captive_portal_detect\": {" 111d4afb5ceSopenharmony_ci "\"endpoint\": \"connectivitycheck.android.com\"," 112d4afb5ceSopenharmony_ci "\"http_url\": \"generate_204\"," 113d4afb5ceSopenharmony_ci "\"port\": 80," 114d4afb5ceSopenharmony_ci "\"protocol\": \"h1\"," 115d4afb5ceSopenharmony_ci "\"http_method\": \"GET\"," 116d4afb5ceSopenharmony_ci "\"opportunistic\": true," 117d4afb5ceSopenharmony_ci "\"http_expect\": 204," 118d4afb5ceSopenharmony_ci "\"http_fail_redirect\": true" 119d4afb5ceSopenharmony_ci "}," 120d4afb5ceSopenharmony_ci "\"fetch_policy\": {" 121d4afb5ceSopenharmony_ci "\"endpoint\":" "\"warmcat.com\"," 122d4afb5ceSopenharmony_ci "\"port\":" "443," 123d4afb5ceSopenharmony_ci "\"protocol\":" "\"h1\"," 124d4afb5ceSopenharmony_ci "\"http_method\":" "\"GET\"," 125d4afb5ceSopenharmony_ci "\"http_url\":" "\"policy/minimal-proxy-v4.2-v2.json\"," 126d4afb5ceSopenharmony_ci "\"tls\":" "true," 127d4afb5ceSopenharmony_ci "\"opportunistic\":" "true," 128d4afb5ceSopenharmony_ci "\"retry\":" "\"default\"," 129d4afb5ceSopenharmony_ci "\"tls_trust_store\":" "\"le_via_isrg\"" 130d4afb5ceSopenharmony_ci "}}" 131d4afb5ceSopenharmony_ci "}" 132d4afb5ceSopenharmony_ci; 133d4afb5ceSopenharmony_ci 134d4afb5ceSopenharmony_cistatic const char *canned_root_token_payload = 135d4afb5ceSopenharmony_ci "grant_type=refresh_token" 136d4afb5ceSopenharmony_ci "&refresh_token=Atzr|IwEBIJedGXjDqsU_vMxykqOMg" 137d4afb5ceSopenharmony_ci "SHfYe3CPcedueWEMWSDMaDnEmiW8RlR1Kns7Cb4B-TOSnqp7ifVsY4BMY2B8tpHfO39XP" 138d4afb5ceSopenharmony_ci "zfu9HapGjTR458IyHX44FE71pWJkGZ79uVBpljP4sazJuk8XS3Oe_yLnm_DIO6fU1nU3Y" 139d4afb5ceSopenharmony_ci "0flYmsOiOAQE_gRk_pdlmEtHnpMA-9rLw3mkY5L89Ty9kUygBsiFaYatouROhbsTn8-jW" 140d4afb5ceSopenharmony_ci "k1zZLUDpT6ICtBXSnrCIg0pUbZevPFhTwdXd6eX-u4rq0W-XaDvPWFO7au-iPb4Zk5eZE" 141d4afb5ceSopenharmony_ci "iX6sissYrtNmuEXc2uHu7MnQO1hHCaTdIO2CANVumf-PHSD8xseamyh04sLV5JgFzY45S" 142d4afb5ceSopenharmony_ci "KvKMajiUZuLkMokOx86rjC2Hdkx5DO7G-dbG1ufBDG-N79pFMSs7Ck5pc283IdLoJkCQc" 143d4afb5ceSopenharmony_ci "AGvTX8o8I29QqkcGou-9TKhOJmpX8As94T61ok0UqqEKPJ7RhfQHHYdCtsdwxgvfVr9qI" 144d4afb5ceSopenharmony_ci "xL_hDCcTho8opCVX-6QhJHl6SQFlTw13" 145d4afb5ceSopenharmony_ci "&client_id=" 146d4afb5ceSopenharmony_ci "amzn1.application-oa2-client.4823334c434b4190a2b5a42c07938a2d"; 147d4afb5ceSopenharmony_ci 148d4afb5ceSopenharmony_ci#if defined(LWS_WITH_SECURE_STREAMS_AUTH_SIGV4) 149d4afb5ceSopenharmony_cistatic char *aws_keyid = NULL, 150d4afb5ceSopenharmony_ci *aws_key = NULL; 151d4afb5ceSopenharmony_ci#endif 152d4afb5ceSopenharmony_ci 153d4afb5ceSopenharmony_cistatic int 154d4afb5ceSopenharmony_ciapp_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link, 155d4afb5ceSopenharmony_ci int current, int target) 156d4afb5ceSopenharmony_ci{ 157d4afb5ceSopenharmony_ci struct lws_context *context = lws_system_context_from_system_mgr(mgr); 158d4afb5ceSopenharmony_ci lws_system_blob_t *ab = lws_system_get_blob(context, 159d4afb5ceSopenharmony_ci LWS_SYSBLOB_TYPE_AUTH, 1 /* AUTH_IDX_ROOT */); 160d4afb5ceSopenharmony_ci size_t size; 161d4afb5ceSopenharmony_ci 162d4afb5ceSopenharmony_ci /* 163d4afb5ceSopenharmony_ci * For the things we care about, let's notice if we are trying to get 164d4afb5ceSopenharmony_ci * past them when we haven't solved them yet, and make the system 165d4afb5ceSopenharmony_ci * state wait while we trigger the dependent action. 166d4afb5ceSopenharmony_ci */ 167d4afb5ceSopenharmony_ci switch (target) { 168d4afb5ceSopenharmony_ci case LWS_SYSTATE_REGISTERED: 169d4afb5ceSopenharmony_ci size = lws_system_blob_get_size(ab); 170d4afb5ceSopenharmony_ci if (size) 171d4afb5ceSopenharmony_ci break; 172d4afb5ceSopenharmony_ci 173d4afb5ceSopenharmony_ci /* let's register our canned root token so auth can use it */ 174d4afb5ceSopenharmony_ci lws_system_blob_direct_set(ab, 175d4afb5ceSopenharmony_ci (const uint8_t *)canned_root_token_payload, 176d4afb5ceSopenharmony_ci strlen(canned_root_token_payload)); 177d4afb5ceSopenharmony_ci break; 178d4afb5ceSopenharmony_ci case LWS_SYSTATE_OPERATIONAL: 179d4afb5ceSopenharmony_ci if (current == LWS_SYSTATE_OPERATIONAL) { 180d4afb5ceSopenharmony_ci#if defined(LWS_WITH_SECURE_STREAMS_AUTH_SIGV4) 181d4afb5ceSopenharmony_ci 182d4afb5ceSopenharmony_ci if (lws_aws_filesystem_credentials_helper( 183d4afb5ceSopenharmony_ci "~/.aws/credentials", 184d4afb5ceSopenharmony_ci "aws_access_key_id", 185d4afb5ceSopenharmony_ci "aws_secret_access_key", 186d4afb5ceSopenharmony_ci &aws_keyid, &aws_key)) 187d4afb5ceSopenharmony_ci return -1; 188d4afb5ceSopenharmony_ci 189d4afb5ceSopenharmony_ci lws_ss_sigv4_set_aws_key(context, 0, aws_keyid, aws_key); 190d4afb5ceSopenharmony_ci#endif 191d4afb5ceSopenharmony_ci /* 192d4afb5ceSopenharmony_ci * At this point we have DHCP, ntp, system auth token 193d4afb5ceSopenharmony_ci * and we can reasonably create the proxy 194d4afb5ceSopenharmony_ci */ 195d4afb5ceSopenharmony_ci if (lws_ss_proxy_create(context, ibind, port)) { 196d4afb5ceSopenharmony_ci lwsl_err("%s: failed to create ss proxy\n", 197d4afb5ceSopenharmony_ci __func__); 198d4afb5ceSopenharmony_ci return -1; 199d4afb5ceSopenharmony_ci } 200d4afb5ceSopenharmony_ci } 201d4afb5ceSopenharmony_ci break; 202d4afb5ceSopenharmony_ci case LWS_SYSTATE_POLICY_INVALID: 203d4afb5ceSopenharmony_ci /* 204d4afb5ceSopenharmony_ci * This is a NOP since we used direct set... but in a real 205d4afb5ceSopenharmony_ci * system this could easily change to be done on the heap, then 206d4afb5ceSopenharmony_ci * this would be important 207d4afb5ceSopenharmony_ci */ 208d4afb5ceSopenharmony_ci lws_system_blob_destroy(lws_system_get_blob(context, 209d4afb5ceSopenharmony_ci LWS_SYSBLOB_TYPE_AUTH, 210d4afb5ceSopenharmony_ci 1 /* AUTH_IDX_ROOT */)); 211d4afb5ceSopenharmony_ci break; 212d4afb5ceSopenharmony_ci } 213d4afb5ceSopenharmony_ci 214d4afb5ceSopenharmony_ci return 0; 215d4afb5ceSopenharmony_ci} 216d4afb5ceSopenharmony_ci 217d4afb5ceSopenharmony_cistatic lws_state_notify_link_t * const app_notifier_list[] = { 218d4afb5ceSopenharmony_ci &nl, NULL 219d4afb5ceSopenharmony_ci}; 220d4afb5ceSopenharmony_ci 221d4afb5ceSopenharmony_ci#if defined(LWS_WITH_SYS_METRICS) 222d4afb5ceSopenharmony_ci 223d4afb5ceSopenharmony_cistatic int 224d4afb5ceSopenharmony_cimy_metric_report(lws_metric_pub_t *mp) 225d4afb5ceSopenharmony_ci{ 226d4afb5ceSopenharmony_ci lws_metric_bucket_t *sub = mp->u.hist.head; 227d4afb5ceSopenharmony_ci char buf[192]; 228d4afb5ceSopenharmony_ci 229d4afb5ceSopenharmony_ci do { 230d4afb5ceSopenharmony_ci if (lws_metrics_format(mp, &sub, buf, sizeof(buf))) 231d4afb5ceSopenharmony_ci lwsl_user("%s: %s\n", __func__, buf); 232d4afb5ceSopenharmony_ci } while ((mp->flags & LWSMTFL_REPORT_HIST) && sub); 233d4afb5ceSopenharmony_ci 234d4afb5ceSopenharmony_ci /* 0 = leave metric to accumulate, 1 = reset the metric */ 235d4afb5ceSopenharmony_ci 236d4afb5ceSopenharmony_ci return 1; 237d4afb5ceSopenharmony_ci} 238d4afb5ceSopenharmony_ci 239d4afb5ceSopenharmony_cistatic const lws_system_ops_t system_ops = { 240d4afb5ceSopenharmony_ci .metric_report = my_metric_report, 241d4afb5ceSopenharmony_ci}; 242d4afb5ceSopenharmony_ci 243d4afb5ceSopenharmony_ci#endif 244d4afb5ceSopenharmony_ci 245d4afb5ceSopenharmony_cistatic void 246d4afb5ceSopenharmony_cisigint_handler(int sig) 247d4afb5ceSopenharmony_ci{ 248d4afb5ceSopenharmony_ci lwsl_notice("%s\n", __func__); 249d4afb5ceSopenharmony_ci interrupted = 1; 250d4afb5ceSopenharmony_ci lws_cancel_service(context); 251d4afb5ceSopenharmony_ci} 252d4afb5ceSopenharmony_ci 253d4afb5ceSopenharmony_ciint main(int argc, const char **argv) 254d4afb5ceSopenharmony_ci{ 255d4afb5ceSopenharmony_ci struct lws_context_creation_info info; 256d4afb5ceSopenharmony_ci const char *p; 257d4afb5ceSopenharmony_ci int n = 0; 258d4afb5ceSopenharmony_ci 259d4afb5ceSopenharmony_ci memset(&info, 0, sizeof info); 260d4afb5ceSopenharmony_ci lws_cmdline_option_handle_builtin(argc, argv, &info); 261d4afb5ceSopenharmony_ci 262d4afb5ceSopenharmony_ci signal(SIGINT, sigint_handler); 263d4afb5ceSopenharmony_ci 264d4afb5ceSopenharmony_ci /* connect to ssproxy via UDS by default, else via tcp with this port */ 265d4afb5ceSopenharmony_ci if ((p = lws_cmdline_option(argc, argv, "-p"))) 266d4afb5ceSopenharmony_ci port = atoi(p); 267d4afb5ceSopenharmony_ci 268d4afb5ceSopenharmony_ci /* UDS "proxy.ss.lws" in abstract namespace, else this socket path; 269d4afb5ceSopenharmony_ci * when -p given this can specify the network interface to bind to */ 270d4afb5ceSopenharmony_ci if ((p = lws_cmdline_option(argc, argv, "-i"))) 271d4afb5ceSopenharmony_ci ibind = p; 272d4afb5ceSopenharmony_ci 273d4afb5ceSopenharmony_ci lwsl_user("LWS secure streams Proxy [-d<verb>]\n"); 274d4afb5ceSopenharmony_ci 275d4afb5ceSopenharmony_ci info.options = LWS_SERVER_OPTION_EXPLICIT_VHOSTS | 276d4afb5ceSopenharmony_ci LWS_SERVER_OPTION_H2_JUST_FIX_WINDOW_UPDATE_OVERFLOW | 277d4afb5ceSopenharmony_ci LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; 278d4afb5ceSopenharmony_ci info.fd_limit_per_thread = 1 + 26 + 1; 279d4afb5ceSopenharmony_ci info.pss_policies_json = default_ss_policy; 280d4afb5ceSopenharmony_ci info.port = CONTEXT_PORT_NO_LISTEN; 281d4afb5ceSopenharmony_ci 282d4afb5ceSopenharmony_ci /* integrate us with lws system state management when context created */ 283d4afb5ceSopenharmony_ci nl.name = "app"; 284d4afb5ceSopenharmony_ci nl.notify_cb = app_system_state_nf; 285d4afb5ceSopenharmony_ci info.register_notifier_list = app_notifier_list; 286d4afb5ceSopenharmony_ci 287d4afb5ceSopenharmony_ci info.pt_serv_buf_size = (unsigned int)((6144 * 2) + 2048); 288d4afb5ceSopenharmony_ci info.max_http_header_data = (unsigned short)(6144 + 2048); 289d4afb5ceSopenharmony_ci 290d4afb5ceSopenharmony_ci#if defined(LWS_WITH_SYS_METRICS) 291d4afb5ceSopenharmony_ci info.system_ops = &system_ops; 292d4afb5ceSopenharmony_ci info.metrics_prefix = "ssproxy"; 293d4afb5ceSopenharmony_ci#endif 294d4afb5ceSopenharmony_ci 295d4afb5ceSopenharmony_ci context = lws_create_context(&info); 296d4afb5ceSopenharmony_ci if (!context) { 297d4afb5ceSopenharmony_ci lwsl_err("lws init failed\n"); 298d4afb5ceSopenharmony_ci return 1; 299d4afb5ceSopenharmony_ci } 300d4afb5ceSopenharmony_ci 301d4afb5ceSopenharmony_ci /* the event loop */ 302d4afb5ceSopenharmony_ci 303d4afb5ceSopenharmony_ci do { 304d4afb5ceSopenharmony_ci n = lws_service(context, 0); 305d4afb5ceSopenharmony_ci } while (n >= 0 && !interrupted); 306d4afb5ceSopenharmony_ci 307d4afb5ceSopenharmony_ci bad = 0; 308d4afb5ceSopenharmony_ci 309d4afb5ceSopenharmony_ci#if defined(LWS_WITH_SECURE_STREAMS_AUTH_SIGV4) 310d4afb5ceSopenharmony_ci if (aws_keyid) 311d4afb5ceSopenharmony_ci free(aws_keyid); 312d4afb5ceSopenharmony_ci if (aws_key) 313d4afb5ceSopenharmony_ci free(aws_key); 314d4afb5ceSopenharmony_ci#endif 315d4afb5ceSopenharmony_ci 316d4afb5ceSopenharmony_ci lws_context_destroy(context); 317d4afb5ceSopenharmony_ci lwsl_user("Completed: %s\n", bad ? "failed" : "OK"); 318d4afb5ceSopenharmony_ci 319d4afb5ceSopenharmony_ci return bad; 320d4afb5ceSopenharmony_ci} 321