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