xref: /unit/src/nxt_http.h (revision 431)
1*431Sigor@sysoev.ru 
2*431Sigor@sysoev.ru /*
3*431Sigor@sysoev.ru  * Copyright (C) Igor Sysoev
4*431Sigor@sysoev.ru  * Copyright (C) NGINX, Inc.
5*431Sigor@sysoev.ru  */
6*431Sigor@sysoev.ru 
7*431Sigor@sysoev.ru #ifndef _NXT_HTTP_H_INCLUDED_
8*431Sigor@sysoev.ru #define _NXT_HTTP_H_INCLUDED_
9*431Sigor@sysoev.ru 
10*431Sigor@sysoev.ru 
11*431Sigor@sysoev.ru typedef enum {
12*431Sigor@sysoev.ru     NXT_HTTP_INVALID = 0,
13*431Sigor@sysoev.ru 
14*431Sigor@sysoev.ru     NXT_HTTP_OK = 200,
15*431Sigor@sysoev.ru 
16*431Sigor@sysoev.ru     NXT_HTTP_MULTIPLE_CHOICES = 300,
17*431Sigor@sysoev.ru     NXT_HTTP_MOVED_PERMANENTLY = 301,
18*431Sigor@sysoev.ru     NXT_HTTP_FOUND = 302,
19*431Sigor@sysoev.ru     NXT_HTTP_SEE_OTHER = 303,
20*431Sigor@sysoev.ru     NXT_HTTP_NOT_MODIFIED = 304,
21*431Sigor@sysoev.ru 
22*431Sigor@sysoev.ru     NXT_HTTP_BAD_REQUEST = 400,
23*431Sigor@sysoev.ru     NXT_HTTP_LENGTH_REQUIRED = 411,
24*431Sigor@sysoev.ru     NXT_HTTP_PAYLOAD_TOO_LARGE = 413,
25*431Sigor@sysoev.ru     NXT_HTTP_URI_TOO_LONG = 414,
26*431Sigor@sysoev.ru     NXT_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431,
27*431Sigor@sysoev.ru 
28*431Sigor@sysoev.ru     NXT_HTTP_INTERNAL_SERVER_ERROR = 500,
29*431Sigor@sysoev.ru     NXT_HTTP_NOT_IMPLEMENTED = 501,
30*431Sigor@sysoev.ru     NXT_HTTP_BAD_GATEWAY = 502,
31*431Sigor@sysoev.ru     NXT_HTTP_SERVICE_UNAVAILABLE = 503,
32*431Sigor@sysoev.ru     NXT_HTTP_GATEWAY_TIMEOUT = 504,
33*431Sigor@sysoev.ru } nxt_http_status_t;
34*431Sigor@sysoev.ru 
35*431Sigor@sysoev.ru 
36*431Sigor@sysoev.ru typedef enum {
37*431Sigor@sysoev.ru     NXT_HTTP_TE_NONE = 0,
38*431Sigor@sysoev.ru     NXT_HTTP_TE_CHUNKED = 1,
39*431Sigor@sysoev.ru     NXT_HTTP_TE_UNSUPPORTED = 2,
40*431Sigor@sysoev.ru } nxt_http_te_t;
41*431Sigor@sysoev.ru 
42*431Sigor@sysoev.ru 
43*431Sigor@sysoev.ru typedef struct {
44*431Sigor@sysoev.ru     nxt_work_handler_t              ready_handler;
45*431Sigor@sysoev.ru     nxt_work_handler_t              error_handler;
46*431Sigor@sysoev.ru } nxt_http_request_state_t;
47*431Sigor@sysoev.ru 
48*431Sigor@sysoev.ru 
49*431Sigor@sysoev.ru typedef struct nxt_http_request_s   nxt_http_request_t;
50*431Sigor@sysoev.ru 
51*431Sigor@sysoev.ru 
52*431Sigor@sysoev.ru typedef struct {
53*431Sigor@sysoev.ru     nxt_http_request_parse_t        parser;
54*431Sigor@sysoev.ru 
55*431Sigor@sysoev.ru     uint8_t                         nbuffers;
56*431Sigor@sysoev.ru     uint8_t                         keepalive;            /* 1 bit  */
57*431Sigor@sysoev.ru     uint8_t                         chunked;              /* 1 bit  */
58*431Sigor@sysoev.ru     nxt_http_te_t                   transfer_encoding:8;  /* 2 bits */
59*431Sigor@sysoev.ru 
60*431Sigor@sysoev.ru     nxt_http_request_t              *request;
61*431Sigor@sysoev.ru     nxt_conn_t                      *conn;
62*431Sigor@sysoev.ru     nxt_buf_t                       *buffers;
63*431Sigor@sysoev.ru } nxt_h1proto_t;
64*431Sigor@sysoev.ru 
65*431Sigor@sysoev.ru 
66*431Sigor@sysoev.ru typedef union {
67*431Sigor@sysoev.ru     void                            *any;
68*431Sigor@sysoev.ru     nxt_h1proto_t                   *h1;
69*431Sigor@sysoev.ru } nxt_http_proto_t;
70*431Sigor@sysoev.ru 
71*431Sigor@sysoev.ru 
72*431Sigor@sysoev.ru #define nxt_http_field_name_set(_field, _name)                                \
73*431Sigor@sysoev.ru     do {                                                                      \
74*431Sigor@sysoev.ru          (_field)->name_length = sizeof(_name) - 1;                           \
75*431Sigor@sysoev.ru          (_field)->name = (u_char *) _name;                                   \
76*431Sigor@sysoev.ru     } while (0)
77*431Sigor@sysoev.ru 
78*431Sigor@sysoev.ru 
79*431Sigor@sysoev.ru #define nxt_http_field_set(_field, _name, _value)                             \
80*431Sigor@sysoev.ru     do {                                                                      \
81*431Sigor@sysoev.ru          (_field)->name_length = sizeof(_name) - 1;                           \
82*431Sigor@sysoev.ru          (_field)->value_length = sizeof(_value) - 1;                         \
83*431Sigor@sysoev.ru          (_field)->name = (u_char *) _name;                                   \
84*431Sigor@sysoev.ru          (_field)->value = (u_char *) _value;                                 \
85*431Sigor@sysoev.ru     } while (0)
86*431Sigor@sysoev.ru 
87*431Sigor@sysoev.ru 
88*431Sigor@sysoev.ru typedef struct {
89*431Sigor@sysoev.ru     nxt_list_t                      *fields;
90*431Sigor@sysoev.ru     nxt_http_field_t                *content_type;
91*431Sigor@sysoev.ru     nxt_http_field_t                *content_length;
92*431Sigor@sysoev.ru     nxt_off_t                       content_length_n;
93*431Sigor@sysoev.ru } nxt_http_response_t;
94*431Sigor@sysoev.ru 
95*431Sigor@sysoev.ru 
96*431Sigor@sysoev.ru struct nxt_http_request_s {
97*431Sigor@sysoev.ru     nxt_http_proto_t                proto;
98*431Sigor@sysoev.ru     nxt_socket_conf_t               *socket_conf;
99*431Sigor@sysoev.ru 
100*431Sigor@sysoev.ru     nxt_mp_t                        *mem_pool;
101*431Sigor@sysoev.ru 
102*431Sigor@sysoev.ru     nxt_buf_t                       *body;
103*431Sigor@sysoev.ru     nxt_buf_t                       *out;
104*431Sigor@sysoev.ru     const nxt_http_request_state_t  *state;
105*431Sigor@sysoev.ru 
106*431Sigor@sysoev.ru     nxt_str_t                       target;
107*431Sigor@sysoev.ru     nxt_str_t                       version;
108*431Sigor@sysoev.ru     nxt_str_t                       *method;
109*431Sigor@sysoev.ru     nxt_str_t                       *path;
110*431Sigor@sysoev.ru     nxt_str_t                       *args;
111*431Sigor@sysoev.ru 
112*431Sigor@sysoev.ru     nxt_list_t                      *fields;
113*431Sigor@sysoev.ru     nxt_http_field_t                *host;
114*431Sigor@sysoev.ru     nxt_http_field_t                *content_type;
115*431Sigor@sysoev.ru     nxt_http_field_t                *content_length;
116*431Sigor@sysoev.ru     nxt_http_field_t                *cookie;
117*431Sigor@sysoev.ru     nxt_off_t                       content_length_n;
118*431Sigor@sysoev.ru     nxt_off_t                       rest_length;
119*431Sigor@sysoev.ru 
120*431Sigor@sysoev.ru     nxt_sockaddr_t                  *remote;
121*431Sigor@sysoev.ru     nxt_sockaddr_t                  *local;
122*431Sigor@sysoev.ru 
123*431Sigor@sysoev.ru     nxt_http_response_t             resp;
124*431Sigor@sysoev.ru 
125*431Sigor@sysoev.ru     nxt_http_status_t               status:16;
126*431Sigor@sysoev.ru 
127*431Sigor@sysoev.ru     uint8_t                         protocol;     /* 2 bits */
128*431Sigor@sysoev.ru     uint8_t                         logged;       /* 1 bit  */
129*431Sigor@sysoev.ru     uint8_t                         header_sent;  /* 1 bit  */
130*431Sigor@sysoev.ru };
131*431Sigor@sysoev.ru 
132*431Sigor@sysoev.ru 
133*431Sigor@sysoev.ru typedef void (*nxt_http_proto_body_read_t)(nxt_task_t *task,
134*431Sigor@sysoev.ru     nxt_http_request_t *r);
135*431Sigor@sysoev.ru typedef void (*nxt_http_proto_local_addr_t)(nxt_task_t *task,
136*431Sigor@sysoev.ru     nxt_http_request_t *r);
137*431Sigor@sysoev.ru typedef void (*nxt_http_proto_header_send_t)(nxt_task_t *task,
138*431Sigor@sysoev.ru     nxt_http_request_t *r);
139*431Sigor@sysoev.ru typedef void (*nxt_http_proto_send_t)(nxt_task_t *task, nxt_http_request_t *r,
140*431Sigor@sysoev.ru     nxt_buf_t *out);
141*431Sigor@sysoev.ru typedef void (*nxt_http_proto_close_t)(nxt_task_t *task,
142*431Sigor@sysoev.ru     nxt_http_proto_t proto);
143*431Sigor@sysoev.ru 
144*431Sigor@sysoev.ru 
145*431Sigor@sysoev.ru nxt_int_t nxt_http_init(nxt_task_t *task, nxt_runtime_t *rt);
146*431Sigor@sysoev.ru nxt_int_t nxt_h1p_init(nxt_task_t *task, nxt_runtime_t *rt);
147*431Sigor@sysoev.ru nxt_int_t nxt_http_response_hash_init(nxt_task_t *task, nxt_runtime_t *rt);
148*431Sigor@sysoev.ru 
149*431Sigor@sysoev.ru void nxt_http_conn_init(nxt_task_t *task, void *obj, void *data);
150*431Sigor@sysoev.ru nxt_http_request_t *nxt_http_request_create(nxt_task_t *task);
151*431Sigor@sysoev.ru void nxt_http_request_error(nxt_task_t *task, nxt_http_request_t *r,
152*431Sigor@sysoev.ru     nxt_http_status_t status);
153*431Sigor@sysoev.ru void nxt_http_request_read_body(nxt_task_t *task, nxt_http_request_t *r);
154*431Sigor@sysoev.ru void nxt_http_request_local_addr(nxt_task_t *task, nxt_http_request_t *r);
155*431Sigor@sysoev.ru void nxt_http_request_header_send(nxt_task_t *task, nxt_http_request_t *r);
156*431Sigor@sysoev.ru void nxt_http_request_send(nxt_task_t *task, nxt_http_request_t *r,
157*431Sigor@sysoev.ru     nxt_buf_t *out);
158*431Sigor@sysoev.ru void nxt_http_request_release(nxt_task_t *task, nxt_http_request_t *r);
159*431Sigor@sysoev.ru nxt_buf_t *nxt_http_request_last_buffer(nxt_task_t *task,
160*431Sigor@sysoev.ru     nxt_http_request_t *r);
161*431Sigor@sysoev.ru void nxt_http_request_close_handler(nxt_task_t *task, void *obj, void *data);
162*431Sigor@sysoev.ru 
163*431Sigor@sysoev.ru nxt_int_t nxt_http_request_host(void *ctx, nxt_http_field_t *field,
164*431Sigor@sysoev.ru     uintptr_t data);
165*431Sigor@sysoev.ru nxt_int_t nxt_http_request_field(void *ctx, nxt_http_field_t *field,
166*431Sigor@sysoev.ru     uintptr_t offset);
167*431Sigor@sysoev.ru nxt_int_t nxt_http_request_content_length(void *ctx, nxt_http_field_t *field,
168*431Sigor@sysoev.ru     uintptr_t data);
169*431Sigor@sysoev.ru 
170*431Sigor@sysoev.ru 
171*431Sigor@sysoev.ru extern nxt_lvlhsh_t                        nxt_response_fields_hash;
172*431Sigor@sysoev.ru extern const nxt_conn_state_t              nxt_router_conn_close_state;
173*431Sigor@sysoev.ru 
174*431Sigor@sysoev.ru extern const nxt_http_proto_body_read_t    nxt_http_proto_body_read[];
175*431Sigor@sysoev.ru extern const nxt_http_proto_local_addr_t   nxt_http_proto_local_addr[];
176*431Sigor@sysoev.ru extern const nxt_http_proto_header_send_t  nxt_http_proto_header_send[];
177*431Sigor@sysoev.ru extern const nxt_http_proto_send_t         nxt_http_proto_send[];
178*431Sigor@sysoev.ru extern const nxt_http_proto_close_t        nxt_http_proto_close[];
179*431Sigor@sysoev.ru 
180*431Sigor@sysoev.ru 
181*431Sigor@sysoev.ru #endif  /* _NXT_HTTP_H_INCLUDED_ */
182