1d4afb5ceSopenharmony_ci/* 2d4afb5ceSopenharmony_ci * S3 Put Object via Secure Streams minimal sigv4 example 3d4afb5ceSopenharmony_ci * 4d4afb5ceSopenharmony_ci * Written in 2010-2021 by Andy Green <andy@warmcat.com> 5d4afb5ceSopenharmony_ci * Amit Pachore <apachor@amazon.com> 6d4afb5ceSopenharmony_ci * securestreams-dev@amazon.com 7d4afb5ceSopenharmony_ci * 8d4afb5ceSopenharmony_ci * This file is made available under the Creative Commons CC0 1.0 9d4afb5ceSopenharmony_ci * Universal Public Domain Dedication. 10d4afb5ceSopenharmony_ci */ 11d4afb5ceSopenharmony_ci 12d4afb5ceSopenharmony_ci#include <libwebsockets.h> 13d4afb5ceSopenharmony_ci#include <stdio.h> 14d4afb5ceSopenharmony_ci#include <string.h> 15d4afb5ceSopenharmony_ci#include <signal.h> 16d4afb5ceSopenharmony_ci 17d4afb5ceSopenharmony_ci#include "ss-s3-put.h" 18d4afb5ceSopenharmony_ci#if defined(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY) 19d4afb5ceSopenharmony_ci#include "static_policy.h" 20d4afb5ceSopenharmony_ci#endif 21d4afb5ceSopenharmony_ci 22d4afb5ceSopenharmony_ciint interrupted, bad = 1; 23d4afb5ceSopenharmony_cistatic lws_state_notify_link_t nl; 24d4afb5ceSopenharmony_ciextern const lws_ss_info_t s3_ssi; 25d4afb5ceSopenharmony_ci 26d4afb5ceSopenharmony_ci#if !defined(LWS_SS_USE_SSPC) 27d4afb5ceSopenharmony_ci 28d4afb5ceSopenharmony_ci#if !defined(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY) 29d4afb5ceSopenharmony_cistatic const char * const default_ss_policy = 30d4afb5ceSopenharmony_ci "{" 31d4afb5ceSopenharmony_ci "\"release\":" "\"01234567\"," 32d4afb5ceSopenharmony_ci "\"product\":" "\"myproduct\"," 33d4afb5ceSopenharmony_ci "\"schema-version\":" "1," 34d4afb5ceSopenharmony_ci 35d4afb5ceSopenharmony_ci "\"retry\": [" /* named backoff / retry strategies */ 36d4afb5ceSopenharmony_ci "{\"default\": {" 37d4afb5ceSopenharmony_ci "\"backoff\": [" "100," 38d4afb5ceSopenharmony_ci "200," 39d4afb5ceSopenharmony_ci "300," 40d4afb5ceSopenharmony_ci "500," 41d4afb5ceSopenharmony_ci "1000" 42d4afb5ceSopenharmony_ci "]," 43d4afb5ceSopenharmony_ci "\"conceal\":" "5," 44d4afb5ceSopenharmony_ci "\"jitterpc\":" "20," 45d4afb5ceSopenharmony_ci "\"svalidping\":" "30," 46d4afb5ceSopenharmony_ci "\"svalidhup\":" "35" 47d4afb5ceSopenharmony_ci "}}" 48d4afb5ceSopenharmony_ci "]," 49d4afb5ceSopenharmony_ci "\"certs\": [" /* named individual certificates in BASE64 DER */ 50d4afb5ceSopenharmony_ci "{\"amazon_root_ca_1\": \"" 51d4afb5ceSopenharmony_ci "MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFA" 52d4afb5ceSopenharmony_ci "DA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b2" 53d4afb5ceSopenharmony_ci "4gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAk" 54d4afb5ceSopenharmony_ci "GA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg" 55d4afb5ceSopenharmony_ci "Q0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXjca9Hg" 56d4afb5ceSopenharmony_ci "FB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM9O6II8" 57d4afb5ceSopenharmony_ci "c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHr" 58d4afb5ceSopenharmony_ci "QgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5" 59d4afb5ceSopenharmony_ci "SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6" 60d4afb5ceSopenharmony_ci "pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg" 61d4afb5ceSopenharmony_ci "0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0" 62d4afb5ceSopenharmony_ci "OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUAA4IBAQCY8jda" 63d4afb5ceSopenharmony_ci "QZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PMCCjjmCXPI" 64d4afb5ceSopenharmony_ci "6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbv" 65d4afb5ceSopenharmony_ci "Xy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtP" 66d4afb5ceSopenharmony_ci "HRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJi" 67d4afb5ceSopenharmony_ci "oaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5W" 68d4afb5ceSopenharmony_ci "TP468SQvvG5" 69d4afb5ceSopenharmony_ci "\"}," 70d4afb5ceSopenharmony_ci "{\"starfield_services_root_ca\": \"" 71d4afb5ceSopenharmony_ci "MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx" 72d4afb5ceSopenharmony_ci "EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT" 73d4afb5ceSopenharmony_ci "HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs" 74d4afb5ceSopenharmony_ci "ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5" 75d4afb5ceSopenharmony_ci "MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD" 76d4afb5ceSopenharmony_ci "VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy" 77d4afb5ceSopenharmony_ci "ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy" 78d4afb5ceSopenharmony_ci "dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI" 79d4afb5ceSopenharmony_ci "hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p" 80d4afb5ceSopenharmony_ci "OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2" 81d4afb5ceSopenharmony_ci "8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K" 82d4afb5ceSopenharmony_ci "Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe" 83d4afb5ceSopenharmony_ci "hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk" 84d4afb5ceSopenharmony_ci "6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw" 85d4afb5ceSopenharmony_ci "DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q" 86d4afb5ceSopenharmony_ci "AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI" 87d4afb5ceSopenharmony_ci "bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB" 88d4afb5ceSopenharmony_ci "ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z" 89d4afb5ceSopenharmony_ci "qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd" 90d4afb5ceSopenharmony_ci "iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn" 91d4afb5ceSopenharmony_ci "0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN" 92d4afb5ceSopenharmony_ci "sSi6" 93d4afb5ceSopenharmony_ci "\"}," 94d4afb5ceSopenharmony_ci "{\"baltimore_cybertrust_root\": \"" /* LE X3 signed by ISRG X1 root */ 95d4afb5ceSopenharmony_ci "MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ" 96d4afb5ceSopenharmony_ci "RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD" 97d4afb5ceSopenharmony_ci "VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX" 98d4afb5ceSopenharmony_ci "DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y" 99d4afb5ceSopenharmony_ci "ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy" 100d4afb5ceSopenharmony_ci "VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr" 101d4afb5ceSopenharmony_ci "mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr" 102d4afb5ceSopenharmony_ci "IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK" 103d4afb5ceSopenharmony_ci "mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu" 104d4afb5ceSopenharmony_ci "XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy" 105d4afb5ceSopenharmony_ci "dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye" 106d4afb5ceSopenharmony_ci "jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1" 107d4afb5ceSopenharmony_ci "BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3" 108d4afb5ceSopenharmony_ci "DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92" 109d4afb5ceSopenharmony_ci "9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx" 110d4afb5ceSopenharmony_ci "jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0" 111d4afb5ceSopenharmony_ci "Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz" 112d4afb5ceSopenharmony_ci "ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS" 113d4afb5ceSopenharmony_ci "R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp" 114d4afb5ceSopenharmony_ci "\"}" 115d4afb5ceSopenharmony_ci "]," 116d4afb5ceSopenharmony_ci "\"trust_stores\": [" /* named cert chains */ 117d4afb5ceSopenharmony_ci "{" 118d4afb5ceSopenharmony_ci "\"name\": \"s3-root-cert\"," 119d4afb5ceSopenharmony_ci "\"stack\": [" 120d4afb5ceSopenharmony_ci "\"baltimore_cybertrust_root\"," 121d4afb5ceSopenharmony_ci "\"amazon_root_ca_1\"," 122d4afb5ceSopenharmony_ci "\"starfield_services_root_ca\"" 123d4afb5ceSopenharmony_ci "]" 124d4afb5ceSopenharmony_ci "}" 125d4afb5ceSopenharmony_ci "]," 126d4afb5ceSopenharmony_ci "\"auth\": [" /* named cert chains */ 127d4afb5ceSopenharmony_ci "{" 128d4afb5ceSopenharmony_ci "\"name\": \"sigv4_br\"," 129d4afb5ceSopenharmony_ci "\"type\": \"sigv4\"," 130d4afb5ceSopenharmony_ci "\"blob\": 0" 131d4afb5ceSopenharmony_ci "}" 132d4afb5ceSopenharmony_ci 133d4afb5ceSopenharmony_ci "]," 134d4afb5ceSopenharmony_ci "\"s\": [" 135d4afb5ceSopenharmony_ci "{\"s3PutObj\": {" 136d4afb5ceSopenharmony_ci "\"endpoint\":" "\"${s3bucket}.s3.amazonaws.com\"," 137d4afb5ceSopenharmony_ci "\"port\":" "443," 138d4afb5ceSopenharmony_ci "\"protocol\":" "\"h1\"," 139d4afb5ceSopenharmony_ci "\"http_method\":" "\"PUT\"," 140d4afb5ceSopenharmony_ci "\"http_url\":" "\"${s3Obj}\"," 141d4afb5ceSopenharmony_ci "\"http_no_content_length\": false," 142d4afb5ceSopenharmony_ci "\"tls\":" "true," 143d4afb5ceSopenharmony_ci "\"tls_trust_store\":" "\"s3-root-cert\"," 144d4afb5ceSopenharmony_ci "\"opportunistic\":" "true," 145d4afb5ceSopenharmony_ci "\"retry\":" "\"default\"," 146d4afb5ceSopenharmony_ci "\"use_auth\":" "\"sigv4_br\"," 147d4afb5ceSopenharmony_ci "\"aws_region\":" "\"region\"," 148d4afb5ceSopenharmony_ci "\"aws_service\":" "\"service\"," 149d4afb5ceSopenharmony_ci "\"metadata\": [" 150d4afb5ceSopenharmony_ci "{\"region\": \"\"}," 151d4afb5ceSopenharmony_ci "{\"service\": \"\"}," 152d4afb5ceSopenharmony_ci "{\"s3bucket\": \"\"}," 153d4afb5ceSopenharmony_ci "{\"s3Obj\": \"\"}," 154d4afb5ceSopenharmony_ci "{\"ctype\": \"content-type:\"}," 155d4afb5ceSopenharmony_ci "{\"xcsha256\": \"x-amz-content-sha256:\"}," 156d4afb5ceSopenharmony_ci "{\"xdate\": \"x-amz-date:\"}," 157d4afb5ceSopenharmony_ci "{\"xacl\": \"x-amz-acl:\"}" 158d4afb5ceSopenharmony_ci "]" 159d4afb5ceSopenharmony_ci "}}" 160d4afb5ceSopenharmony_ci "]" 161d4afb5ceSopenharmony_ci "}" 162d4afb5ceSopenharmony_ci; 163d4afb5ceSopenharmony_ci#endif 164d4afb5ceSopenharmony_ci 165d4afb5ceSopenharmony_cistatic char *aws_keyid, *aws_key; 166d4afb5ceSopenharmony_ci#endif 167d4afb5ceSopenharmony_ci 168d4afb5ceSopenharmony_cistatic int 169d4afb5ceSopenharmony_ciapp_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link, 170d4afb5ceSopenharmony_ci int current, int target) 171d4afb5ceSopenharmony_ci{ 172d4afb5ceSopenharmony_ci struct lws_context *context = lws_system_context_from_system_mgr(mgr); 173d4afb5ceSopenharmony_ci struct lws_ss_handle *h; 174d4afb5ceSopenharmony_ci 175d4afb5ceSopenharmony_ci switch (target) { 176d4afb5ceSopenharmony_ci case LWS_SYSTATE_REGISTERED: 177d4afb5ceSopenharmony_ci break; 178d4afb5ceSopenharmony_ci 179d4afb5ceSopenharmony_ci case LWS_SYSTATE_OPERATIONAL: 180d4afb5ceSopenharmony_ci if (current != LWS_SYSTATE_OPERATIONAL) 181d4afb5ceSopenharmony_ci break; 182d4afb5ceSopenharmony_ci 183d4afb5ceSopenharmony_ci#if !defined(LWS_SS_USE_SSPC) 184d4afb5ceSopenharmony_ci if (lws_aws_filesystem_credentials_helper( 185d4afb5ceSopenharmony_ci "~/.aws/credentials", 186d4afb5ceSopenharmony_ci "aws_access_key_id", 187d4afb5ceSopenharmony_ci "aws_secret_access_key", 188d4afb5ceSopenharmony_ci &aws_keyid, &aws_key)) 189d4afb5ceSopenharmony_ci return -1; 190d4afb5ceSopenharmony_ci lws_ss_sigv4_set_aws_key(context, 0, aws_keyid, aws_key); 191d4afb5ceSopenharmony_ci#endif 192d4afb5ceSopenharmony_ci 193d4afb5ceSopenharmony_ci if (lws_ss_create(context, 0, &s3_ssi, NULL, &h, 194d4afb5ceSopenharmony_ci NULL, NULL)) { 195d4afb5ceSopenharmony_ci lwsl_err("%s: failed to create secure stream\n", 196d4afb5ceSopenharmony_ci __func__); 197d4afb5ceSopenharmony_ci 198d4afb5ceSopenharmony_ci return -1; 199d4afb5ceSopenharmony_ci } 200d4afb5ceSopenharmony_ci break; 201d4afb5ceSopenharmony_ci } 202d4afb5ceSopenharmony_ci 203d4afb5ceSopenharmony_ci return 0; 204d4afb5ceSopenharmony_ci} 205d4afb5ceSopenharmony_ci 206d4afb5ceSopenharmony_cistatic lws_state_notify_link_t * const app_notifier_list[] = { 207d4afb5ceSopenharmony_ci &nl, NULL 208d4afb5ceSopenharmony_ci}; 209d4afb5ceSopenharmony_ci 210d4afb5ceSopenharmony_cistatic void 211d4afb5ceSopenharmony_cisigint_handler(int sig) 212d4afb5ceSopenharmony_ci{ 213d4afb5ceSopenharmony_ci interrupted = 1; 214d4afb5ceSopenharmony_ci} 215d4afb5ceSopenharmony_ci 216d4afb5ceSopenharmony_ciint main(int argc, const char **argv) 217d4afb5ceSopenharmony_ci{ 218d4afb5ceSopenharmony_ci int logs = LLL_USER | LLL_ERR | LLL_WARN /* | LLL_NOTICE */ ; 219d4afb5ceSopenharmony_ci struct lws_context_creation_info info; 220d4afb5ceSopenharmony_ci struct lws_context *context; 221d4afb5ceSopenharmony_ci int n = 0; 222d4afb5ceSopenharmony_ci 223d4afb5ceSopenharmony_ci signal(SIGINT, sigint_handler); 224d4afb5ceSopenharmony_ci lws_set_log_level(logs, NULL); 225d4afb5ceSopenharmony_ci 226d4afb5ceSopenharmony_ci memset(&info, 0, sizeof info); 227d4afb5ceSopenharmony_ci lws_cmdline_option_handle_builtin(argc, argv, &info); 228d4afb5ceSopenharmony_ci 229d4afb5ceSopenharmony_ci lwsl_user("LWS minimal secure streams sigv4 \n"); 230d4afb5ceSopenharmony_ci 231d4afb5ceSopenharmony_ci info.fd_limit_per_thread = 1 + 6 + 1; 232d4afb5ceSopenharmony_ci info.port = CONTEXT_PORT_NO_LISTEN; 233d4afb5ceSopenharmony_ci 234d4afb5ceSopenharmony_ci#if defined(LWS_SS_USE_SSPC) 235d4afb5ceSopenharmony_ci info.protocols = lws_sspc_protocols; 236d4afb5ceSopenharmony_ci { 237d4afb5ceSopenharmony_ci const char *p; 238d4afb5ceSopenharmony_ci 239d4afb5ceSopenharmony_ci /* connect to ssproxy via UDS by default, else via 240d4afb5ceSopenharmony_ci * tcp connection to this port */ 241d4afb5ceSopenharmony_ci if ((p = lws_cmdline_option(argc, argv, "-p"))) 242d4afb5ceSopenharmony_ci info.ss_proxy_port = (uint16_t)atoi(p); 243d4afb5ceSopenharmony_ci 244d4afb5ceSopenharmony_ci /* UDS "proxy.ss.lws" in abstract namespace, else this socket 245d4afb5ceSopenharmony_ci * path; when -p given this can specify the network interface 246d4afb5ceSopenharmony_ci * to bind to */ 247d4afb5ceSopenharmony_ci if ((p = lws_cmdline_option(argc, argv, "-i"))) 248d4afb5ceSopenharmony_ci info.ss_proxy_bind = p; 249d4afb5ceSopenharmony_ci 250d4afb5ceSopenharmony_ci /* if -p given, -a specifies the proxy address to connect to */ 251d4afb5ceSopenharmony_ci if ((p = lws_cmdline_option(argc, argv, "-a"))) 252d4afb5ceSopenharmony_ci info.ss_proxy_address = p; 253d4afb5ceSopenharmony_ci } 254d4afb5ceSopenharmony_ci#else 255d4afb5ceSopenharmony_ci#if defined(LWS_WITH_SECURE_STREAMS_STATIC_POLICY_ONLY) 256d4afb5ceSopenharmony_ci info.pss_policies = &_ss_static_policy_entry; 257d4afb5ceSopenharmony_ci#else 258d4afb5ceSopenharmony_ci info.pss_policies_json = default_ss_policy; 259d4afb5ceSopenharmony_ci#endif 260d4afb5ceSopenharmony_ci 261d4afb5ceSopenharmony_ci info.options = LWS_SERVER_OPTION_EXPLICIT_VHOSTS | 262d4afb5ceSopenharmony_ci LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; 263d4afb5ceSopenharmony_ci#endif 264d4afb5ceSopenharmony_ci 265d4afb5ceSopenharmony_ci /* integrate us with lws system state management when context created */ 266d4afb5ceSopenharmony_ci 267d4afb5ceSopenharmony_ci nl.name = "app"; 268d4afb5ceSopenharmony_ci nl.notify_cb = app_system_state_nf; 269d4afb5ceSopenharmony_ci info.register_notifier_list = app_notifier_list; 270d4afb5ceSopenharmony_ci 271d4afb5ceSopenharmony_ci /* create the context */ 272d4afb5ceSopenharmony_ci 273d4afb5ceSopenharmony_ci context = lws_create_context(&info); 274d4afb5ceSopenharmony_ci if (!context) { 275d4afb5ceSopenharmony_ci lwsl_err("lws init failed\n"); 276d4afb5ceSopenharmony_ci return 1; 277d4afb5ceSopenharmony_ci } 278d4afb5ceSopenharmony_ci 279d4afb5ceSopenharmony_ci lws_system_blob_heap_append(lws_system_get_blob(context, 280d4afb5ceSopenharmony_ci LWS_SYSBLOB_TYPE_DEVICE_TYPE, 0), 281d4afb5ceSopenharmony_ci (const uint8_t *)"beerfountain", 12); 282d4afb5ceSopenharmony_ci 283d4afb5ceSopenharmony_ci /* the event loop */ 284d4afb5ceSopenharmony_ci 285d4afb5ceSopenharmony_ci while (n >= 0 && !interrupted) 286d4afb5ceSopenharmony_ci n = lws_service(context, 0); 287d4afb5ceSopenharmony_ci 288d4afb5ceSopenharmony_ci lws_context_destroy(context); 289d4afb5ceSopenharmony_ci 290d4afb5ceSopenharmony_ci#if !defined(LWS_SS_USE_SSPC) 291d4afb5ceSopenharmony_ci if (aws_key) 292d4afb5ceSopenharmony_ci free(aws_key); 293d4afb5ceSopenharmony_ci if (aws_keyid) 294d4afb5ceSopenharmony_ci free(aws_keyid); 295d4afb5ceSopenharmony_ci#endif 296d4afb5ceSopenharmony_ci 297d4afb5ceSopenharmony_ci lwsl_user("Completed: %s\n", bad ? "failed" : "OK"); 298d4afb5ceSopenharmony_ci 299d4afb5ceSopenharmony_ci return bad; 300d4afb5ceSopenharmony_ci} 301