1d4afb5ceSopenharmony_ci /* 2d4afb5ceSopenharmony_ci * libwebsockets - small server side websockets and web server implementation 3d4afb5ceSopenharmony_ci * 4d4afb5ceSopenharmony_ci * Copyright (C) 2010 - 2019 Andy Green <andy@warmcat.com> 5d4afb5ceSopenharmony_ci * 6d4afb5ceSopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a copy 7d4afb5ceSopenharmony_ci * of this software and associated documentation files (the "Software"), to 8d4afb5ceSopenharmony_ci * deal in the Software without restriction, including without limitation the 9d4afb5ceSopenharmony_ci * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 10d4afb5ceSopenharmony_ci * sell copies of the Software, and to permit persons to whom the Software is 11d4afb5ceSopenharmony_ci * furnished to do so, subject to the following conditions: 12d4afb5ceSopenharmony_ci * 13d4afb5ceSopenharmony_ci * The above copyright notice and this permission notice shall be included in 14d4afb5ceSopenharmony_ci * all copies or substantial portions of the Software. 15d4afb5ceSopenharmony_ci * 16d4afb5ceSopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17d4afb5ceSopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18d4afb5ceSopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19d4afb5ceSopenharmony_ci * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20d4afb5ceSopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21d4afb5ceSopenharmony_ci * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 22d4afb5ceSopenharmony_ci * IN THE SOFTWARE. 23d4afb5ceSopenharmony_ci * 24d4afb5ceSopenharmony_ci * This is included from private-lib-core.h if either H1 or H2 roles are 25d4afb5ceSopenharmony_ci * enabled 26d4afb5ceSopenharmony_ci */ 27d4afb5ceSopenharmony_ci 28d4afb5ceSopenharmony_ci#if defined(LWS_WITH_HUBBUB) 29d4afb5ceSopenharmony_ci #include <hubbub/hubbub.h> 30d4afb5ceSopenharmony_ci #include <hubbub/parser.h> 31d4afb5ceSopenharmony_ci #endif 32d4afb5ceSopenharmony_ci 33d4afb5ceSopenharmony_ci#if defined(LWS_WITH_HTTP_STREAM_COMPRESSION) 34d4afb5ceSopenharmony_ci#include "private-lib-roles-http-compression.h" 35d4afb5ceSopenharmony_ci#endif 36d4afb5ceSopenharmony_ci 37d4afb5ceSopenharmony_ci#define lwsi_role_http(wsi) (lwsi_role_h1(wsi) || lwsi_role_h2(wsi)) 38d4afb5ceSopenharmony_ci 39d4afb5ceSopenharmony_cienum http_version { 40d4afb5ceSopenharmony_ci HTTP_VERSION_1_0, 41d4afb5ceSopenharmony_ci HTTP_VERSION_1_1, 42d4afb5ceSopenharmony_ci HTTP_VERSION_2 43d4afb5ceSopenharmony_ci}; 44d4afb5ceSopenharmony_ci 45d4afb5ceSopenharmony_cienum http_conn_type { 46d4afb5ceSopenharmony_ci HTTP_CONNECTION_CLOSE, 47d4afb5ceSopenharmony_ci HTTP_CONNECTION_KEEP_ALIVE 48d4afb5ceSopenharmony_ci}; 49d4afb5ceSopenharmony_ci 50d4afb5ceSopenharmony_ci/* 51d4afb5ceSopenharmony_ci * This is totally opaque to code using the library. It's exported as a 52d4afb5ceSopenharmony_ci * forward-reference pointer-only declaration; the user can use the pointer with 53d4afb5ceSopenharmony_ci * other APIs to get information out of it. 54d4afb5ceSopenharmony_ci */ 55d4afb5ceSopenharmony_ci 56d4afb5ceSopenharmony_ci#if defined(LWS_PLAT_FREERTOS) 57d4afb5ceSopenharmony_citypedef uint16_t ah_data_idx_t; 58d4afb5ceSopenharmony_ci#else 59d4afb5ceSopenharmony_citypedef uint32_t ah_data_idx_t; 60d4afb5ceSopenharmony_ci#endif 61d4afb5ceSopenharmony_ci 62d4afb5ceSopenharmony_cistruct lws_fragments { 63d4afb5ceSopenharmony_ci ah_data_idx_t offset; 64d4afb5ceSopenharmony_ci uint16_t len; 65d4afb5ceSopenharmony_ci uint8_t nfrag; /* which ah->frag[] continues this content, or 0 */ 66d4afb5ceSopenharmony_ci uint8_t flags; /* only http2 cares */ 67d4afb5ceSopenharmony_ci}; 68d4afb5ceSopenharmony_ci 69d4afb5ceSopenharmony_ci#if defined(LWS_WITH_RANGES) 70d4afb5ceSopenharmony_cienum range_states { 71d4afb5ceSopenharmony_ci LWSRS_NO_ACTIVE_RANGE, 72d4afb5ceSopenharmony_ci LWSRS_BYTES_EQ, 73d4afb5ceSopenharmony_ci LWSRS_FIRST, 74d4afb5ceSopenharmony_ci LWSRS_STARTING, 75d4afb5ceSopenharmony_ci LWSRS_ENDING, 76d4afb5ceSopenharmony_ci LWSRS_COMPLETED, 77d4afb5ceSopenharmony_ci LWSRS_SYNTAX, 78d4afb5ceSopenharmony_ci}; 79d4afb5ceSopenharmony_ci 80d4afb5ceSopenharmony_cistruct lws_range_parsing { 81d4afb5ceSopenharmony_ci unsigned long long start, end, extent, agg, budget; 82d4afb5ceSopenharmony_ci const char buf[128]; 83d4afb5ceSopenharmony_ci int pos; 84d4afb5ceSopenharmony_ci enum range_states state; 85d4afb5ceSopenharmony_ci char start_valid, end_valid, ctr, count_ranges, did_try, inside, send_ctr; 86d4afb5ceSopenharmony_ci}; 87d4afb5ceSopenharmony_ci 88d4afb5ceSopenharmony_ciint 89d4afb5ceSopenharmony_cilws_ranges_init(struct lws *wsi, struct lws_range_parsing *rp, 90d4afb5ceSopenharmony_ci unsigned long long extent); 91d4afb5ceSopenharmony_ciint 92d4afb5ceSopenharmony_cilws_ranges_next(struct lws_range_parsing *rp); 93d4afb5ceSopenharmony_civoid 94d4afb5ceSopenharmony_cilws_ranges_reset(struct lws_range_parsing *rp); 95d4afb5ceSopenharmony_ci#endif 96d4afb5ceSopenharmony_ci 97d4afb5ceSopenharmony_ci#define LWS_HTTP_NO_KNOWN_HEADER 0xff 98d4afb5ceSopenharmony_ci 99d4afb5ceSopenharmony_ci/* 100d4afb5ceSopenharmony_ci * these are assigned from a pool held in the context. 101d4afb5ceSopenharmony_ci * Both client and server mode uses them for http header analysis 102d4afb5ceSopenharmony_ci */ 103d4afb5ceSopenharmony_ci 104d4afb5ceSopenharmony_cistruct allocated_headers { 105d4afb5ceSopenharmony_ci struct allocated_headers *next; /* linked list */ 106d4afb5ceSopenharmony_ci struct lws *wsi; /* owner */ 107d4afb5ceSopenharmony_ci char *data; /* prepared by context init to point to dedicated storage */ 108d4afb5ceSopenharmony_ci ah_data_idx_t data_length; 109d4afb5ceSopenharmony_ci /* 110d4afb5ceSopenharmony_ci * the randomly ordered fragments, indexed by frag_index and 111d4afb5ceSopenharmony_ci * lws_fragments->nfrag for continuation. 112d4afb5ceSopenharmony_ci */ 113d4afb5ceSopenharmony_ci struct lws_fragments frags[WSI_TOKEN_COUNT]; 114d4afb5ceSopenharmony_ci time_t assigned; 115d4afb5ceSopenharmony_ci /* 116d4afb5ceSopenharmony_ci * for each recognized token, frag_index says which frag[] his data 117d4afb5ceSopenharmony_ci * starts in (0 means the token did not appear) 118d4afb5ceSopenharmony_ci * the actual header data gets dumped as it comes in, into data[] 119d4afb5ceSopenharmony_ci */ 120d4afb5ceSopenharmony_ci uint8_t frag_index[WSI_TOKEN_COUNT]; 121d4afb5ceSopenharmony_ci 122d4afb5ceSopenharmony_ci#if defined(LWS_WITH_CLIENT) 123d4afb5ceSopenharmony_ci char initial_handshake_hash_base64[30]; 124d4afb5ceSopenharmony_ci#endif 125d4afb5ceSopenharmony_ci int hdr_token_idx; 126d4afb5ceSopenharmony_ci 127d4afb5ceSopenharmony_ci ah_data_idx_t pos; 128d4afb5ceSopenharmony_ci ah_data_idx_t http_response; 129d4afb5ceSopenharmony_ci ah_data_idx_t current_token_limit; 130d4afb5ceSopenharmony_ci ah_data_idx_t unk_pos; /* to undo speculative unknown header */ 131d4afb5ceSopenharmony_ci 132d4afb5ceSopenharmony_ci#if defined(LWS_WITH_CUSTOM_HEADERS) 133d4afb5ceSopenharmony_ci ah_data_idx_t unk_value_pos; 134d4afb5ceSopenharmony_ci 135d4afb5ceSopenharmony_ci ah_data_idx_t unk_ll_head; 136d4afb5ceSopenharmony_ci ah_data_idx_t unk_ll_tail; 137d4afb5ceSopenharmony_ci#endif 138d4afb5ceSopenharmony_ci 139d4afb5ceSopenharmony_ci int16_t lextable_pos; 140d4afb5ceSopenharmony_ci 141d4afb5ceSopenharmony_ci uint8_t in_use; 142d4afb5ceSopenharmony_ci uint8_t nfrag; 143d4afb5ceSopenharmony_ci char /*enum uri_path_states */ ups; 144d4afb5ceSopenharmony_ci char /*enum uri_esc_states */ ues; 145d4afb5ceSopenharmony_ci 146d4afb5ceSopenharmony_ci char esc_stash; 147d4afb5ceSopenharmony_ci char post_literal_equal; 148d4afb5ceSopenharmony_ci uint8_t /* enum lws_token_indexes */ parser_state; 149d4afb5ceSopenharmony_ci}; 150d4afb5ceSopenharmony_ci 151d4afb5ceSopenharmony_ci 152d4afb5ceSopenharmony_ci 153d4afb5ceSopenharmony_ci#if defined(LWS_WITH_HUBBUB) 154d4afb5ceSopenharmony_cistruct lws_rewrite { 155d4afb5ceSopenharmony_ci hubbub_parser *parser; 156d4afb5ceSopenharmony_ci hubbub_parser_optparams params; 157d4afb5ceSopenharmony_ci const char *from, *to; 158d4afb5ceSopenharmony_ci int from_len, to_len; 159d4afb5ceSopenharmony_ci unsigned char *p, *end; 160d4afb5ceSopenharmony_ci struct lws *wsi; 161d4afb5ceSopenharmony_ci}; 162d4afb5ceSopenharmony_cistatic LWS_INLINE int hstrcmp(hubbub_string *s, const char *p, int len) 163d4afb5ceSopenharmony_ci{ 164d4afb5ceSopenharmony_ci if ((int)s->len != len) 165d4afb5ceSopenharmony_ci return 1; 166d4afb5ceSopenharmony_ci 167d4afb5ceSopenharmony_ci return strncmp((const char *)s->ptr, p, len); 168d4afb5ceSopenharmony_ci} 169d4afb5ceSopenharmony_citypedef hubbub_error (*hubbub_callback_t)(const hubbub_token *token, void *pw); 170d4afb5ceSopenharmony_ciLWS_EXTERN struct lws_rewrite * 171d4afb5ceSopenharmony_cilws_rewrite_create(struct lws *wsi, hubbub_callback_t cb, const char *from, const char *to); 172d4afb5ceSopenharmony_ciLWS_EXTERN void 173d4afb5ceSopenharmony_cilws_rewrite_destroy(struct lws_rewrite *r); 174d4afb5ceSopenharmony_ciLWS_EXTERN int 175d4afb5ceSopenharmony_cilws_rewrite_parse(struct lws_rewrite *r, const unsigned char *in, int in_len); 176d4afb5ceSopenharmony_ci#endif 177d4afb5ceSopenharmony_ci 178d4afb5ceSopenharmony_cistruct lws_pt_role_http { 179d4afb5ceSopenharmony_ci struct allocated_headers *ah_list; 180d4afb5ceSopenharmony_ci struct lws *ah_wait_list; 181d4afb5ceSopenharmony_ci#ifdef LWS_WITH_CGI 182d4afb5ceSopenharmony_ci struct lws_cgi *cgi_list; 183d4afb5ceSopenharmony_ci#endif 184d4afb5ceSopenharmony_ci int ah_wait_list_length; 185d4afb5ceSopenharmony_ci uint32_t ah_pool_length; 186d4afb5ceSopenharmony_ci 187d4afb5ceSopenharmony_ci int ah_count_in_use; 188d4afb5ceSopenharmony_ci}; 189d4afb5ceSopenharmony_ci 190d4afb5ceSopenharmony_cistruct lws_peer_role_http { 191d4afb5ceSopenharmony_ci uint32_t count_ah; 192d4afb5ceSopenharmony_ci uint32_t total_ah; 193d4afb5ceSopenharmony_ci}; 194d4afb5ceSopenharmony_ci 195d4afb5ceSopenharmony_cistruct lws_vhost_role_http { 196d4afb5ceSopenharmony_ci#if defined(LWS_CLIENT_HTTP_PROXYING) 197d4afb5ceSopenharmony_ci char http_proxy_address[128]; 198d4afb5ceSopenharmony_ci#endif 199d4afb5ceSopenharmony_ci const struct lws_http_mount *mount_list; 200d4afb5ceSopenharmony_ci const char *error_document_404; 201d4afb5ceSopenharmony_ci#if defined(LWS_CLIENT_HTTP_PROXYING) 202d4afb5ceSopenharmony_ci unsigned int http_proxy_port; 203d4afb5ceSopenharmony_ci#endif 204d4afb5ceSopenharmony_ci}; 205d4afb5ceSopenharmony_ci 206d4afb5ceSopenharmony_ci#ifdef LWS_WITH_ACCESS_LOG 207d4afb5ceSopenharmony_cistruct lws_access_log { 208d4afb5ceSopenharmony_ci char *header_log; 209d4afb5ceSopenharmony_ci char *user_agent; 210d4afb5ceSopenharmony_ci char *referrer; 211d4afb5ceSopenharmony_ci unsigned long sent; 212d4afb5ceSopenharmony_ci int response; 213d4afb5ceSopenharmony_ci}; 214d4afb5ceSopenharmony_ci#endif 215d4afb5ceSopenharmony_ci 216d4afb5ceSopenharmony_ci#define LWS_HTTP_CHUNK_HDR_MAX_SIZE (6 + 2) /* 6 hex digits and then CRLF */ 217d4afb5ceSopenharmony_ci#define LWS_HTTP_CHUNK_TRL_MAX_SIZE (2 + 5) /* CRLF, then maybe 0 CRLF CRLF */ 218d4afb5ceSopenharmony_ci 219d4afb5ceSopenharmony_cistruct _lws_http_mode_related { 220d4afb5ceSopenharmony_ci struct lws *new_wsi_list; 221d4afb5ceSopenharmony_ci 222d4afb5ceSopenharmony_ci unsigned char *pending_return_headers; 223d4afb5ceSopenharmony_ci size_t pending_return_headers_len; 224d4afb5ceSopenharmony_ci size_t prh_content_length; 225d4afb5ceSopenharmony_ci 226d4afb5ceSopenharmony_ci#if defined(LWS_WITH_HTTP_PROXY) 227d4afb5ceSopenharmony_ci struct lws_rewrite *rw; 228d4afb5ceSopenharmony_ci struct lws_buflist *buflist_post_body; 229d4afb5ceSopenharmony_ci#endif 230d4afb5ceSopenharmony_ci struct allocated_headers *ah; 231d4afb5ceSopenharmony_ci struct lws *ah_wait_list; 232d4afb5ceSopenharmony_ci 233d4afb5ceSopenharmony_ci unsigned long writeable_len; 234d4afb5ceSopenharmony_ci 235d4afb5ceSopenharmony_ci#if defined(LWS_WITH_FILE_OPS) 236d4afb5ceSopenharmony_ci lws_filepos_t filepos; 237d4afb5ceSopenharmony_ci lws_filepos_t filelen; 238d4afb5ceSopenharmony_ci lws_fop_fd_t fop_fd; 239d4afb5ceSopenharmony_ci#endif 240d4afb5ceSopenharmony_ci#if defined(LWS_WITH_CLIENT) 241d4afb5ceSopenharmony_ci char multipart_boundary[16]; 242d4afb5ceSopenharmony_ci#endif 243d4afb5ceSopenharmony_ci#if defined(LWS_WITH_RANGES) 244d4afb5ceSopenharmony_ci struct lws_range_parsing range; 245d4afb5ceSopenharmony_ci char multipart_content_type[64]; 246d4afb5ceSopenharmony_ci#endif 247d4afb5ceSopenharmony_ci 248d4afb5ceSopenharmony_ci#ifdef LWS_WITH_ACCESS_LOG 249d4afb5ceSopenharmony_ci struct lws_access_log access_log; 250d4afb5ceSopenharmony_ci#endif 251d4afb5ceSopenharmony_ci#if defined(LWS_WITH_SERVER) 252d4afb5ceSopenharmony_ci unsigned int response_code; 253d4afb5ceSopenharmony_ci#endif 254d4afb5ceSopenharmony_ci#ifdef LWS_WITH_CGI 255d4afb5ceSopenharmony_ci struct lws_cgi *cgi; /* wsi being cgi stream have one of these */ 256d4afb5ceSopenharmony_ci#endif 257d4afb5ceSopenharmony_ci#if defined(LWS_WITH_HTTP_STREAM_COMPRESSION) 258d4afb5ceSopenharmony_ci struct lws_compression_support *lcs; 259d4afb5ceSopenharmony_ci lws_comp_ctx_t comp_ctx; 260d4afb5ceSopenharmony_ci unsigned char comp_accept_mask; 261d4afb5ceSopenharmony_ci#endif 262d4afb5ceSopenharmony_ci 263d4afb5ceSopenharmony_ci enum http_version request_version; 264d4afb5ceSopenharmony_ci enum http_conn_type conn_type; 265d4afb5ceSopenharmony_ci lws_filepos_t tx_content_length; 266d4afb5ceSopenharmony_ci lws_filepos_t tx_content_remain; 267d4afb5ceSopenharmony_ci lws_filepos_t rx_content_length; 268d4afb5ceSopenharmony_ci lws_filepos_t rx_content_remain; 269d4afb5ceSopenharmony_ci 270d4afb5ceSopenharmony_ci#if defined(LWS_WITH_HTTP_PROXY) 271d4afb5ceSopenharmony_ci unsigned int perform_rewrite:1; 272d4afb5ceSopenharmony_ci unsigned int proxy_clientside:1; 273d4afb5ceSopenharmony_ci unsigned int proxy_parent_chunked:1; 274d4afb5ceSopenharmony_ci#endif 275d4afb5ceSopenharmony_ci unsigned int deferred_transaction_completed:1; 276d4afb5ceSopenharmony_ci unsigned int content_length_explicitly_zero:1; 277d4afb5ceSopenharmony_ci unsigned int content_length_given:1; 278d4afb5ceSopenharmony_ci unsigned int did_stream_close:1; 279d4afb5ceSopenharmony_ci unsigned int multipart:1; 280d4afb5ceSopenharmony_ci unsigned int cgi_transaction_complete:1; 281d4afb5ceSopenharmony_ci unsigned int multipart_issue_boundary:1; 282d4afb5ceSopenharmony_ci}; 283d4afb5ceSopenharmony_ci 284d4afb5ceSopenharmony_ci 285d4afb5ceSopenharmony_ci#if defined(LWS_WITH_CLIENT) 286d4afb5ceSopenharmony_cienum lws_chunk_parser { 287d4afb5ceSopenharmony_ci ELCP_HEX, 288d4afb5ceSopenharmony_ci ELCP_CR, 289d4afb5ceSopenharmony_ci ELCP_CONTENT, 290d4afb5ceSopenharmony_ci ELCP_POST_CR, 291d4afb5ceSopenharmony_ci ELCP_POST_LF, 292d4afb5ceSopenharmony_ci ELCP_TRAILER_CR, 293d4afb5ceSopenharmony_ci ELCP_TRAILER_LF 294d4afb5ceSopenharmony_ci}; 295d4afb5ceSopenharmony_ci#endif 296d4afb5ceSopenharmony_ci 297d4afb5ceSopenharmony_cienum lws_parse_urldecode_results { 298d4afb5ceSopenharmony_ci LPUR_CONTINUE, 299d4afb5ceSopenharmony_ci LPUR_SWALLOW, 300d4afb5ceSopenharmony_ci LPUR_FORBID, 301d4afb5ceSopenharmony_ci LPUR_EXCESSIVE, 302d4afb5ceSopenharmony_ci}; 303d4afb5ceSopenharmony_ci 304d4afb5ceSopenharmony_cienum lws_check_basic_auth_results { 305d4afb5ceSopenharmony_ci LCBA_CONTINUE, 306d4afb5ceSopenharmony_ci LCBA_FAILED_AUTH, 307d4afb5ceSopenharmony_ci LCBA_END_TRANSACTION, 308d4afb5ceSopenharmony_ci}; 309d4afb5ceSopenharmony_ci 310d4afb5ceSopenharmony_cienum lws_check_basic_auth_results 311d4afb5ceSopenharmony_cilws_check_basic_auth(struct lws *wsi, const char *basic_auth_login_file, unsigned int auth_mode); 312d4afb5ceSopenharmony_ci 313d4afb5ceSopenharmony_ciint 314d4afb5ceSopenharmony_cilws_unauthorised_basic_auth(struct lws *wsi); 315d4afb5ceSopenharmony_ci 316d4afb5ceSopenharmony_ciint 317d4afb5ceSopenharmony_cilws_read_h1(struct lws *wsi, unsigned char *buf, lws_filepos_t len); 318d4afb5ceSopenharmony_ci 319d4afb5ceSopenharmony_civoid 320d4afb5ceSopenharmony_ci_lws_header_table_reset(struct allocated_headers *ah); 321d4afb5ceSopenharmony_ci 322d4afb5ceSopenharmony_ciLWS_EXTERN int 323d4afb5ceSopenharmony_ci_lws_destroy_ah(struct lws_context_per_thread *pt, struct allocated_headers *ah); 324d4afb5ceSopenharmony_ci 325d4afb5ceSopenharmony_ciint 326d4afb5ceSopenharmony_cilws_http_proxy_start(struct lws *wsi, const struct lws_http_mount *hit, 327d4afb5ceSopenharmony_ci char *uri_ptr, char ws); 328d4afb5ceSopenharmony_ci 329d4afb5ceSopenharmony_civoid 330d4afb5ceSopenharmony_cilws_sul_http_ah_lifecheck(lws_sorted_usec_list_t *sul); 331d4afb5ceSopenharmony_ci 332d4afb5ceSopenharmony_ciuint8_t * 333d4afb5ceSopenharmony_cilws_http_multipart_headers(struct lws *wsi, uint8_t *p); 334d4afb5ceSopenharmony_ci 335d4afb5ceSopenharmony_ciint 336d4afb5ceSopenharmony_cilws_http_string_to_known_header(const char *s, size_t slen); 337d4afb5ceSopenharmony_ci 338d4afb5ceSopenharmony_ciint 339d4afb5ceSopenharmony_cilws_http_date_render_from_unix(char *buf, size_t len, const time_t *t); 340d4afb5ceSopenharmony_ci 341d4afb5ceSopenharmony_ciint 342d4afb5ceSopenharmony_cilws_http_date_parse_unix(const char *b, size_t len, time_t *t); 343d4afb5ceSopenharmony_ci 344d4afb5ceSopenharmony_cienum { 345d4afb5ceSopenharmony_ci CCTLS_RETURN_ERROR = -1, 346d4afb5ceSopenharmony_ci CCTLS_RETURN_DONE = 0, 347d4afb5ceSopenharmony_ci CCTLS_RETURN_RETRY = 1, 348d4afb5ceSopenharmony_ci}; 349d4afb5ceSopenharmony_ci 350d4afb5ceSopenharmony_ciint 351d4afb5ceSopenharmony_cilws_client_create_tls(struct lws *wsi, const char **pcce, int do_c1); 352