1d4afb5ceSopenharmony_ci/* 2d4afb5ceSopenharmony_ci * lws-minimal-secure-streams 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 demonstrates various kinds of successful and failed connection 11d4afb5ceSopenharmony_ci * situations in order to confirm the correct states are coming. 12d4afb5ceSopenharmony_ci * 13d4afb5ceSopenharmony_ci * You can control how much bulk data is requested from the peer using 14d4afb5ceSopenharmony_ci * --amount xxx, the default without that is 12345 bytes. 15d4afb5ceSopenharmony_ci */ 16d4afb5ceSopenharmony_ci 17d4afb5ceSopenharmony_ci#include <libwebsockets.h> 18d4afb5ceSopenharmony_ci#include <string.h> 19d4afb5ceSopenharmony_ci#include <signal.h> 20d4afb5ceSopenharmony_ci 21d4afb5ceSopenharmony_cistatic int interrupted, tests, tests_pass, tests_fail; 22d4afb5ceSopenharmony_cistatic lws_sorted_usec_list_t sul_next_test; 23d4afb5ceSopenharmony_cistatic lws_state_notify_link_t nl; 24d4afb5ceSopenharmony_cistruct lws_context *context; 25d4afb5ceSopenharmony_cisize_t amount = 12345; 26d4afb5ceSopenharmony_ci 27d4afb5ceSopenharmony_cistatic void 28d4afb5ceSopenharmony_citests_start_next(lws_sorted_usec_list_t *sul); 29d4afb5ceSopenharmony_ci 30d4afb5ceSopenharmony_ci/* 31d4afb5ceSopenharmony_ci * If the -proxy app is fulfilling our connection, then we don't need to have 32d4afb5ceSopenharmony_ci * the policy in the client. 33d4afb5ceSopenharmony_ci * 34d4afb5ceSopenharmony_ci * When we build with LWS_SS_USE_SSPC, the apis hook up to a proxy process over 35d4afb5ceSopenharmony_ci * a Unix Domain Socket. To test that, you need to separately run the 36d4afb5ceSopenharmony_ci * ./lws-minimal-secure-streams-proxy test app on the same machine. 37d4afb5ceSopenharmony_ci */ 38d4afb5ceSopenharmony_ci 39d4afb5ceSopenharmony_ci#if !defined(LWS_SS_USE_SSPC) 40d4afb5ceSopenharmony_cistatic const char * const default_ss_policy = 41d4afb5ceSopenharmony_ci "{" 42d4afb5ceSopenharmony_ci "\"release\":" "\"01234567\"," 43d4afb5ceSopenharmony_ci "\"product\":" "\"myproduct\"," 44d4afb5ceSopenharmony_ci "\"schema-version\":" "1," 45d4afb5ceSopenharmony_ci#if defined(VIA_LOCALHOST_SOCKS) 46d4afb5ceSopenharmony_ci "\"via-socks5\":" "\"127.0.0.1:1080\"," 47d4afb5ceSopenharmony_ci#endif 48d4afb5ceSopenharmony_ci 49d4afb5ceSopenharmony_ci "\"retry\": [" /* named backoff / retry strategies */ 50d4afb5ceSopenharmony_ci "{\"default\": {" 51d4afb5ceSopenharmony_ci "\"backoff\": [ 1000, 1000, 1000, 1000" 52d4afb5ceSopenharmony_ci "]," 53d4afb5ceSopenharmony_ci "\"conceal\":" "4," 54d4afb5ceSopenharmony_ci "\"jitterpc\":" "20," 55d4afb5ceSopenharmony_ci "\"svalidping\":" "30," 56d4afb5ceSopenharmony_ci "\"svalidhup\":" "35" 57d4afb5ceSopenharmony_ci "}}" 58d4afb5ceSopenharmony_ci "]," 59d4afb5ceSopenharmony_ci "\"certs\": [" /* named individual certificates in BASE64 DER */ 60d4afb5ceSopenharmony_ci /* 61d4afb5ceSopenharmony_ci * Let's Encrypt certs for warmcat.com / libwebsockets.org 62d4afb5ceSopenharmony_ci * 63d4afb5ceSopenharmony_ci * We fetch the real policy from there using SS and switch to 64d4afb5ceSopenharmony_ci * using that. 65d4afb5ceSopenharmony_ci */ 66d4afb5ceSopenharmony_ci "{\"isrg_root_x1\": \"" 67d4afb5ceSopenharmony_ci "MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw" 68d4afb5ceSopenharmony_ci "TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh" 69d4afb5ceSopenharmony_ci "cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4" 70d4afb5ceSopenharmony_ci "WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu" 71d4afb5ceSopenharmony_ci "ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY" 72d4afb5ceSopenharmony_ci "MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc" 73d4afb5ceSopenharmony_ci "h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+" 74d4afb5ceSopenharmony_ci "0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U" 75d4afb5ceSopenharmony_ci "A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW" 76d4afb5ceSopenharmony_ci "T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH" 77d4afb5ceSopenharmony_ci "B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC" 78d4afb5ceSopenharmony_ci "B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv" 79d4afb5ceSopenharmony_ci "KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn" 80d4afb5ceSopenharmony_ci "OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn" 81d4afb5ceSopenharmony_ci "jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw" 82d4afb5ceSopenharmony_ci "qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI" 83d4afb5ceSopenharmony_ci "rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV" 84d4afb5ceSopenharmony_ci "HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq" 85d4afb5ceSopenharmony_ci "hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL" 86d4afb5ceSopenharmony_ci "ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ" 87d4afb5ceSopenharmony_ci "3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK" 88d4afb5ceSopenharmony_ci "NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5" 89d4afb5ceSopenharmony_ci "ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur" 90d4afb5ceSopenharmony_ci "TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC" 91d4afb5ceSopenharmony_ci "jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc" 92d4afb5ceSopenharmony_ci "oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq" 93d4afb5ceSopenharmony_ci "4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA" 94d4afb5ceSopenharmony_ci "mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d" 95d4afb5ceSopenharmony_ci "emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=" 96d4afb5ceSopenharmony_ci "\"},{" 97d4afb5ceSopenharmony_ci "\"digicert_global_root_g2\": \"MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7K" 98d4afb5ceSopenharmony_ci "GSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMR" 99d4afb5ceSopenharmony_ci "GlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDE" 100d4afb5ceSopenharmony_ci "xdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxM" 101d4afb5ceSopenharmony_ci "TUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxG" 102d4afb5ceSopenharmony_ci "TAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb" 103d4afb5ceSopenharmony_ci "2JhbCBSb290IEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNN" 104d4afb5ceSopenharmony_ci "Nx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpim" 105d4afb5ceSopenharmony_ci "n7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kq" 106d4afb5ceSopenharmony_ci "bitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauVB" 107d4afb5ceSopenharmony_ci "JVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdz" 108d4afb5ceSopenharmony_ci "XOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FD" 109d4afb5ceSopenharmony_ci "KZJobq7nMWxM4MphQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/" 110d4afb5ceSopenharmony_ci "wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNA" 111d4afb5ceSopenharmony_ci "QELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQ" 112d4afb5ceSopenharmony_ci "oQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98" 113d4afb5ceSopenharmony_ci "kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8" 114d4afb5ceSopenharmony_ci "PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgR" 115d4afb5ceSopenharmony_ci "PTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3f" 116d4afb5ceSopenharmony_ci "e0Dkhvld1927jyNxF1WW6LZZm6zNTflMrY=\"" 117d4afb5ceSopenharmony_ci "}, {" 118d4afb5ceSopenharmony_ci "\"digicert_global_ca_g2\": \"MIIEizCCA3OgAwIBAgIQDI7gyQ1" 119d4afb5ceSopenharmony_ci "qiRWIBAYe4kH5rzANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJVUzEVMBMGA1U" 120d4afb5ceSopenharmony_ci "EChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgY" 121d4afb5ceSopenharmony_ci "DVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0" 122d4afb5ceSopenharmony_ci "yODA4MDExMjAwMDBaMEQxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCB" 123d4afb5ceSopenharmony_ci "JbmMxHjAcBgNVBAMTFURpZ2lDZXJ0IEdsb2JhbCBDQSBHMjCCASIwDQYJKoZIhvc" 124d4afb5ceSopenharmony_ci "NAQEBBQADggEPADCCAQoCggEBANNIfL7zBYZdW9UvhU5L4IatFaxhz1uvPmoKR/u" 125d4afb5ceSopenharmony_ci "adpFgC4przc/cV35gmAvkVNlW7SHMArZagV+Xau4CLyMnuG3UsOcGAngLH1ypmTb" 126d4afb5ceSopenharmony_ci "+u6wbBfpXzYEQQGfWMItYNdSWYb7QjHqXnxr5IuYUL6nG6AEfq/gmD6yOTSwyOR2" 127d4afb5ceSopenharmony_ci "Bm40cZbIc22GoiS9g5+vCShjEbyrpEJIJ7RfRACvmfe8EiRROM6GyD5eHn7OgzS+" 128d4afb5ceSopenharmony_ci "8LOy4g2gxPR/VSpAQGQuBldYpdlH5NnbQtwl6OErXb4y/E3w57bqukPyV93t4CTZ" 129d4afb5ceSopenharmony_ci "edJMeJfD/1K2uaGvG/w/VNfFVbkhJ+Pi474j48V4Rd6rfArMCAwEAAaOCAVowggF" 130d4afb5ceSopenharmony_ci "WMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMDQGCCsGAQUFBwE" 131d4afb5ceSopenharmony_ci "BBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMHsGA1U" 132d4afb5ceSopenharmony_ci "dHwR0MHIwN6A1oDOGMWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEd" 133d4afb5ceSopenharmony_ci "sb2JhbFJvb3RHMi5jcmwwN6A1oDOGMWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9" 134d4afb5ceSopenharmony_ci "EaWdpQ2VydEdsb2JhbFJvb3RHMi5jcmwwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAY" 135d4afb5ceSopenharmony_ci "IKwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwHQYDVR0OBBY" 136d4afb5ceSopenharmony_ci "EFCRuKy3QapJRUSVpAaqaR6aJ50AgMB8GA1UdIwQYMBaAFE4iVCAYlebjbuYP+vq" 137d4afb5ceSopenharmony_ci "5Eu0GF485MA0GCSqGSIb3DQEBCwUAA4IBAQALOYSR+ZfrqoGvhOlaOJL84mxZvzb" 138d4afb5ceSopenharmony_ci "IRacxAxHhBsCsMsdaVSnaT0AC9aHesO3ewPj2dZ12uYf+QYB6z13jAMZbAuabeGL" 139d4afb5ceSopenharmony_ci "J3LhimnftiQjXS8X9Q9ViIyfEBFltcT8jW+rZ8uckJ2/0lYDblizkVIvP6hnZf1W" 140d4afb5ceSopenharmony_ci "ZUXoOLRg9eFhSvGNoVwvdRLNXSmDmyHBwW4coatc7TlJFGa8kBpJIERqLrqwYEle" 141d4afb5ceSopenharmony_ci "sA8u49L3KJg6nwd3jM+/AVTANlVlOnAM2BvjAjxSZnE0qnsHhfTuvcqdFuhOWKU4" 142d4afb5ceSopenharmony_ci "Z0BqYBvQ3lBetoxi6PrABDJXWKTUgNX31EGDk92hiHuwZ4STyhxGs6QiA\"" 143d4afb5ceSopenharmony_ci "}," 144d4afb5ceSopenharmony_ci "{\"amazon_root_ca_1\": \"MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikP" 145d4afb5ceSopenharmony_ci "mljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1" 146d4afb5ceSopenharmony_ci "hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFo" 147d4afb5ceSopenharmony_ci "XDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjE" 148d4afb5ceSopenharmony_ci "ZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggE" 149d4afb5ceSopenharmony_ci "PADCCAQoCggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtO" 150d4afb5ceSopenharmony_ci "gQ3pOsqTQNroBvo3bSMgHFzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peV" 151d4afb5ceSopenharmony_ci "KVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+Uh" 152d4afb5ceSopenharmony_ci "nMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4c" 153d4afb5ceSopenharmony_ci "X8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34Gf" 154d4afb5ceSopenharmony_ci "ID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAU" 155d4afb5ceSopenharmony_ci "wAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7I" 156d4afb5ceSopenharmony_ci "QTgoIMA0GCSqGSIb3DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5" 157d4afb5ceSopenharmony_ci "IpDB/G/wkjUu0yKGX9rbxenDIU5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZ" 158d4afb5ceSopenharmony_ci "ERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2" 159d4afb5ceSopenharmony_ci "V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR" 160d4afb5ceSopenharmony_ci "1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob" 161d4afb5ceSopenharmony_ci "2xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5\"}" 162d4afb5ceSopenharmony_ci "]," 163d4afb5ceSopenharmony_ci "\"trust_stores\": [" /* named cert chains */ 164d4afb5ceSopenharmony_ci "{" 165d4afb5ceSopenharmony_ci "\"name\": \"api_amazon_com\"," 166d4afb5ceSopenharmony_ci "\"stack\": [\"digicert_global_ca_g2\", \"digicert_global_root_g2\"]" 167d4afb5ceSopenharmony_ci "}, { \"name\": \"arca1\", \"stack\": [\"amazon_root_ca_1\"]}," 168d4afb5ceSopenharmony_ci "{" 169d4afb5ceSopenharmony_ci "\"name\": \"le_via_isrg\"," 170d4afb5ceSopenharmony_ci "\"stack\": [" 171d4afb5ceSopenharmony_ci "\"isrg_root_x1\"" 172d4afb5ceSopenharmony_ci "]" 173d4afb5ceSopenharmony_ci "}" 174d4afb5ceSopenharmony_ci "]," 175d4afb5ceSopenharmony_ci "\"s\": [" 176d4afb5ceSopenharmony_ci 177d4afb5ceSopenharmony_ci "{\"api_amazon_com_auth\": {" 178d4afb5ceSopenharmony_ci "\"endpoint\": \"api.amazon.com\"," 179d4afb5ceSopenharmony_ci "\"port\": 443," 180d4afb5ceSopenharmony_ci "\"protocol\": \"h1\"," 181d4afb5ceSopenharmony_ci "\"http_method\": \"POST\"," 182d4afb5ceSopenharmony_ci "\"http_url\": \"auth/o2/token\"," 183d4afb5ceSopenharmony_ci "\"plugins\": []," 184d4afb5ceSopenharmony_ci "\"opportunistic\": true," 185d4afb5ceSopenharmony_ci "\"tls\": true," 186d4afb5ceSopenharmony_ci "\"h2q_oflow_txcr\": true," 187d4afb5ceSopenharmony_ci "\"http_www_form_urlencoded\": true," 188d4afb5ceSopenharmony_ci "\"http_no_content_length\": true," 189d4afb5ceSopenharmony_ci "\"retry\": \"default\"," 190d4afb5ceSopenharmony_ci "\"tls_trust_store\": \"api_amazon_com\"" 191d4afb5ceSopenharmony_ci "}},{" 192d4afb5ceSopenharmony_ci 193d4afb5ceSopenharmony_ci /* 194d4afb5ceSopenharmony_ci * Just get a 200 from httpbin.org 195d4afb5ceSopenharmony_ci * on h1:80, h1:443 and h2:443 196d4afb5ceSopenharmony_ci * 197d4afb5ceSopenharmony_ci * sanity check that we're working at all 198d4afb5ceSopenharmony_ci */ 199d4afb5ceSopenharmony_ci 200d4afb5ceSopenharmony_ci "\"t_h1\": {" 201d4afb5ceSopenharmony_ci "\"endpoint\": \"httpbin.org\"," 202d4afb5ceSopenharmony_ci "\"port\": 80," 203d4afb5ceSopenharmony_ci "\"protocol\": \"h1\"," 204d4afb5ceSopenharmony_ci "\"http_method\": \"GET\"," 205d4afb5ceSopenharmony_ci "\"http_url\": \"/status/200\"," 206d4afb5ceSopenharmony_ci "\"opportunistic\": true," 207d4afb5ceSopenharmony_ci "\"retry\": \"default\"" 208d4afb5ceSopenharmony_ci "}},{" 209d4afb5ceSopenharmony_ci "\"t_h1_tls\": {" 210d4afb5ceSopenharmony_ci "\"endpoint\": \"httpbin.org\"," 211d4afb5ceSopenharmony_ci "\"port\": 443," 212d4afb5ceSopenharmony_ci "\"protocol\": \"h1\"," 213d4afb5ceSopenharmony_ci "\"http_method\": \"GET\"," 214d4afb5ceSopenharmony_ci "\"http_url\": \"/status/200\"," 215d4afb5ceSopenharmony_ci "\"tls\": true," 216d4afb5ceSopenharmony_ci "\"opportunistic\": true," 217d4afb5ceSopenharmony_ci "\"retry\": \"default\"," 218d4afb5ceSopenharmony_ci "\"tls_trust_store\": \"arca1\"" 219d4afb5ceSopenharmony_ci "}},{" 220d4afb5ceSopenharmony_ci "\"t_h2_tls\": {" 221d4afb5ceSopenharmony_ci "\"endpoint\": \"httpbin.org\"," 222d4afb5ceSopenharmony_ci "\"port\": 443," 223d4afb5ceSopenharmony_ci "\"protocol\": \"h2\"," 224d4afb5ceSopenharmony_ci "\"http_method\": \"GET\"," 225d4afb5ceSopenharmony_ci "\"http_url\": \"/status/200\"," 226d4afb5ceSopenharmony_ci "\"tls\": true," 227d4afb5ceSopenharmony_ci "\"nghttp2_quirk_end_stream\": true," 228d4afb5ceSopenharmony_ci "\"h2q_oflow_txcr\": true," 229d4afb5ceSopenharmony_ci "\"opportunistic\": true," 230d4afb5ceSopenharmony_ci "\"retry\": \"default\"," 231d4afb5ceSopenharmony_ci "\"tls_trust_store\": \"arca1\"" 232d4afb5ceSopenharmony_ci "}},{" 233d4afb5ceSopenharmony_ci 234d4afb5ceSopenharmony_ci /* 235d4afb5ceSopenharmony_ci * 10s delayed response from httpbin.org 236d4afb5ceSopenharmony_ci * on h1:80, h1:443 and h2:443 237d4afb5ceSopenharmony_ci * 238d4afb5ceSopenharmony_ci * used to trigger timeout testing 239d4afb5ceSopenharmony_ci */ 240d4afb5ceSopenharmony_ci 241d4afb5ceSopenharmony_ci "\"d_h1\": {" 242d4afb5ceSopenharmony_ci "\"endpoint\": \"httpbin.org\"," 243d4afb5ceSopenharmony_ci "\"port\": 80," 244d4afb5ceSopenharmony_ci "\"protocol\": \"h1\"," 245d4afb5ceSopenharmony_ci "\"http_method\": \"GET\"," 246d4afb5ceSopenharmony_ci "\"http_url\": \"/delay/10\"," 247d4afb5ceSopenharmony_ci "\"opportunistic\": true," 248d4afb5ceSopenharmony_ci "\"retry\": \"default\"" 249d4afb5ceSopenharmony_ci "}},{" 250d4afb5ceSopenharmony_ci "\"d_h1_tls\": {" 251d4afb5ceSopenharmony_ci "\"endpoint\": \"httpbin.org\"," 252d4afb5ceSopenharmony_ci "\"port\": 443," 253d4afb5ceSopenharmony_ci "\"protocol\": \"h1\"," 254d4afb5ceSopenharmony_ci "\"http_method\": \"GET\"," 255d4afb5ceSopenharmony_ci "\"http_url\": \"/delay/10\"," 256d4afb5ceSopenharmony_ci "\"tls\": true," 257d4afb5ceSopenharmony_ci "\"opportunistic\": true," 258d4afb5ceSopenharmony_ci "\"retry\": \"default\"," 259d4afb5ceSopenharmony_ci "\"tls_trust_store\": \"arca1\"" 260d4afb5ceSopenharmony_ci "}},{" 261d4afb5ceSopenharmony_ci "\"d_h2_tls\": {" 262d4afb5ceSopenharmony_ci "\"endpoint\": \"httpbin.org\"," 263d4afb5ceSopenharmony_ci "\"port\": 443," 264d4afb5ceSopenharmony_ci "\"protocol\": \"h2\"," 265d4afb5ceSopenharmony_ci "\"http_method\": \"GET\"," 266d4afb5ceSopenharmony_ci "\"http_url\": \"/delay/10\"," 267d4afb5ceSopenharmony_ci "\"tls\": true," 268d4afb5ceSopenharmony_ci "\"nghttp2_quirk_end_stream\": true," 269d4afb5ceSopenharmony_ci "\"h2q_oflow_txcr\": true," 270d4afb5ceSopenharmony_ci "\"opportunistic\": true," 271d4afb5ceSopenharmony_ci "\"retry\": \"default\"," 272d4afb5ceSopenharmony_ci "\"tls_trust_store\": \"arca1\"" 273d4afb5ceSopenharmony_ci "}},{" 274d4afb5ceSopenharmony_ci 275d4afb5ceSopenharmony_ci /* 276d4afb5ceSopenharmony_ci * get NXDOMAIN for bogus.nope 277d4afb5ceSopenharmony_ci * on h1:80, h1:443 and h2:443 278d4afb5ceSopenharmony_ci * 279d4afb5ceSopenharmony_ci * Triggers unreachable and eventually all_retries_failed 280d4afb5ceSopenharmony_ci */ 281d4afb5ceSopenharmony_ci 282d4afb5ceSopenharmony_ci "\"nxd_h1\": {" 283d4afb5ceSopenharmony_ci "\"endpoint\": \"bogus.nope\"," 284d4afb5ceSopenharmony_ci "\"port\": 80," 285d4afb5ceSopenharmony_ci "\"protocol\": \"h1\"," 286d4afb5ceSopenharmony_ci "\"http_method\": \"GET\"," 287d4afb5ceSopenharmony_ci "\"http_url\": \"/status/200\"," 288d4afb5ceSopenharmony_ci "\"opportunistic\": true," 289d4afb5ceSopenharmony_ci "\"retry\": \"default\"" 290d4afb5ceSopenharmony_ci "}},{" 291d4afb5ceSopenharmony_ci "\"nxd_h1_tls\": {" 292d4afb5ceSopenharmony_ci "\"endpoint\": \"bogus.nope\"," 293d4afb5ceSopenharmony_ci "\"port\": 443," 294d4afb5ceSopenharmony_ci "\"protocol\": \"h1\"," 295d4afb5ceSopenharmony_ci "\"http_method\": \"GET\"," 296d4afb5ceSopenharmony_ci "\"http_url\": \"/status/200\"," 297d4afb5ceSopenharmony_ci "\"tls\": true," 298d4afb5ceSopenharmony_ci "\"opportunistic\": true," 299d4afb5ceSopenharmony_ci "\"retry\": \"default\"," 300d4afb5ceSopenharmony_ci "\"tls_trust_store\": \"arca1\"" 301d4afb5ceSopenharmony_ci "}},{" 302d4afb5ceSopenharmony_ci "\"nxd_h2_tls\": {" 303d4afb5ceSopenharmony_ci "\"endpoint\": \"bogus.nope\"," 304d4afb5ceSopenharmony_ci "\"port\": 443," 305d4afb5ceSopenharmony_ci "\"protocol\": \"h2\"," 306d4afb5ceSopenharmony_ci "\"http_method\": \"GET\"," 307d4afb5ceSopenharmony_ci "\"http_url\": \"/status/200\"," 308d4afb5ceSopenharmony_ci "\"tls\": true," 309d4afb5ceSopenharmony_ci "\"nghttp2_quirk_end_stream\": true," 310d4afb5ceSopenharmony_ci "\"h2q_oflow_txcr\": true," 311d4afb5ceSopenharmony_ci "\"opportunistic\": true," 312d4afb5ceSopenharmony_ci "\"retry\": \"default\"," 313d4afb5ceSopenharmony_ci "\"tls_trust_store\": \"arca1\"" 314d4afb5ceSopenharmony_ci "}},{" 315d4afb5ceSopenharmony_ci 316d4afb5ceSopenharmony_ci /* 317d4afb5ceSopenharmony_ci * bulk payload transfer from httpbin.org 318d4afb5ceSopenharmony_ci * on h1:80, h1:443 and h2:443 319d4afb5ceSopenharmony_ci * 320d4afb5ceSopenharmony_ci * Sanity check larger payload 321d4afb5ceSopenharmony_ci */ 322d4afb5ceSopenharmony_ci 323d4afb5ceSopenharmony_ci "\"bulk_h1\": {" 324d4afb5ceSopenharmony_ci "\"endpoint\": \"httpbin.org\"," 325d4afb5ceSopenharmony_ci "\"port\": 80," 326d4afb5ceSopenharmony_ci "\"protocol\": \"h1\"," 327d4afb5ceSopenharmony_ci "\"http_method\": \"GET\"," 328d4afb5ceSopenharmony_ci "\"http_url\": \"range/${amount}\"," 329d4afb5ceSopenharmony_ci "\"metadata\": [{" 330d4afb5ceSopenharmony_ci "\"amount\": \"\"" 331d4afb5ceSopenharmony_ci "}]," 332d4afb5ceSopenharmony_ci "\"opportunistic\": true," 333d4afb5ceSopenharmony_ci "\"retry\": \"default\"" 334d4afb5ceSopenharmony_ci "}},{" 335d4afb5ceSopenharmony_ci "\"bulk_h1_tls\": {" 336d4afb5ceSopenharmony_ci "\"endpoint\": \"httpbin.org\"," 337d4afb5ceSopenharmony_ci "\"port\": 443," 338d4afb5ceSopenharmony_ci "\"protocol\": \"h1\"," 339d4afb5ceSopenharmony_ci "\"http_method\": \"GET\"," 340d4afb5ceSopenharmony_ci "\"http_url\": \"range/${amount}\"," 341d4afb5ceSopenharmony_ci "\"metadata\": [{" 342d4afb5ceSopenharmony_ci "\"amount\": \"\"" 343d4afb5ceSopenharmony_ci "}]," 344d4afb5ceSopenharmony_ci "\"tls\": true," 345d4afb5ceSopenharmony_ci "\"opportunistic\": true," 346d4afb5ceSopenharmony_ci "\"retry\": \"default\"," 347d4afb5ceSopenharmony_ci "\"tls_trust_store\": \"arca1\"" 348d4afb5ceSopenharmony_ci "}},{" 349d4afb5ceSopenharmony_ci "\"bulk_h2_tls\": {" 350d4afb5ceSopenharmony_ci "\"endpoint\": \"httpbin.org\"," 351d4afb5ceSopenharmony_ci "\"port\": 443," 352d4afb5ceSopenharmony_ci "\"protocol\": \"h2\"," 353d4afb5ceSopenharmony_ci "\"http_method\": \"GET\"," 354d4afb5ceSopenharmony_ci "\"http_url\": \"range/${amount}\"," 355d4afb5ceSopenharmony_ci "\"metadata\": [{" 356d4afb5ceSopenharmony_ci "\"amount\": \"\"" 357d4afb5ceSopenharmony_ci "}]," 358d4afb5ceSopenharmony_ci "\"tls\": true," 359d4afb5ceSopenharmony_ci "\"nghttp2_quirk_end_stream\": true," 360d4afb5ceSopenharmony_ci "\"h2q_oflow_txcr\": true," 361d4afb5ceSopenharmony_ci "\"opportunistic\": true," 362d4afb5ceSopenharmony_ci "\"retry\": \"default\"," 363d4afb5ceSopenharmony_ci "\"tls_trust_store\": \"arca1\"" 364d4afb5ceSopenharmony_ci 365d4afb5ceSopenharmony_ci "}},{" 366d4afb5ceSopenharmony_ci 367d4afb5ceSopenharmony_ci /* 368d4afb5ceSopenharmony_ci * Various kinds of tls failure 369d4afb5ceSopenharmony_ci * 370d4afb5ceSopenharmony_ci * hostname.badcert.warmcat.com: serves valid cert but for 371d4afb5ceSopenharmony_ci * warmcat.com 372d4afb5ceSopenharmony_ci * 373d4afb5ceSopenharmony_ci * warmcat.com:446: serves valid but expired cert 374d4afb5ceSopenharmony_ci * 375d4afb5ceSopenharmony_ci * I don't have an easy way to make the test for "not valid yet" 376d4afb5ceSopenharmony_ci * cert without root 377d4afb5ceSopenharmony_ci * 378d4afb5ceSopenharmony_ci * invalidca.badcert.warmcat.com: selfsigned cert for that 379d4afb5ceSopenharmony_ci * hostname 380d4afb5ceSopenharmony_ci */ 381d4afb5ceSopenharmony_ci 382d4afb5ceSopenharmony_ci "\"badcert_hostname\": {" 383d4afb5ceSopenharmony_ci "\"endpoint\": \"hostname.badcert.warmcat.com\"," 384d4afb5ceSopenharmony_ci "\"port\": 443," 385d4afb5ceSopenharmony_ci "\"protocol\": \"h1\"," 386d4afb5ceSopenharmony_ci "\"http_method\": \"GET\"," 387d4afb5ceSopenharmony_ci "\"http_url\": \"/\"," 388d4afb5ceSopenharmony_ci "\"tls\": true," 389d4afb5ceSopenharmony_ci "\"opportunistic\": true," 390d4afb5ceSopenharmony_ci "\"retry\": \"default\"," 391d4afb5ceSopenharmony_ci "\"tls_trust_store\": \"le_via_isrg\"" 392d4afb5ceSopenharmony_ci "}},{" 393d4afb5ceSopenharmony_ci "\"badcert_expired\": {" 394d4afb5ceSopenharmony_ci "\"endpoint\": \"warmcat.com\"," 395d4afb5ceSopenharmony_ci "\"port\": 446," 396d4afb5ceSopenharmony_ci "\"protocol\": \"h1\"," 397d4afb5ceSopenharmony_ci "\"http_method\": \"GET\"," 398d4afb5ceSopenharmony_ci "\"http_url\": \"/\"," 399d4afb5ceSopenharmony_ci "\"tls\": true," 400d4afb5ceSopenharmony_ci "\"opportunistic\": true," 401d4afb5ceSopenharmony_ci "\"retry\": \"default\"," 402d4afb5ceSopenharmony_ci "\"tls_trust_store\": \"le_via_isrg\"" 403d4afb5ceSopenharmony_ci "}},{" 404d4afb5ceSopenharmony_ci "\"badcert_selfsigned\": {" 405d4afb5ceSopenharmony_ci "\"endpoint\": \"invalidca.badcert.warmcat.com\"," 406d4afb5ceSopenharmony_ci "\"port\": 443," 407d4afb5ceSopenharmony_ci "\"protocol\": \"h1\"," 408d4afb5ceSopenharmony_ci "\"http_method\": \"GET\"," 409d4afb5ceSopenharmony_ci "\"http_url\": \"/\"," 410d4afb5ceSopenharmony_ci "\"tls\": true," 411d4afb5ceSopenharmony_ci "\"nghttp2_quirk_end_stream\": true," 412d4afb5ceSopenharmony_ci "\"h2q_oflow_txcr\": true," 413d4afb5ceSopenharmony_ci "\"opportunistic\": true," 414d4afb5ceSopenharmony_ci "\"retry\": \"default\"," 415d4afb5ceSopenharmony_ci "\"tls_trust_store\": \"le_via_isrg\"" 416d4afb5ceSopenharmony_ci "}}" 417d4afb5ceSopenharmony_ci "]}" 418d4afb5ceSopenharmony_ci; 419d4afb5ceSopenharmony_ci 420d4afb5ceSopenharmony_ci#endif 421d4afb5ceSopenharmony_ci 422d4afb5ceSopenharmony_ci/* 423d4afb5ceSopenharmony_ci * This is the sequence of test streams we are going to create, the ss timeout, 424d4afb5ceSopenharmony_ci * and a description of what we want to see to understand the test passed, or 425d4afb5ceSopenharmony_ci * failed. If the test hits destruction without making a explicit pass or fail 426d4afb5ceSopenharmony_ci * decision before, that's a fail. Or, depending on what state we put in 427d4afb5ceSopenharmony_ci * .must_see, we can count a state like UNREACHABLE as a pass. 428d4afb5ceSopenharmony_ci */ 429d4afb5ceSopenharmony_ci 430d4afb5ceSopenharmony_cistruct tests_seq { 431d4afb5ceSopenharmony_ci const char *name; 432d4afb5ceSopenharmony_ci const char *streamtype; 433d4afb5ceSopenharmony_ci uint64_t timeout_us; 434d4afb5ceSopenharmony_ci lws_ss_constate_t must_see; 435d4afb5ceSopenharmony_ci unsigned int mask_unexpected; 436d4afb5ceSopenharmony_ci size_t eom_pass; 437d4afb5ceSopenharmony_ci} tests_seq[] = { 438d4afb5ceSopenharmony_ci 439d4afb5ceSopenharmony_ci /* 440d4afb5ceSopenharmony_ci * We just get a 200 from httpbin.org as a sanity check first 441d4afb5ceSopenharmony_ci */ 442d4afb5ceSopenharmony_ci 443d4afb5ceSopenharmony_ci { 444d4afb5ceSopenharmony_ci "h1:80 just get 200", 445d4afb5ceSopenharmony_ci "t_h1", 5 * LWS_US_PER_SEC, LWSSSCS_QOS_ACK_REMOTE, 446d4afb5ceSopenharmony_ci (1 << LWSSSCS_TIMEOUT) | (1 << LWSSSCS_QOS_NACK_REMOTE) | 447d4afb5ceSopenharmony_ci (1 << LWSSSCS_ALL_RETRIES_FAILED), 448d4afb5ceSopenharmony_ci 0 449d4afb5ceSopenharmony_ci }, 450d4afb5ceSopenharmony_ci { 451d4afb5ceSopenharmony_ci "h1:443 just get 200", 452d4afb5ceSopenharmony_ci "t_h1_tls", 5 * LWS_US_PER_SEC, LWSSSCS_QOS_ACK_REMOTE, 453d4afb5ceSopenharmony_ci (1 << LWSSSCS_TIMEOUT) | (1 << LWSSSCS_QOS_NACK_REMOTE) | 454d4afb5ceSopenharmony_ci (1 << LWSSSCS_ALL_RETRIES_FAILED), 455d4afb5ceSopenharmony_ci 0 456d4afb5ceSopenharmony_ci }, 457d4afb5ceSopenharmony_ci { 458d4afb5ceSopenharmony_ci "h2:443 just get 200", 459d4afb5ceSopenharmony_ci "t_h2_tls", 5 * LWS_US_PER_SEC, LWSSSCS_QOS_ACK_REMOTE, 460d4afb5ceSopenharmony_ci (1 << LWSSSCS_TIMEOUT) | (1 << LWSSSCS_QOS_NACK_REMOTE) | 461d4afb5ceSopenharmony_ci (1 << LWSSSCS_ALL_RETRIES_FAILED), 462d4afb5ceSopenharmony_ci 0 463d4afb5ceSopenharmony_ci }, 464d4afb5ceSopenharmony_ci 465d4afb5ceSopenharmony_ci /* 466d4afb5ceSopenharmony_ci * We arranged that the server will delay 10s before sending the 467d4afb5ceSopenharmony_ci * response, but set our ss timeout for 5s. So we expect to see 468d4afb5ceSopenharmony_ci * our timeout and not an ACK / 200. 469d4afb5ceSopenharmony_ci */ 470d4afb5ceSopenharmony_ci 471d4afb5ceSopenharmony_ci { 472d4afb5ceSopenharmony_ci "h1:80 timeout after connection", 473d4afb5ceSopenharmony_ci "d_h1", 5 * LWS_US_PER_SEC, LWSSSCS_TIMEOUT, 474d4afb5ceSopenharmony_ci (1 << LWSSSCS_QOS_ACK_REMOTE) | (1 << LWSSSCS_QOS_NACK_REMOTE) | 475d4afb5ceSopenharmony_ci (1 << LWSSSCS_ALL_RETRIES_FAILED), 476d4afb5ceSopenharmony_ci 0 477d4afb5ceSopenharmony_ci }, 478d4afb5ceSopenharmony_ci { 479d4afb5ceSopenharmony_ci "h1:443 timeout after connection", 480d4afb5ceSopenharmony_ci "d_h1_tls", 5 * LWS_US_PER_SEC, LWSSSCS_TIMEOUT, 481d4afb5ceSopenharmony_ci (1 << LWSSSCS_QOS_ACK_REMOTE) | (1 << LWSSSCS_QOS_NACK_REMOTE) | 482d4afb5ceSopenharmony_ci (1 << LWSSSCS_ALL_RETRIES_FAILED), 483d4afb5ceSopenharmony_ci 0 484d4afb5ceSopenharmony_ci }, 485d4afb5ceSopenharmony_ci { 486d4afb5ceSopenharmony_ci "h2:443 timeout after connection", 487d4afb5ceSopenharmony_ci "d_h2_tls", 5 * LWS_US_PER_SEC, LWSSSCS_TIMEOUT, 488d4afb5ceSopenharmony_ci (1 << LWSSSCS_QOS_ACK_REMOTE) | (1 << LWSSSCS_QOS_NACK_REMOTE) | 489d4afb5ceSopenharmony_ci (1 << LWSSSCS_ALL_RETRIES_FAILED), 490d4afb5ceSopenharmony_ci 0 491d4afb5ceSopenharmony_ci }, 492d4afb5ceSopenharmony_ci 493d4afb5ceSopenharmony_ci /* 494d4afb5ceSopenharmony_ci * We are talking to a nonexistant dns address "bogus.nope". We expect 495d4afb5ceSopenharmony_ci * in each case to hear that is unreachable, before any ss timeout. 496d4afb5ceSopenharmony_ci */ 497d4afb5ceSopenharmony_ci 498d4afb5ceSopenharmony_ci { 499d4afb5ceSopenharmony_ci "h1:80 NXDOMAIN", 500d4afb5ceSopenharmony_ci "nxd_h1", 65 * LWS_US_PER_SEC, LWSSSCS_UNREACHABLE, 501d4afb5ceSopenharmony_ci (1 << LWSSSCS_QOS_ACK_REMOTE) | (1 << LWSSSCS_QOS_NACK_REMOTE) | 502d4afb5ceSopenharmony_ci (1 << LWSSSCS_TIMEOUT) | (1 << LWSSSCS_ALL_RETRIES_FAILED), 503d4afb5ceSopenharmony_ci 0 504d4afb5ceSopenharmony_ci }, 505d4afb5ceSopenharmony_ci { 506d4afb5ceSopenharmony_ci "h1:443 NXDOMAIN", 507d4afb5ceSopenharmony_ci "nxd_h1_tls", 35 * LWS_US_PER_SEC, LWSSSCS_UNREACHABLE, 508d4afb5ceSopenharmony_ci (1 << LWSSSCS_QOS_ACK_REMOTE) | (1 << LWSSSCS_QOS_NACK_REMOTE) | 509d4afb5ceSopenharmony_ci (1 << LWSSSCS_TIMEOUT) | (1 << LWSSSCS_ALL_RETRIES_FAILED), 510d4afb5ceSopenharmony_ci 0 511d4afb5ceSopenharmony_ci }, 512d4afb5ceSopenharmony_ci { 513d4afb5ceSopenharmony_ci "h2:443 NXDOMAIN", 514d4afb5ceSopenharmony_ci "nxd_h2_tls", 35 * LWS_US_PER_SEC, LWSSSCS_UNREACHABLE, 515d4afb5ceSopenharmony_ci (1 << LWSSSCS_QOS_ACK_REMOTE) | (1 << LWSSSCS_QOS_NACK_REMOTE) | 516d4afb5ceSopenharmony_ci (1 << LWSSSCS_TIMEOUT) | (1 << LWSSSCS_ALL_RETRIES_FAILED), 517d4afb5ceSopenharmony_ci 0 518d4afb5ceSopenharmony_ci }, 519d4afb5ceSopenharmony_ci 520d4afb5ceSopenharmony_ci /* 521d4afb5ceSopenharmony_ci * We are talking to a nonexistant dns address "bogus.nope". We expect 522d4afb5ceSopenharmony_ci * that if we stick around longer, retries will also end up all failing. 523d4afb5ceSopenharmony_ci * We might see the timeout depending on blocking getaddrinfo 524d4afb5ceSopenharmony_ci * behaviour. 525d4afb5ceSopenharmony_ci */ 526d4afb5ceSopenharmony_ci 527d4afb5ceSopenharmony_ci { 528d4afb5ceSopenharmony_ci "h1:80 NXDOMAIN exhaust retries", 529d4afb5ceSopenharmony_ci "nxd_h1", 65 * LWS_US_PER_SEC, LWSSSCS_ALL_RETRIES_FAILED, 530d4afb5ceSopenharmony_ci (1 << LWSSSCS_QOS_ACK_REMOTE) | (1 << LWSSSCS_QOS_NACK_REMOTE), 531d4afb5ceSopenharmony_ci 0 532d4afb5ceSopenharmony_ci }, 533d4afb5ceSopenharmony_ci { 534d4afb5ceSopenharmony_ci "h1:443 NXDOMAIN exhaust retries", 535d4afb5ceSopenharmony_ci "nxd_h1_tls", 65 * LWS_US_PER_SEC, LWSSSCS_ALL_RETRIES_FAILED, 536d4afb5ceSopenharmony_ci (1 << LWSSSCS_QOS_ACK_REMOTE) | (1 << LWSSSCS_QOS_NACK_REMOTE), 537d4afb5ceSopenharmony_ci 0 538d4afb5ceSopenharmony_ci }, 539d4afb5ceSopenharmony_ci { 540d4afb5ceSopenharmony_ci "h2:443 NXDOMAIN exhaust retries", 541d4afb5ceSopenharmony_ci "nxd_h2_tls", 65 * LWS_US_PER_SEC, LWSSSCS_ALL_RETRIES_FAILED, 542d4afb5ceSopenharmony_ci (1 << LWSSSCS_QOS_ACK_REMOTE) | (1 << LWSSSCS_QOS_NACK_REMOTE), 543d4afb5ceSopenharmony_ci 0 544d4afb5ceSopenharmony_ci }, 545d4afb5ceSopenharmony_ci 546d4afb5ceSopenharmony_ci /* 547d4afb5ceSopenharmony_ci * Let's request some bulk data from httpbin.org 548d4afb5ceSopenharmony_ci */ 549d4afb5ceSopenharmony_ci 550d4afb5ceSopenharmony_ci { 551d4afb5ceSopenharmony_ci "h1:80 read bulk", 552d4afb5ceSopenharmony_ci "bulk_h1", 5 * LWS_US_PER_SEC, LWSSSCS_QOS_ACK_REMOTE, 553d4afb5ceSopenharmony_ci (1 << LWSSSCS_TIMEOUT) | (1 << LWSSSCS_QOS_NACK_REMOTE) | 554d4afb5ceSopenharmony_ci (1 << LWSSSCS_ALL_RETRIES_FAILED), 555d4afb5ceSopenharmony_ci 12345 556d4afb5ceSopenharmony_ci }, 557d4afb5ceSopenharmony_ci { 558d4afb5ceSopenharmony_ci "h1:443 read bulk", 559d4afb5ceSopenharmony_ci "bulk_h1_tls", 5 * LWS_US_PER_SEC, LWSSSCS_QOS_ACK_REMOTE, 560d4afb5ceSopenharmony_ci (1 << LWSSSCS_TIMEOUT) | (1 << LWSSSCS_QOS_NACK_REMOTE) | 561d4afb5ceSopenharmony_ci (1 << LWSSSCS_ALL_RETRIES_FAILED), 562d4afb5ceSopenharmony_ci 12345 563d4afb5ceSopenharmony_ci }, 564d4afb5ceSopenharmony_ci { 565d4afb5ceSopenharmony_ci "h2:443 read bulk", 566d4afb5ceSopenharmony_ci "bulk_h2_tls", 5 * LWS_US_PER_SEC, LWSSSCS_QOS_ACK_REMOTE, 567d4afb5ceSopenharmony_ci (1 << LWSSSCS_TIMEOUT) | (1 << LWSSSCS_QOS_NACK_REMOTE) | 568d4afb5ceSopenharmony_ci (1 << LWSSSCS_ALL_RETRIES_FAILED), 569d4afb5ceSopenharmony_ci 12345 570d4afb5ceSopenharmony_ci }, 571d4afb5ceSopenharmony_ci 572d4afb5ceSopenharmony_ci /* 573d4afb5ceSopenharmony_ci * Let's fail at the tls negotiation various ways 574d4afb5ceSopenharmony_ci */ 575d4afb5ceSopenharmony_ci 576d4afb5ceSopenharmony_ci { 577d4afb5ceSopenharmony_ci "h1:badcert_hostname", 578d4afb5ceSopenharmony_ci "badcert_hostname", 6 * LWS_US_PER_SEC, LWSSSCS_ALL_RETRIES_FAILED, 579d4afb5ceSopenharmony_ci (1 << LWSSSCS_QOS_NACK_REMOTE), 580d4afb5ceSopenharmony_ci 0 581d4afb5ceSopenharmony_ci }, 582d4afb5ceSopenharmony_ci { 583d4afb5ceSopenharmony_ci "h1:badcert_expired", 584d4afb5ceSopenharmony_ci "badcert_expired", 6 * LWS_US_PER_SEC, LWSSSCS_ALL_RETRIES_FAILED, 585d4afb5ceSopenharmony_ci (1 << LWSSSCS_QOS_NACK_REMOTE), 586d4afb5ceSopenharmony_ci 0 587d4afb5ceSopenharmony_ci }, 588d4afb5ceSopenharmony_ci { 589d4afb5ceSopenharmony_ci "h1:badcert_selfsigned", 590d4afb5ceSopenharmony_ci "badcert_selfsigned", 6 * LWS_US_PER_SEC, LWSSSCS_ALL_RETRIES_FAILED, 591d4afb5ceSopenharmony_ci (1 << LWSSSCS_QOS_NACK_REMOTE), 592d4afb5ceSopenharmony_ci 0 593d4afb5ceSopenharmony_ci }, 594d4afb5ceSopenharmony_ci 595d4afb5ceSopenharmony_ci}; 596d4afb5ceSopenharmony_ci 597d4afb5ceSopenharmony_citypedef struct myss { 598d4afb5ceSopenharmony_ci struct lws_ss_handle *ss; 599d4afb5ceSopenharmony_ci void *opaque_data; 600d4afb5ceSopenharmony_ci 601d4afb5ceSopenharmony_ci size_t rx_seen; 602d4afb5ceSopenharmony_ci char result_reported; 603d4afb5ceSopenharmony_ci} myss_t; 604d4afb5ceSopenharmony_ci 605d4afb5ceSopenharmony_ci 606d4afb5ceSopenharmony_ci/* secure streams payload interface */ 607d4afb5ceSopenharmony_ci 608d4afb5ceSopenharmony_cistatic lws_ss_state_return_t 609d4afb5ceSopenharmony_cimyss_rx(void *userobj, const uint8_t *buf, size_t len, int flags) 610d4afb5ceSopenharmony_ci{ 611d4afb5ceSopenharmony_ci myss_t *m = (myss_t *)userobj; 612d4afb5ceSopenharmony_ci 613d4afb5ceSopenharmony_ci m->rx_seen += len; 614d4afb5ceSopenharmony_ci 615d4afb5ceSopenharmony_ci if (flags & LWSSS_FLAG_EOM) 616d4afb5ceSopenharmony_ci lwsl_notice("%s: %s len %d, fl %d, received %u bytes\n", 617d4afb5ceSopenharmony_ci __func__, lws_ss_tag(m->ss), (int)len, flags, 618d4afb5ceSopenharmony_ci (unsigned int)m->rx_seen); 619d4afb5ceSopenharmony_ci 620d4afb5ceSopenharmony_ci return 0; 621d4afb5ceSopenharmony_ci} 622d4afb5ceSopenharmony_ci 623d4afb5ceSopenharmony_cistatic lws_ss_state_return_t 624d4afb5ceSopenharmony_cimyss_tx(void *userobj, lws_ss_tx_ordinal_t ord, uint8_t *buf, size_t *len, 625d4afb5ceSopenharmony_ci int *flags) 626d4afb5ceSopenharmony_ci{ 627d4afb5ceSopenharmony_ci //myss_t *m = (myss_t *)userobj; 628d4afb5ceSopenharmony_ci 629d4afb5ceSopenharmony_ci /* in this example, we don't send stuff */ 630d4afb5ceSopenharmony_ci 631d4afb5ceSopenharmony_ci return LWSSSSRET_TX_DONT_SEND; 632d4afb5ceSopenharmony_ci} 633d4afb5ceSopenharmony_ci 634d4afb5ceSopenharmony_cistatic lws_ss_state_return_t 635d4afb5ceSopenharmony_cimyss_state(void *userobj, void *sh, lws_ss_constate_t state, 636d4afb5ceSopenharmony_ci lws_ss_tx_ordinal_t ack) 637d4afb5ceSopenharmony_ci{ 638d4afb5ceSopenharmony_ci myss_t *m = (myss_t *)userobj; 639d4afb5ceSopenharmony_ci struct tests_seq *curr_test = ( struct tests_seq *)m->opaque_data; 640d4afb5ceSopenharmony_ci char buf[8]; 641d4afb5ceSopenharmony_ci size_t sl; 642d4afb5ceSopenharmony_ci 643d4afb5ceSopenharmony_ci lwsl_info("%s: %s: %s (%d), ord 0x%x\n", __func__, lws_ss_tag(m->ss), 644d4afb5ceSopenharmony_ci lws_ss_state_name((int)state), state, (unsigned int)ack); 645d4afb5ceSopenharmony_ci 646d4afb5ceSopenharmony_ci if (curr_test->mask_unexpected & (1u << state)) { 647d4afb5ceSopenharmony_ci /* 648d4afb5ceSopenharmony_ci * We have definitively failed on an unexpected state received 649d4afb5ceSopenharmony_ci */ 650d4afb5ceSopenharmony_ci 651d4afb5ceSopenharmony_ci lwsl_warn("%s: failing on unexpected state %s\n", 652d4afb5ceSopenharmony_ci __func__, lws_ss_state_name((int)state)); 653d4afb5ceSopenharmony_ci 654d4afb5ceSopenharmony_cifail: 655d4afb5ceSopenharmony_ci m->result_reported = 1; 656d4afb5ceSopenharmony_ci tests_fail++; 657d4afb5ceSopenharmony_ci /* we'll start the next test next time around the event loop */ 658d4afb5ceSopenharmony_ci lws_sul_schedule(context, 0, &sul_next_test, tests_start_next, 1); 659d4afb5ceSopenharmony_ci 660d4afb5ceSopenharmony_ci return LWSSSSRET_OK; 661d4afb5ceSopenharmony_ci } 662d4afb5ceSopenharmony_ci 663d4afb5ceSopenharmony_ci if (state == curr_test->must_see) { 664d4afb5ceSopenharmony_ci 665d4afb5ceSopenharmony_ci if (curr_test->eom_pass != m->rx_seen) { 666d4afb5ceSopenharmony_ci lwsl_notice("%s: failing on rx %d, expected %d\n", 667d4afb5ceSopenharmony_ci __func__, (int)m->rx_seen, 668d4afb5ceSopenharmony_ci (int)curr_test->eom_pass); 669d4afb5ceSopenharmony_ci goto fail; 670d4afb5ceSopenharmony_ci } 671d4afb5ceSopenharmony_ci 672d4afb5ceSopenharmony_ci lwsl_warn("%s: saw expected state %s\n", 673d4afb5ceSopenharmony_ci __func__, lws_ss_state_name((int)state)); 674d4afb5ceSopenharmony_ci m->result_reported = 1; 675d4afb5ceSopenharmony_ci tests_pass++; 676d4afb5ceSopenharmony_ci /* we'll start the next test next time around the event loop */ 677d4afb5ceSopenharmony_ci lws_sul_schedule(context, 0, &sul_next_test, tests_start_next, 1); 678d4afb5ceSopenharmony_ci 679d4afb5ceSopenharmony_ci return LWSSSSRET_OK; 680d4afb5ceSopenharmony_ci } 681d4afb5ceSopenharmony_ci 682d4afb5ceSopenharmony_ci switch (state) { 683d4afb5ceSopenharmony_ci case LWSSSCS_CREATING: 684d4afb5ceSopenharmony_ci lws_ss_start_timeout(m->ss, 685d4afb5ceSopenharmony_ci (unsigned int)(curr_test->timeout_us / LWS_US_PER_MS)); 686d4afb5ceSopenharmony_ci if (curr_test->eom_pass) { 687d4afb5ceSopenharmony_ci sl = (size_t)lws_snprintf(buf, sizeof(buf), "%u", 688d4afb5ceSopenharmony_ci (unsigned int)curr_test->eom_pass); 689d4afb5ceSopenharmony_ci if (lws_ss_set_metadata(m->ss, "amount", buf, sl)) 690d4afb5ceSopenharmony_ci return LWSSSSRET_DISCONNECT_ME; 691d4afb5ceSopenharmony_ci } 692d4afb5ceSopenharmony_ci return lws_ss_client_connect(m->ss); 693d4afb5ceSopenharmony_ci 694d4afb5ceSopenharmony_ci case LWSSSCS_DESTROYING: 695d4afb5ceSopenharmony_ci if (!m->result_reported) { 696d4afb5ceSopenharmony_ci lwsl_user("%s: failing on unexpected destruction\n", 697d4afb5ceSopenharmony_ci __func__); 698d4afb5ceSopenharmony_ci 699d4afb5ceSopenharmony_ci tests_fail++; 700d4afb5ceSopenharmony_ci /* we'll start the next test next time around the event loop */ 701d4afb5ceSopenharmony_ci lws_sul_schedule(context, 0, &sul_next_test, tests_start_next, 1); 702d4afb5ceSopenharmony_ci } 703d4afb5ceSopenharmony_ci break; 704d4afb5ceSopenharmony_ci 705d4afb5ceSopenharmony_ci default: 706d4afb5ceSopenharmony_ci break; 707d4afb5ceSopenharmony_ci } 708d4afb5ceSopenharmony_ci 709d4afb5ceSopenharmony_ci return LWSSSSRET_OK; 710d4afb5ceSopenharmony_ci} 711d4afb5ceSopenharmony_ci 712d4afb5ceSopenharmony_cistatic void 713d4afb5ceSopenharmony_citests_start_next(lws_sorted_usec_list_t *sul) 714d4afb5ceSopenharmony_ci{ 715d4afb5ceSopenharmony_ci struct tests_seq *ts; 716d4afb5ceSopenharmony_ci lws_ss_info_t ssi; 717d4afb5ceSopenharmony_ci static struct lws_ss_handle *h; 718d4afb5ceSopenharmony_ci 719d4afb5ceSopenharmony_ci /* destroy the old one */ 720d4afb5ceSopenharmony_ci 721d4afb5ceSopenharmony_ci if (h) { 722d4afb5ceSopenharmony_ci lwsl_info("%s: destroying previous stream\n", __func__); 723d4afb5ceSopenharmony_ci lws_ss_destroy(&h); 724d4afb5ceSopenharmony_ci } 725d4afb5ceSopenharmony_ci 726d4afb5ceSopenharmony_ci if ((unsigned int)tests >= LWS_ARRAY_SIZE(tests_seq)) { 727d4afb5ceSopenharmony_ci lwsl_notice("Completed all tests\n"); 728d4afb5ceSopenharmony_ci interrupted = 1; 729d4afb5ceSopenharmony_ci return; 730d4afb5ceSopenharmony_ci } 731d4afb5ceSopenharmony_ci 732d4afb5ceSopenharmony_ci ts = &tests_seq[tests++]; 733d4afb5ceSopenharmony_ci 734d4afb5ceSopenharmony_ci /* Create the next test stream */ 735d4afb5ceSopenharmony_ci 736d4afb5ceSopenharmony_ci memset(&ssi, 0, sizeof(ssi)); 737d4afb5ceSopenharmony_ci ssi.handle_offset = offsetof(myss_t, ss); 738d4afb5ceSopenharmony_ci ssi.opaque_user_data_offset = offsetof(myss_t, opaque_data); 739d4afb5ceSopenharmony_ci ssi.rx = myss_rx; 740d4afb5ceSopenharmony_ci ssi.tx = myss_tx; 741d4afb5ceSopenharmony_ci ssi.state = myss_state; 742d4afb5ceSopenharmony_ci ssi.user_alloc = sizeof(myss_t); 743d4afb5ceSopenharmony_ci ssi.streamtype = ts->streamtype; 744d4afb5ceSopenharmony_ci 745d4afb5ceSopenharmony_ci lwsl_user("%s: %d: %s\n", __func__, tests, ts->name); 746d4afb5ceSopenharmony_ci 747d4afb5ceSopenharmony_ci if (lws_ss_create(context, 0, &ssi, ts, &h, NULL, NULL)) { 748d4afb5ceSopenharmony_ci lwsl_err("%s: failed to create secure stream\n", 749d4afb5ceSopenharmony_ci __func__); 750d4afb5ceSopenharmony_ci tests_fail++; 751d4afb5ceSopenharmony_ci interrupted = 1; 752d4afb5ceSopenharmony_ci return; 753d4afb5ceSopenharmony_ci } 754d4afb5ceSopenharmony_ci} 755d4afb5ceSopenharmony_ci 756d4afb5ceSopenharmony_cistatic int 757d4afb5ceSopenharmony_ciapp_system_state_nf(lws_state_manager_t *mgr, lws_state_notify_link_t *link, 758d4afb5ceSopenharmony_ci int current, int target) 759d4afb5ceSopenharmony_ci{ 760d4afb5ceSopenharmony_ci switch (target) { 761d4afb5ceSopenharmony_ci 762d4afb5ceSopenharmony_ci case LWS_SYSTATE_OPERATIONAL: 763d4afb5ceSopenharmony_ci if (current == LWS_SYSTATE_OPERATIONAL) 764d4afb5ceSopenharmony_ci /* we'll start the next test next time around the event loop */ 765d4afb5ceSopenharmony_ci lws_sul_schedule(context, 0, &sul_next_test, tests_start_next, 1); 766d4afb5ceSopenharmony_ci break; 767d4afb5ceSopenharmony_ci } 768d4afb5ceSopenharmony_ci 769d4afb5ceSopenharmony_ci return 0; 770d4afb5ceSopenharmony_ci} 771d4afb5ceSopenharmony_ci 772d4afb5ceSopenharmony_cistatic lws_state_notify_link_t * const app_notifier_list[] = { 773d4afb5ceSopenharmony_ci &nl, NULL 774d4afb5ceSopenharmony_ci}; 775d4afb5ceSopenharmony_ci 776d4afb5ceSopenharmony_ci#if defined(LWS_WITH_SYS_METRICS) 777d4afb5ceSopenharmony_cistatic int 778d4afb5ceSopenharmony_cimy_metric_report(lws_metric_pub_t *mp) 779d4afb5ceSopenharmony_ci{ 780d4afb5ceSopenharmony_ci lws_metric_bucket_t *sub = mp->u.hist.head; 781d4afb5ceSopenharmony_ci char buf[192]; 782d4afb5ceSopenharmony_ci 783d4afb5ceSopenharmony_ci do { 784d4afb5ceSopenharmony_ci if (lws_metrics_format(mp, &sub, buf, sizeof(buf))) 785d4afb5ceSopenharmony_ci lwsl_user("%s: %s\n", __func__, buf); 786d4afb5ceSopenharmony_ci } while ((mp->flags & LWSMTFL_REPORT_HIST) && sub); 787d4afb5ceSopenharmony_ci 788d4afb5ceSopenharmony_ci /* 0 = leave metric to accumulate, 1 = reset the metric */ 789d4afb5ceSopenharmony_ci 790d4afb5ceSopenharmony_ci return 1; 791d4afb5ceSopenharmony_ci} 792d4afb5ceSopenharmony_ci 793d4afb5ceSopenharmony_cistatic const lws_system_ops_t system_ops = { 794d4afb5ceSopenharmony_ci .metric_report = my_metric_report, 795d4afb5ceSopenharmony_ci}; 796d4afb5ceSopenharmony_ci 797d4afb5ceSopenharmony_ci#endif 798d4afb5ceSopenharmony_ci 799d4afb5ceSopenharmony_cistatic void 800d4afb5ceSopenharmony_cisigint_handler(int sig) 801d4afb5ceSopenharmony_ci{ 802d4afb5ceSopenharmony_ci interrupted = 1; 803d4afb5ceSopenharmony_ci} 804d4afb5ceSopenharmony_ci 805d4afb5ceSopenharmony_ciint 806d4afb5ceSopenharmony_cimain(int argc, const char **argv) 807d4afb5ceSopenharmony_ci{ 808d4afb5ceSopenharmony_ci struct lws_context_creation_info info; 809d4afb5ceSopenharmony_ci const char *pp; 810d4afb5ceSopenharmony_ci 811d4afb5ceSopenharmony_ci signal(SIGINT, sigint_handler); 812d4afb5ceSopenharmony_ci 813d4afb5ceSopenharmony_ci memset(&info, 0, sizeof info); 814d4afb5ceSopenharmony_ci lws_cmdline_option_handle_builtin(argc, argv, &info); 815d4afb5ceSopenharmony_ci 816d4afb5ceSopenharmony_ci if ((pp = lws_cmdline_option(argc, argv, "--amount"))) 817d4afb5ceSopenharmony_ci amount = (size_t)atoi(pp); 818d4afb5ceSopenharmony_ci 819d4afb5ceSopenharmony_ci /* set the expected payload for the bulk-related tests to amount */ 820d4afb5ceSopenharmony_ci 821d4afb5ceSopenharmony_ci tests_seq[12].eom_pass = tests_seq[13].eom_pass = 822d4afb5ceSopenharmony_ci tests_seq[14].eom_pass = amount; 823d4afb5ceSopenharmony_ci#if !defined(LWS_SS_USE_SSPC) 824d4afb5ceSopenharmony_ci // puts(default_ss_policy); 825d4afb5ceSopenharmony_ci#endif 826d4afb5ceSopenharmony_ci 827d4afb5ceSopenharmony_ci lwsl_user("LWS secure streams error path tests [-d<verb>]\n"); 828d4afb5ceSopenharmony_ci 829d4afb5ceSopenharmony_ci info.fd_limit_per_thread = 1 + 16 + 1; 830d4afb5ceSopenharmony_ci info.port = CONTEXT_PORT_NO_LISTEN; 831d4afb5ceSopenharmony_ci#if defined(LWS_SS_USE_SSPC) 832d4afb5ceSopenharmony_ci info.protocols = lws_sspc_protocols; 833d4afb5ceSopenharmony_ci { 834d4afb5ceSopenharmony_ci const char *p; 835d4afb5ceSopenharmony_ci 836d4afb5ceSopenharmony_ci /* connect to ssproxy via UDS by default, else via 837d4afb5ceSopenharmony_ci * tcp connection to this port */ 838d4afb5ceSopenharmony_ci if ((p = lws_cmdline_option(argc, argv, "-p"))) 839d4afb5ceSopenharmony_ci info.ss_proxy_port = (uint16_t)atoi(p); 840d4afb5ceSopenharmony_ci 841d4afb5ceSopenharmony_ci /* UDS "proxy.ss.lws" in abstract namespace, else this socket 842d4afb5ceSopenharmony_ci * path; when -p given this can specify the network interface 843d4afb5ceSopenharmony_ci * to bind to */ 844d4afb5ceSopenharmony_ci if ((p = lws_cmdline_option(argc, argv, "-i"))) 845d4afb5ceSopenharmony_ci info.ss_proxy_bind = p; 846d4afb5ceSopenharmony_ci 847d4afb5ceSopenharmony_ci /* if -p given, -a specifies the proxy address to connect to */ 848d4afb5ceSopenharmony_ci if ((p = lws_cmdline_option(argc, argv, "-a"))) 849d4afb5ceSopenharmony_ci info.ss_proxy_address = p; 850d4afb5ceSopenharmony_ci } 851d4afb5ceSopenharmony_ci#else 852d4afb5ceSopenharmony_ci info.pss_policies_json = default_ss_policy; 853d4afb5ceSopenharmony_ci info.options = LWS_SERVER_OPTION_EXPLICIT_VHOSTS | 854d4afb5ceSopenharmony_ci LWS_SERVER_OPTION_H2_JUST_FIX_WINDOW_UPDATE_OVERFLOW | 855d4afb5ceSopenharmony_ci LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT; 856d4afb5ceSopenharmony_ci#endif 857d4afb5ceSopenharmony_ci 858d4afb5ceSopenharmony_ci /* integrate us with lws system state management when context created */ 859d4afb5ceSopenharmony_ci 860d4afb5ceSopenharmony_ci nl.name = "app"; 861d4afb5ceSopenharmony_ci nl.notify_cb = app_system_state_nf; 862d4afb5ceSopenharmony_ci info.register_notifier_list = app_notifier_list; 863d4afb5ceSopenharmony_ci 864d4afb5ceSopenharmony_ci#if defined(LWS_WITH_SYS_METRICS) 865d4afb5ceSopenharmony_ci info.system_ops = &system_ops; 866d4afb5ceSopenharmony_ci#if defined(LWS_WITH_SECURE_STREAMS_PROXY_API) 867d4afb5ceSopenharmony_ci info.metrics_prefix = "ssmex"; 868d4afb5ceSopenharmony_ci#endif 869d4afb5ceSopenharmony_ci#endif 870d4afb5ceSopenharmony_ci 871d4afb5ceSopenharmony_ci /* create the context */ 872d4afb5ceSopenharmony_ci 873d4afb5ceSopenharmony_ci context = lws_create_context(&info); 874d4afb5ceSopenharmony_ci if (!context) { 875d4afb5ceSopenharmony_ci lwsl_err("lws init failed\n"); 876d4afb5ceSopenharmony_ci return 1; 877d4afb5ceSopenharmony_ci } 878d4afb5ceSopenharmony_ci 879d4afb5ceSopenharmony_ci /* the event loop */ 880d4afb5ceSopenharmony_ci 881d4afb5ceSopenharmony_ci do { } while(lws_service(context, 0) >= 0 && !interrupted); 882d4afb5ceSopenharmony_ci 883d4afb5ceSopenharmony_ci lws_context_destroy(context); 884d4afb5ceSopenharmony_ci 885d4afb5ceSopenharmony_ci lwsl_user("Completed: %s (pass %d, fail %d)\n", 886d4afb5ceSopenharmony_ci tests_pass == tests && !tests_fail ? "OK" : "failed", 887d4afb5ceSopenharmony_ci tests_pass, tests_fail); 888d4afb5ceSopenharmony_ci 889d4afb5ceSopenharmony_ci return !(tests_pass == tests && !tests_fail); 890d4afb5ceSopenharmony_ci} 891