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