xref: /unit/src/nxt_http.h (revision 1061)
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 
49431Sigor@sysoev.ru typedef struct {
50431Sigor@sysoev.ru     nxt_work_handler_t              ready_handler;
51431Sigor@sysoev.ru     nxt_work_handler_t              error_handler;
52431Sigor@sysoev.ru } nxt_http_request_state_t;
53431Sigor@sysoev.ru 
54431Sigor@sysoev.ru 
55431Sigor@sysoev.ru typedef struct {
56431Sigor@sysoev.ru     nxt_http_request_parse_t        parser;
57431Sigor@sysoev.ru 
58431Sigor@sysoev.ru     uint8_t                         nbuffers;
59431Sigor@sysoev.ru     uint8_t                         keepalive;            /* 1 bit  */
60431Sigor@sysoev.ru     uint8_t                         chunked;              /* 1 bit  */
61431Sigor@sysoev.ru     nxt_http_te_t                   transfer_encoding:8;  /* 2 bits */
62431Sigor@sysoev.ru 
63630Svbart@nginx.com     uint32_t                        header_size;
64630Svbart@nginx.com 
65431Sigor@sysoev.ru     nxt_http_request_t              *request;
66452Sigor@sysoev.ru     nxt_buf_t                       *buffers;
67452Sigor@sysoev.ru     /*
68452Sigor@sysoev.ru      * All fields before the conn field will
69452Sigor@sysoev.ru      * be zeroed in a keep-alive connection.
70452Sigor@sysoev.ru      */
71431Sigor@sysoev.ru     nxt_conn_t                      *conn;
72431Sigor@sysoev.ru } nxt_h1proto_t;
73431Sigor@sysoev.ru 
74431Sigor@sysoev.ru 
75431Sigor@sysoev.ru typedef union {
76431Sigor@sysoev.ru     void                            *any;
77431Sigor@sysoev.ru     nxt_h1proto_t                   *h1;
78431Sigor@sysoev.ru } nxt_http_proto_t;
79431Sigor@sysoev.ru 
80431Sigor@sysoev.ru 
81431Sigor@sysoev.ru #define nxt_http_field_name_set(_field, _name)                                \
82431Sigor@sysoev.ru     do {                                                                      \
83703Svbart@nginx.com          (_field)->name_length = nxt_length(_name);                           \
84431Sigor@sysoev.ru          (_field)->name = (u_char *) _name;                                   \
85431Sigor@sysoev.ru     } while (0)
86431Sigor@sysoev.ru 
87431Sigor@sysoev.ru 
88431Sigor@sysoev.ru #define nxt_http_field_set(_field, _name, _value)                             \
89431Sigor@sysoev.ru     do {                                                                      \
90703Svbart@nginx.com          (_field)->name_length = nxt_length(_name);                           \
91703Svbart@nginx.com          (_field)->value_length = nxt_length(_value);                         \
92431Sigor@sysoev.ru          (_field)->name = (u_char *) _name;                                   \
93431Sigor@sysoev.ru          (_field)->value = (u_char *) _value;                                 \
94431Sigor@sysoev.ru     } while (0)
95431Sigor@sysoev.ru 
96431Sigor@sysoev.ru 
97431Sigor@sysoev.ru typedef struct {
98431Sigor@sysoev.ru     nxt_list_t                      *fields;
99543Svbart@nginx.com     nxt_http_field_t                *date;
100431Sigor@sysoev.ru     nxt_http_field_t                *content_type;
101431Sigor@sysoev.ru     nxt_http_field_t                *content_length;
102431Sigor@sysoev.ru     nxt_off_t                       content_length_n;
103431Sigor@sysoev.ru } nxt_http_response_t;
104431Sigor@sysoev.ru 
105431Sigor@sysoev.ru 
106431Sigor@sysoev.ru struct nxt_http_request_s {
107431Sigor@sysoev.ru     nxt_http_proto_t                proto;
108683Sigor@sysoev.ru     nxt_socket_conf_joint_t         *conf;
109431Sigor@sysoev.ru 
110431Sigor@sysoev.ru     nxt_mp_t                        *mem_pool;
111431Sigor@sysoev.ru 
112431Sigor@sysoev.ru     nxt_buf_t                       *body;
113431Sigor@sysoev.ru     nxt_buf_t                       *out;
114431Sigor@sysoev.ru     const nxt_http_request_state_t  *state;
115431Sigor@sysoev.ru 
116964Sigor@sysoev.ru     nxt_str_t                       host;
1171007Salexander.borisov@nginx.com     nxt_str_t                       server_name;
118431Sigor@sysoev.ru     nxt_str_t                       target;
119431Sigor@sysoev.ru     nxt_str_t                       version;
120431Sigor@sysoev.ru     nxt_str_t                       *method;
121431Sigor@sysoev.ru     nxt_str_t                       *path;
122431Sigor@sysoev.ru     nxt_str_t                       *args;
123431Sigor@sysoev.ru 
124*1061Sigor@sysoev.ru     nxt_array_t                     *arguments;  /* of nxt_http_name_value_t */
125431Sigor@sysoev.ru     nxt_list_t                      *fields;
126431Sigor@sysoev.ru     nxt_http_field_t                *content_type;
127431Sigor@sysoev.ru     nxt_http_field_t                *content_length;
128431Sigor@sysoev.ru     nxt_http_field_t                *cookie;
129630Svbart@nginx.com     nxt_http_field_t                *referer;
130630Svbart@nginx.com     nxt_http_field_t                *user_agent;
131431Sigor@sysoev.ru     nxt_off_t                       content_length_n;
132431Sigor@sysoev.ru 
133431Sigor@sysoev.ru     nxt_sockaddr_t                  *remote;
134431Sigor@sysoev.ru     nxt_sockaddr_t                  *local;
1351011Smax.romanov@nginx.com     void                            *tls;
136431Sigor@sysoev.ru 
1371007Salexander.borisov@nginx.com     nxt_timer_t                     timer;
1381007Salexander.borisov@nginx.com     void                            *timer_data;
1391007Salexander.borisov@nginx.com 
140608Sigor@sysoev.ru     nxt_buf_t                       *last;
141608Sigor@sysoev.ru 
142431Sigor@sysoev.ru     nxt_http_response_t             resp;
143431Sigor@sysoev.ru 
144431Sigor@sysoev.ru     nxt_http_status_t               status:16;
145431Sigor@sysoev.ru 
146964Sigor@sysoev.ru     uint8_t                         pass_count;   /* 8 bits */
147431Sigor@sysoev.ru     uint8_t                         protocol;     /* 2 bits */
148431Sigor@sysoev.ru     uint8_t                         logged;       /* 1 bit  */
149431Sigor@sysoev.ru     uint8_t                         header_sent;  /* 1 bit  */
150608Sigor@sysoev.ru     uint8_t                         error;        /* 1 bit  */
151431Sigor@sysoev.ru };
152431Sigor@sysoev.ru 
153431Sigor@sysoev.ru 
154964Sigor@sysoev.ru typedef struct nxt_http_route_s     nxt_http_route_t;
155964Sigor@sysoev.ru 
156964Sigor@sysoev.ru 
157964Sigor@sysoev.ru struct nxt_http_pass_s {
158964Sigor@sysoev.ru     nxt_http_pass_t                 *(*handler)(nxt_task_t *task,
159964Sigor@sysoev.ru                                         nxt_http_request_t *r,
160964Sigor@sysoev.ru                                         nxt_http_pass_t *pass);
161964Sigor@sysoev.ru     union {
162964Sigor@sysoev.ru         nxt_http_route_t            *route;
163964Sigor@sysoev.ru         nxt_app_t                   *application;
164964Sigor@sysoev.ru     } u;
165964Sigor@sysoev.ru 
166964Sigor@sysoev.ru     nxt_str_t                       name;
167964Sigor@sysoev.ru };
168964Sigor@sysoev.ru 
169964Sigor@sysoev.ru 
170431Sigor@sysoev.ru typedef void (*nxt_http_proto_body_read_t)(nxt_task_t *task,
171431Sigor@sysoev.ru     nxt_http_request_t *r);
172431Sigor@sysoev.ru typedef void (*nxt_http_proto_local_addr_t)(nxt_task_t *task,
173431Sigor@sysoev.ru     nxt_http_request_t *r);
1741011Smax.romanov@nginx.com typedef void (*nxt_http_proto_tls_t)(nxt_task_t *task, nxt_http_request_t *r);
175431Sigor@sysoev.ru typedef void (*nxt_http_proto_header_send_t)(nxt_task_t *task,
176431Sigor@sysoev.ru     nxt_http_request_t *r);
177431Sigor@sysoev.ru typedef void (*nxt_http_proto_send_t)(nxt_task_t *task, nxt_http_request_t *r,
178431Sigor@sysoev.ru     nxt_buf_t *out);
179630Svbart@nginx.com typedef nxt_off_t (*nxt_http_proto_body_bytes_sent_t)(nxt_task_t *task,
180630Svbart@nginx.com     nxt_http_proto_t proto);
181608Sigor@sysoev.ru typedef void (*nxt_http_proto_discard_t)(nxt_task_t *task,
182608Sigor@sysoev.ru     nxt_http_request_t *r, nxt_buf_t *last);
183431Sigor@sysoev.ru typedef void (*nxt_http_proto_close_t)(nxt_task_t *task,
184683Sigor@sysoev.ru     nxt_http_proto_t proto, nxt_socket_conf_joint_t *joint);
185431Sigor@sysoev.ru 
186431Sigor@sysoev.ru 
187431Sigor@sysoev.ru nxt_int_t nxt_http_init(nxt_task_t *task, nxt_runtime_t *rt);
188431Sigor@sysoev.ru nxt_int_t nxt_h1p_init(nxt_task_t *task, nxt_runtime_t *rt);
189431Sigor@sysoev.ru nxt_int_t nxt_http_response_hash_init(nxt_task_t *task, nxt_runtime_t *rt);
190431Sigor@sysoev.ru 
191431Sigor@sysoev.ru void nxt_http_conn_init(nxt_task_t *task, void *obj, void *data);
192431Sigor@sysoev.ru nxt_http_request_t *nxt_http_request_create(nxt_task_t *task);
193431Sigor@sysoev.ru void nxt_http_request_error(nxt_task_t *task, nxt_http_request_t *r,
194431Sigor@sysoev.ru     nxt_http_status_t status);
195431Sigor@sysoev.ru void nxt_http_request_read_body(nxt_task_t *task, nxt_http_request_t *r);
196431Sigor@sysoev.ru void nxt_http_request_header_send(nxt_task_t *task, nxt_http_request_t *r);
197431Sigor@sysoev.ru void nxt_http_request_send(nxt_task_t *task, nxt_http_request_t *r,
198431Sigor@sysoev.ru     nxt_buf_t *out);
199608Sigor@sysoev.ru nxt_buf_t *nxt_http_buf_mem(nxt_task_t *task, nxt_http_request_t *r,
200608Sigor@sysoev.ru     size_t size);
201608Sigor@sysoev.ru nxt_buf_t *nxt_http_buf_last(nxt_http_request_t *r);
202608Sigor@sysoev.ru void nxt_http_request_error_handler(nxt_task_t *task, void *obj, void *data);
203431Sigor@sysoev.ru 
204431Sigor@sysoev.ru nxt_int_t nxt_http_request_host(void *ctx, nxt_http_field_t *field,
205431Sigor@sysoev.ru     uintptr_t data);
206431Sigor@sysoev.ru nxt_int_t nxt_http_request_field(void *ctx, nxt_http_field_t *field,
207431Sigor@sysoev.ru     uintptr_t offset);
208431Sigor@sysoev.ru nxt_int_t nxt_http_request_content_length(void *ctx, nxt_http_field_t *field,
209431Sigor@sysoev.ru     uintptr_t data);
210431Sigor@sysoev.ru 
211964Sigor@sysoev.ru nxt_http_routes_t *nxt_http_routes_create(nxt_task_t *task,
212964Sigor@sysoev.ru     nxt_router_temp_conf_t *tmcf, nxt_conf_value_t *routes_conf);
213964Sigor@sysoev.ru nxt_http_pass_t *nxt_http_pass_create(nxt_task_t *task,
214964Sigor@sysoev.ru     nxt_router_temp_conf_t *tmcf, nxt_str_t *name);
215964Sigor@sysoev.ru void nxt_http_routes_resolve(nxt_task_t *task, nxt_router_temp_conf_t *tmcf);
216964Sigor@sysoev.ru nxt_http_pass_t *nxt_http_pass_application(nxt_task_t *task,
217964Sigor@sysoev.ru     nxt_router_temp_conf_t *tmcf, nxt_str_t *name);
218964Sigor@sysoev.ru void nxt_http_routes_cleanup(nxt_task_t *task, nxt_http_routes_t *routes);
219964Sigor@sysoev.ru void nxt_http_pass_cleanup(nxt_task_t *task, nxt_http_pass_t *pass);
220964Sigor@sysoev.ru 
221964Sigor@sysoev.ru nxt_http_pass_t *nxt_http_request_application(nxt_task_t *task,
222964Sigor@sysoev.ru     nxt_http_request_t *r, nxt_http_pass_t *pass);
223431Sigor@sysoev.ru 
224740Sigor@sysoev.ru extern nxt_time_string_t  nxt_http_date_cache;
225740Sigor@sysoev.ru 
226431Sigor@sysoev.ru extern nxt_lvlhsh_t                        nxt_response_fields_hash;
227431Sigor@sysoev.ru 
228630Svbart@nginx.com extern const nxt_http_proto_body_read_t        nxt_http_proto_body_read[];
229630Svbart@nginx.com extern const nxt_http_proto_local_addr_t       nxt_http_proto_local_addr[];
2301011Smax.romanov@nginx.com extern const nxt_http_proto_tls_t              nxt_http_proto_tls[];
231630Svbart@nginx.com extern const nxt_http_proto_header_send_t      nxt_http_proto_header_send[];
232630Svbart@nginx.com extern const nxt_http_proto_send_t             nxt_http_proto_send[];
233630Svbart@nginx.com extern const nxt_http_proto_body_bytes_sent_t  nxt_http_proto_body_bytes_sent[];
234630Svbart@nginx.com extern const nxt_http_proto_discard_t          nxt_http_proto_discard[];
235630Svbart@nginx.com extern const nxt_http_proto_close_t            nxt_http_proto_close[];
236431Sigor@sysoev.ru 
237431Sigor@sysoev.ru 
238431Sigor@sysoev.ru #endif  /* _NXT_HTTP_H_INCLUDED_ */
239