xref: /unit/src/nxt_http.h (revision 1112)
1431Sigor@sysoev.ru 
2431Sigor@sysoev.ru /*
3431Sigor@sysoev.ru  * Copyright (C) Igor Sysoev
4431Sigor@sysoev.ru  * Copyright (C) NGINX, Inc.
5431Sigor@sysoev.ru  */
6431Sigor@sysoev.ru 
7431Sigor@sysoev.ru #ifndef _NXT_HTTP_H_INCLUDED_
8431Sigor@sysoev.ru #define _NXT_HTTP_H_INCLUDED_
9431Sigor@sysoev.ru 
10431Sigor@sysoev.ru 
11431Sigor@sysoev.ru typedef enum {
12431Sigor@sysoev.ru     NXT_HTTP_INVALID = 0,
13431Sigor@sysoev.ru 
14431Sigor@sysoev.ru     NXT_HTTP_OK = 200,
15793Sigor@sysoev.ru     NXT_HTTP_NO_CONTENT = 204,
16431Sigor@sysoev.ru 
17431Sigor@sysoev.ru     NXT_HTTP_MULTIPLE_CHOICES = 300,
18431Sigor@sysoev.ru     NXT_HTTP_MOVED_PERMANENTLY = 301,
19431Sigor@sysoev.ru     NXT_HTTP_FOUND = 302,
20431Sigor@sysoev.ru     NXT_HTTP_SEE_OTHER = 303,
21431Sigor@sysoev.ru     NXT_HTTP_NOT_MODIFIED = 304,
22431Sigor@sysoev.ru 
23431Sigor@sysoev.ru     NXT_HTTP_BAD_REQUEST = 400,
24964Sigor@sysoev.ru     NXT_HTTP_NOT_FOUND = 404,
25624Sigor@sysoev.ru     NXT_HTTP_REQUEST_TIMEOUT = 408,
26431Sigor@sysoev.ru     NXT_HTTP_LENGTH_REQUIRED = 411,
27431Sigor@sysoev.ru     NXT_HTTP_PAYLOAD_TOO_LARGE = 413,
28431Sigor@sysoev.ru     NXT_HTTP_URI_TOO_LONG = 414,
29431Sigor@sysoev.ru     NXT_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431,
30431Sigor@sysoev.ru 
31772Sigor@sysoev.ru     NXT_HTTP_TO_HTTPS = 497,
32772Sigor@sysoev.ru 
33431Sigor@sysoev.ru     NXT_HTTP_INTERNAL_SERVER_ERROR = 500,
34431Sigor@sysoev.ru     NXT_HTTP_NOT_IMPLEMENTED = 501,
35431Sigor@sysoev.ru     NXT_HTTP_BAD_GATEWAY = 502,
36431Sigor@sysoev.ru     NXT_HTTP_SERVICE_UNAVAILABLE = 503,
37431Sigor@sysoev.ru     NXT_HTTP_GATEWAY_TIMEOUT = 504,
38482Svbart@nginx.com     NXT_HTTP_VERSION_NOT_SUPPORTED = 505,
39431Sigor@sysoev.ru } nxt_http_status_t;
40431Sigor@sysoev.ru 
41431Sigor@sysoev.ru 
42431Sigor@sysoev.ru typedef enum {
43431Sigor@sysoev.ru     NXT_HTTP_TE_NONE = 0,
44431Sigor@sysoev.ru     NXT_HTTP_TE_CHUNKED = 1,
45431Sigor@sysoev.ru     NXT_HTTP_TE_UNSUPPORTED = 2,
46431Sigor@sysoev.ru } nxt_http_te_t;
47431Sigor@sysoev.ru 
48431Sigor@sysoev.ru 
49*1112Sigor@sysoev.ru typedef enum {
50*1112Sigor@sysoev.ru     NXT_HTTP_PROTO_H1 = 0,
51*1112Sigor@sysoev.ru     NXT_HTTP_PROTO_H2,
52*1112Sigor@sysoev.ru     NXT_HTTP_PROTO_DEVNULL,
53*1112Sigor@sysoev.ru } nxt_http_protocol_t;
54*1112Sigor@sysoev.ru 
55*1112Sigor@sysoev.ru 
56431Sigor@sysoev.ru typedef struct {
57431Sigor@sysoev.ru     nxt_work_handler_t              ready_handler;
58431Sigor@sysoev.ru     nxt_work_handler_t              error_handler;
59431Sigor@sysoev.ru } nxt_http_request_state_t;
60431Sigor@sysoev.ru 
61431Sigor@sysoev.ru 
62431Sigor@sysoev.ru typedef struct {
63431Sigor@sysoev.ru     nxt_http_request_parse_t        parser;
64431Sigor@sysoev.ru 
65431Sigor@sysoev.ru     uint8_t                         nbuffers;
66431Sigor@sysoev.ru     uint8_t                         keepalive;            /* 1 bit  */
67431Sigor@sysoev.ru     uint8_t                         chunked;              /* 1 bit  */
68431Sigor@sysoev.ru     nxt_http_te_t                   transfer_encoding:8;  /* 2 bits */
69431Sigor@sysoev.ru 
70630Svbart@nginx.com     uint32_t                        header_size;
71630Svbart@nginx.com 
72431Sigor@sysoev.ru     nxt_http_request_t              *request;
73452Sigor@sysoev.ru     nxt_buf_t                       *buffers;
74452Sigor@sysoev.ru     /*
75452Sigor@sysoev.ru      * All fields before the conn field will
76452Sigor@sysoev.ru      * be zeroed in a keep-alive connection.
77452Sigor@sysoev.ru      */
78431Sigor@sysoev.ru     nxt_conn_t                      *conn;
79431Sigor@sysoev.ru } nxt_h1proto_t;
80431Sigor@sysoev.ru 
81431Sigor@sysoev.ru 
82431Sigor@sysoev.ru typedef union {
83431Sigor@sysoev.ru     void                            *any;
84431Sigor@sysoev.ru     nxt_h1proto_t                   *h1;
85431Sigor@sysoev.ru } nxt_http_proto_t;
86431Sigor@sysoev.ru 
87431Sigor@sysoev.ru 
88431Sigor@sysoev.ru #define nxt_http_field_name_set(_field, _name)                                \
89431Sigor@sysoev.ru     do {                                                                      \
90703Svbart@nginx.com          (_field)->name_length = nxt_length(_name);                           \
91431Sigor@sysoev.ru          (_field)->name = (u_char *) _name;                                   \
92431Sigor@sysoev.ru     } while (0)
93431Sigor@sysoev.ru 
94431Sigor@sysoev.ru 
95431Sigor@sysoev.ru #define nxt_http_field_set(_field, _name, _value)                             \
96431Sigor@sysoev.ru     do {                                                                      \
97703Svbart@nginx.com          (_field)->name_length = nxt_length(_name);                           \
98703Svbart@nginx.com          (_field)->value_length = nxt_length(_value);                         \
99431Sigor@sysoev.ru          (_field)->name = (u_char *) _name;                                   \
100431Sigor@sysoev.ru          (_field)->value = (u_char *) _value;                                 \
101431Sigor@sysoev.ru     } while (0)
102431Sigor@sysoev.ru 
103431Sigor@sysoev.ru 
104431Sigor@sysoev.ru typedef struct {
105431Sigor@sysoev.ru     nxt_list_t                      *fields;
106543Svbart@nginx.com     nxt_http_field_t                *date;
107431Sigor@sysoev.ru     nxt_http_field_t                *content_type;
108431Sigor@sysoev.ru     nxt_http_field_t                *content_length;
109431Sigor@sysoev.ru     nxt_off_t                       content_length_n;
110431Sigor@sysoev.ru } nxt_http_response_t;
111431Sigor@sysoev.ru 
112431Sigor@sysoev.ru 
113431Sigor@sysoev.ru struct nxt_http_request_s {
114431Sigor@sysoev.ru     nxt_http_proto_t                proto;
115683Sigor@sysoev.ru     nxt_socket_conf_joint_t         *conf;
116431Sigor@sysoev.ru 
117431Sigor@sysoev.ru     nxt_mp_t                        *mem_pool;
118431Sigor@sysoev.ru 
119431Sigor@sysoev.ru     nxt_buf_t                       *body;
120431Sigor@sysoev.ru     nxt_buf_t                       *out;
121431Sigor@sysoev.ru     const nxt_http_request_state_t  *state;
122431Sigor@sysoev.ru 
123964Sigor@sysoev.ru     nxt_str_t                       host;
1241007Salexander.borisov@nginx.com     nxt_str_t                       server_name;
125431Sigor@sysoev.ru     nxt_str_t                       target;
126431Sigor@sysoev.ru     nxt_str_t                       version;
127431Sigor@sysoev.ru     nxt_str_t                       *method;
128431Sigor@sysoev.ru     nxt_str_t                       *path;
129431Sigor@sysoev.ru     nxt_str_t                       *args;
130431Sigor@sysoev.ru 
1311061Sigor@sysoev.ru     nxt_array_t                     *arguments;  /* of nxt_http_name_value_t */
1321062Sigor@sysoev.ru     nxt_array_t                     *cookies;    /* of nxt_http_name_value_t */
133431Sigor@sysoev.ru     nxt_list_t                      *fields;
134431Sigor@sysoev.ru     nxt_http_field_t                *content_type;
135431Sigor@sysoev.ru     nxt_http_field_t                *content_length;
136431Sigor@sysoev.ru     nxt_http_field_t                *cookie;
137630Svbart@nginx.com     nxt_http_field_t                *referer;
138630Svbart@nginx.com     nxt_http_field_t                *user_agent;
139431Sigor@sysoev.ru     nxt_off_t                       content_length_n;
140431Sigor@sysoev.ru 
141431Sigor@sysoev.ru     nxt_sockaddr_t                  *remote;
142431Sigor@sysoev.ru     nxt_sockaddr_t                  *local;
1431011Smax.romanov@nginx.com     void                            *tls;
144431Sigor@sysoev.ru 
1451007Salexander.borisov@nginx.com     nxt_timer_t                     timer;
1461007Salexander.borisov@nginx.com     void                            *timer_data;
1471007Salexander.borisov@nginx.com 
148608Sigor@sysoev.ru     nxt_buf_t                       *last;
149608Sigor@sysoev.ru 
150431Sigor@sysoev.ru     nxt_http_response_t             resp;
151431Sigor@sysoev.ru 
152431Sigor@sysoev.ru     nxt_http_status_t               status:16;
153431Sigor@sysoev.ru 
154964Sigor@sysoev.ru     uint8_t                         pass_count;   /* 8 bits */
155*1112Sigor@sysoev.ru     nxt_http_protocol_t             protocol:8;   /* 2 bits */
156431Sigor@sysoev.ru     uint8_t                         logged;       /* 1 bit  */
157431Sigor@sysoev.ru     uint8_t                         header_sent;  /* 1 bit  */
158608Sigor@sysoev.ru     uint8_t                         error;        /* 1 bit  */
159431Sigor@sysoev.ru };
160431Sigor@sysoev.ru 
161431Sigor@sysoev.ru 
162964Sigor@sysoev.ru typedef struct nxt_http_route_s     nxt_http_route_t;
163964Sigor@sysoev.ru 
164964Sigor@sysoev.ru 
165964Sigor@sysoev.ru struct nxt_http_pass_s {
166964Sigor@sysoev.ru     nxt_http_pass_t                 *(*handler)(nxt_task_t *task,
167964Sigor@sysoev.ru                                         nxt_http_request_t *r,
168964Sigor@sysoev.ru                                         nxt_http_pass_t *pass);
169964Sigor@sysoev.ru     union {
170964Sigor@sysoev.ru         nxt_http_route_t            *route;
171964Sigor@sysoev.ru         nxt_app_t                   *application;
172964Sigor@sysoev.ru     } u;
173964Sigor@sysoev.ru 
174964Sigor@sysoev.ru     nxt_str_t                       name;
175964Sigor@sysoev.ru };
176964Sigor@sysoev.ru 
177964Sigor@sysoev.ru 
178*1112Sigor@sysoev.ru typedef struct {
179*1112Sigor@sysoev.ru     void (*body_read)(nxt_task_t *task, nxt_http_request_t *r);
180*1112Sigor@sysoev.ru     void (*local_addr)(nxt_task_t *task, nxt_http_request_t *r);
181*1112Sigor@sysoev.ru     void (*header_send)(nxt_task_t *task, nxt_http_request_t *r);
182*1112Sigor@sysoev.ru     void (*send)(nxt_task_t *task, nxt_http_request_t *r, nxt_buf_t *out);
183*1112Sigor@sysoev.ru     nxt_off_t (*body_bytes_sent)(nxt_task_t *task, nxt_http_proto_t proto);
184*1112Sigor@sysoev.ru     void (*discard)(nxt_task_t *task, nxt_http_request_t *r, nxt_buf_t *last);
185*1112Sigor@sysoev.ru     void (*close)(nxt_task_t *task, nxt_http_proto_t proto,
186*1112Sigor@sysoev.ru         nxt_socket_conf_joint_t *joint);
187*1112Sigor@sysoev.ru } nxt_http_proto_table_t;
188431Sigor@sysoev.ru 
189431Sigor@sysoev.ru 
190431Sigor@sysoev.ru nxt_int_t nxt_http_init(nxt_task_t *task, nxt_runtime_t *rt);
191431Sigor@sysoev.ru nxt_int_t nxt_h1p_init(nxt_task_t *task, nxt_runtime_t *rt);
192431Sigor@sysoev.ru nxt_int_t nxt_http_response_hash_init(nxt_task_t *task, nxt_runtime_t *rt);
193431Sigor@sysoev.ru 
194431Sigor@sysoev.ru void nxt_http_conn_init(nxt_task_t *task, void *obj, void *data);
195431Sigor@sysoev.ru nxt_http_request_t *nxt_http_request_create(nxt_task_t *task);
196431Sigor@sysoev.ru void nxt_http_request_error(nxt_task_t *task, nxt_http_request_t *r,
197431Sigor@sysoev.ru     nxt_http_status_t status);
198431Sigor@sysoev.ru void nxt_http_request_read_body(nxt_task_t *task, nxt_http_request_t *r);
199431Sigor@sysoev.ru void nxt_http_request_header_send(nxt_task_t *task, nxt_http_request_t *r);
200431Sigor@sysoev.ru void nxt_http_request_send(nxt_task_t *task, nxt_http_request_t *r,
201431Sigor@sysoev.ru     nxt_buf_t *out);
202608Sigor@sysoev.ru nxt_buf_t *nxt_http_buf_mem(nxt_task_t *task, nxt_http_request_t *r,
203608Sigor@sysoev.ru     size_t size);
204608Sigor@sysoev.ru nxt_buf_t *nxt_http_buf_last(nxt_http_request_t *r);
205608Sigor@sysoev.ru void nxt_http_request_error_handler(nxt_task_t *task, void *obj, void *data);
206431Sigor@sysoev.ru 
207431Sigor@sysoev.ru nxt_int_t nxt_http_request_host(void *ctx, nxt_http_field_t *field,
208431Sigor@sysoev.ru     uintptr_t data);
209431Sigor@sysoev.ru nxt_int_t nxt_http_request_field(void *ctx, nxt_http_field_t *field,
210431Sigor@sysoev.ru     uintptr_t offset);
211431Sigor@sysoev.ru nxt_int_t nxt_http_request_content_length(void *ctx, nxt_http_field_t *field,
212431Sigor@sysoev.ru     uintptr_t data);
213431Sigor@sysoev.ru 
214964Sigor@sysoev.ru nxt_http_routes_t *nxt_http_routes_create(nxt_task_t *task,
215964Sigor@sysoev.ru     nxt_router_temp_conf_t *tmcf, nxt_conf_value_t *routes_conf);
216964Sigor@sysoev.ru nxt_http_pass_t *nxt_http_pass_create(nxt_task_t *task,
217964Sigor@sysoev.ru     nxt_router_temp_conf_t *tmcf, nxt_str_t *name);
218964Sigor@sysoev.ru void nxt_http_routes_resolve(nxt_task_t *task, nxt_router_temp_conf_t *tmcf);
219964Sigor@sysoev.ru nxt_http_pass_t *nxt_http_pass_application(nxt_task_t *task,
220964Sigor@sysoev.ru     nxt_router_temp_conf_t *tmcf, nxt_str_t *name);
221964Sigor@sysoev.ru void nxt_http_routes_cleanup(nxt_task_t *task, nxt_http_routes_t *routes);
222964Sigor@sysoev.ru void nxt_http_pass_cleanup(nxt_task_t *task, nxt_http_pass_t *pass);
223964Sigor@sysoev.ru 
224964Sigor@sysoev.ru nxt_http_pass_t *nxt_http_request_application(nxt_task_t *task,
225964Sigor@sysoev.ru     nxt_http_request_t *r, nxt_http_pass_t *pass);
226431Sigor@sysoev.ru 
227740Sigor@sysoev.ru extern nxt_time_string_t  nxt_http_date_cache;
228740Sigor@sysoev.ru 
229431Sigor@sysoev.ru extern nxt_lvlhsh_t                        nxt_response_fields_hash;
230431Sigor@sysoev.ru 
231*1112Sigor@sysoev.ru extern const nxt_http_proto_table_t  nxt_http_proto[];
232431Sigor@sysoev.ru 
233431Sigor@sysoev.ru 
234431Sigor@sysoev.ru #endif  /* _NXT_HTTP_H_INCLUDED_ */
235