1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
|
/*
* Copyright (C) Dmitry Volyntsev
* Copyright (C) hongzhidao
* Copyright (C) Antoine Bonavita
* Copyright (C) NGINX, Inc.
*/
#ifndef _NGX_JS_HTTP_H_INCLUDED_
#define _NGX_JS_HTTP_H_INCLUDED_
typedef struct ngx_js_http_s ngx_js_http_t;
typedef struct {
ngx_uint_t state;
ngx_uint_t code;
u_char *status_text;
u_char *status_text_end;
ngx_uint_t count;
ngx_flag_t chunked;
off_t content_length_n;
u_char *header_name_start;
u_char *header_name_end;
u_char *header_start;
u_char *header_end;
} ngx_js_http_parse_t;
typedef struct {
u_char *pos;
uint64_t chunk_size;
uint8_t state;
uint8_t last;
} ngx_js_http_chunk_parse_t;
typedef struct ngx_js_tb_elt_s ngx_js_tb_elt_t;
struct ngx_js_tb_elt_s {
ngx_uint_t hash;
ngx_str_t key;
ngx_str_t value;
ngx_js_tb_elt_t *next;
};
typedef struct {
enum {
GUARD_NONE = 0,
GUARD_REQUEST,
GUARD_IMMUTABLE,
GUARD_RESPONSE,
} guard;
ngx_list_t header_list;
ngx_js_tb_elt_t *content_type;
} ngx_js_headers_t;
typedef struct {
enum {
CACHE_MODE_DEFAULT = 0,
CACHE_MODE_NO_STORE,
CACHE_MODE_RELOAD,
CACHE_MODE_NO_CACHE,
CACHE_MODE_FORCE_CACHE,
CACHE_MODE_ONLY_IF_CACHED,
} cache_mode;
enum {
CREDENTIALS_SAME_ORIGIN = 0,
CREDENTIALS_INCLUDE,
CREDENTIALS_OMIT,
} credentials;
enum {
MODE_NO_CORS = 0,
MODE_SAME_ORIGIN,
MODE_CORS,
MODE_NAVIGATE,
MODE_WEBSOCKET,
} mode;
ngx_str_t url;
ngx_str_t method;
u_char m[8];
uint8_t body_used;
ngx_str_t body;
ngx_js_headers_t headers;
njs_opaque_value_t header_value;
} ngx_js_request_t;
typedef struct {
ngx_str_t url;
ngx_int_t code;
ngx_str_t status_text;
uint8_t body_used;
njs_chb_t chain;
ngx_js_headers_t headers;
njs_opaque_value_t header_value;
} ngx_js_response_t;
struct ngx_js_http_s {
ngx_log_t *log;
ngx_pool_t *pool;
ngx_resolver_ctx_t *ctx;
ngx_addr_t addr;
ngx_addr_t *addrs;
ngx_uint_t naddrs;
ngx_uint_t naddr;
in_port_t port;
ngx_peer_connection_t peer;
ngx_msec_t timeout;
ngx_int_t buffer_size;
ngx_int_t max_response_body_size;
unsigned header_only;
#if (NGX_SSL)
ngx_str_t tls_name;
ngx_ssl_t *ssl;
njs_bool_t ssl_verify;
#endif
ngx_buf_t *buffer;
ngx_buf_t *chunk;
njs_chb_t chain;
ngx_js_response_t response;
uint8_t done;
ngx_js_http_parse_t http_parse;
ngx_js_http_chunk_parse_t http_chunk_parse;
ngx_int_t (*process)(ngx_js_http_t *http);
ngx_int_t (*append_headers)(ngx_js_http_t *http,
ngx_js_headers_t *headers,
u_char *name, size_t len,
u_char *value, size_t vlen);
void (*ready_handler)(ngx_js_http_t *http);
void (*error_handler)(ngx_js_http_t *http,
const char *err);
};
ngx_resolver_ctx_t *ngx_js_http_resolve(ngx_js_http_t *http, ngx_resolver_t *r,
ngx_str_t *host, in_port_t port, ngx_msec_t timeout);
void ngx_js_http_connect(ngx_js_http_t *http);
void ngx_js_http_resolve_done(ngx_js_http_t *http);
void ngx_js_http_close_peer(ngx_js_http_t *http);
void ngx_js_http_trim(u_char **value, size_t *len,
int trim_c0_control_or_space);
ngx_int_t ngx_js_check_header_name(u_char *name, size_t len);
#endif /* _NGX_JS_HTTP_H_INCLUDED_ */
|