xref: /unit/src/nxt_http.h (revision 630)
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,
15431Sigor@sysoev.ru 
16431Sigor@sysoev.ru     NXT_HTTP_MULTIPLE_CHOICES = 300,
17431Sigor@sysoev.ru     NXT_HTTP_MOVED_PERMANENTLY = 301,
18431Sigor@sysoev.ru     NXT_HTTP_FOUND = 302,
19431Sigor@sysoev.ru     NXT_HTTP_SEE_OTHER = 303,
20431Sigor@sysoev.ru     NXT_HTTP_NOT_MODIFIED = 304,
21431Sigor@sysoev.ru 
22431Sigor@sysoev.ru     NXT_HTTP_BAD_REQUEST = 400,
23624Sigor@sysoev.ru     NXT_HTTP_REQUEST_TIMEOUT = 408,
24431Sigor@sysoev.ru     NXT_HTTP_LENGTH_REQUIRED = 411,
25431Sigor@sysoev.ru     NXT_HTTP_PAYLOAD_TOO_LARGE = 413,
26431Sigor@sysoev.ru     NXT_HTTP_URI_TOO_LONG = 414,
27431Sigor@sysoev.ru     NXT_HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431,
28431Sigor@sysoev.ru 
29431Sigor@sysoev.ru     NXT_HTTP_INTERNAL_SERVER_ERROR = 500,
30431Sigor@sysoev.ru     NXT_HTTP_NOT_IMPLEMENTED = 501,
31431Sigor@sysoev.ru     NXT_HTTP_BAD_GATEWAY = 502,
32431Sigor@sysoev.ru     NXT_HTTP_SERVICE_UNAVAILABLE = 503,
33431Sigor@sysoev.ru     NXT_HTTP_GATEWAY_TIMEOUT = 504,
34482Svbart@nginx.com     NXT_HTTP_VERSION_NOT_SUPPORTED = 505,
35431Sigor@sysoev.ru } nxt_http_status_t;
36431Sigor@sysoev.ru 
37431Sigor@sysoev.ru 
38431Sigor@sysoev.ru typedef enum {
39431Sigor@sysoev.ru     NXT_HTTP_TE_NONE = 0,
40431Sigor@sysoev.ru     NXT_HTTP_TE_CHUNKED = 1,
41431Sigor@sysoev.ru     NXT_HTTP_TE_UNSUPPORTED = 2,
42431Sigor@sysoev.ru } nxt_http_te_t;
43431Sigor@sysoev.ru 
44431Sigor@sysoev.ru 
45431Sigor@sysoev.ru typedef struct {
46431Sigor@sysoev.ru     nxt_work_handler_t              ready_handler;
47431Sigor@sysoev.ru     nxt_work_handler_t              error_handler;
48431Sigor@sysoev.ru } nxt_http_request_state_t;
49431Sigor@sysoev.ru 
50431Sigor@sysoev.ru 
51431Sigor@sysoev.ru typedef struct {
52431Sigor@sysoev.ru     nxt_http_request_parse_t        parser;
53431Sigor@sysoev.ru 
54431Sigor@sysoev.ru     uint8_t                         nbuffers;
55431Sigor@sysoev.ru     uint8_t                         keepalive;            /* 1 bit  */
56431Sigor@sysoev.ru     uint8_t                         chunked;              /* 1 bit  */
57431Sigor@sysoev.ru     nxt_http_te_t                   transfer_encoding:8;  /* 2 bits */
58431Sigor@sysoev.ru 
59*630Svbart@nginx.com     uint32_t                        header_size;
60*630Svbart@nginx.com 
61431Sigor@sysoev.ru     nxt_http_request_t              *request;
62452Sigor@sysoev.ru     nxt_buf_t                       *buffers;
63452Sigor@sysoev.ru     /*
64452Sigor@sysoev.ru      * All fields before the conn field will
65452Sigor@sysoev.ru      * be zeroed in a keep-alive connection.
66452Sigor@sysoev.ru      */
67431Sigor@sysoev.ru     nxt_conn_t                      *conn;
68431Sigor@sysoev.ru } nxt_h1proto_t;
69431Sigor@sysoev.ru 
70431Sigor@sysoev.ru 
71431Sigor@sysoev.ru typedef union {
72431Sigor@sysoev.ru     void                            *any;
73431Sigor@sysoev.ru     nxt_h1proto_t                   *h1;
74431Sigor@sysoev.ru } nxt_http_proto_t;
75431Sigor@sysoev.ru 
76431Sigor@sysoev.ru 
77431Sigor@sysoev.ru #define nxt_http_field_name_set(_field, _name)                                \
78431Sigor@sysoev.ru     do {                                                                      \
79431Sigor@sysoev.ru          (_field)->name_length = sizeof(_name) - 1;                           \
80431Sigor@sysoev.ru          (_field)->name = (u_char *) _name;                                   \
81431Sigor@sysoev.ru     } while (0)
82431Sigor@sysoev.ru 
83431Sigor@sysoev.ru 
84431Sigor@sysoev.ru #define nxt_http_field_set(_field, _name, _value)                             \
85431Sigor@sysoev.ru     do {                                                                      \
86431Sigor@sysoev.ru          (_field)->name_length = sizeof(_name) - 1;                           \
87431Sigor@sysoev.ru          (_field)->value_length = sizeof(_value) - 1;                         \
88431Sigor@sysoev.ru          (_field)->name = (u_char *) _name;                                   \
89431Sigor@sysoev.ru          (_field)->value = (u_char *) _value;                                 \
90431Sigor@sysoev.ru     } while (0)
91431Sigor@sysoev.ru 
92431Sigor@sysoev.ru 
93431Sigor@sysoev.ru typedef struct {
94431Sigor@sysoev.ru     nxt_list_t                      *fields;
95543Svbart@nginx.com     nxt_http_field_t                *date;
96431Sigor@sysoev.ru     nxt_http_field_t                *content_type;
97431Sigor@sysoev.ru     nxt_http_field_t                *content_length;
98431Sigor@sysoev.ru     nxt_off_t                       content_length_n;
99431Sigor@sysoev.ru } nxt_http_response_t;
100431Sigor@sysoev.ru 
101431Sigor@sysoev.ru 
102431Sigor@sysoev.ru struct nxt_http_request_s {
103431Sigor@sysoev.ru     nxt_http_proto_t                proto;
104431Sigor@sysoev.ru     nxt_socket_conf_t               *socket_conf;
105431Sigor@sysoev.ru 
106431Sigor@sysoev.ru     nxt_mp_t                        *mem_pool;
107431Sigor@sysoev.ru 
108431Sigor@sysoev.ru     nxt_buf_t                       *body;
109431Sigor@sysoev.ru     nxt_buf_t                       *out;
110431Sigor@sysoev.ru     const nxt_http_request_state_t  *state;
111431Sigor@sysoev.ru 
112431Sigor@sysoev.ru     nxt_str_t                       target;
113431Sigor@sysoev.ru     nxt_str_t                       version;
114431Sigor@sysoev.ru     nxt_str_t                       *method;
115431Sigor@sysoev.ru     nxt_str_t                       *path;
116431Sigor@sysoev.ru     nxt_str_t                       *args;
117431Sigor@sysoev.ru 
118431Sigor@sysoev.ru     nxt_list_t                      *fields;
119431Sigor@sysoev.ru     nxt_http_field_t                *host;
120431Sigor@sysoev.ru     nxt_http_field_t                *content_type;
121431Sigor@sysoev.ru     nxt_http_field_t                *content_length;
122431Sigor@sysoev.ru     nxt_http_field_t                *cookie;
123*630Svbart@nginx.com     nxt_http_field_t                *referer;
124*630Svbart@nginx.com     nxt_http_field_t                *user_agent;
125431Sigor@sysoev.ru     nxt_off_t                       content_length_n;
126431Sigor@sysoev.ru 
127431Sigor@sysoev.ru     nxt_sockaddr_t                  *remote;
128431Sigor@sysoev.ru     nxt_sockaddr_t                  *local;
129431Sigor@sysoev.ru 
130608Sigor@sysoev.ru     nxt_buf_t                       *last;
131608Sigor@sysoev.ru 
132431Sigor@sysoev.ru     nxt_http_response_t             resp;
133431Sigor@sysoev.ru 
134431Sigor@sysoev.ru     nxt_http_status_t               status:16;
135431Sigor@sysoev.ru 
136431Sigor@sysoev.ru     uint8_t                         protocol;     /* 2 bits */
137431Sigor@sysoev.ru     uint8_t                         logged;       /* 1 bit  */
138431Sigor@sysoev.ru     uint8_t                         header_sent;  /* 1 bit  */
139608Sigor@sysoev.ru     uint8_t                         error;        /* 1 bit  */
140431Sigor@sysoev.ru };
141431Sigor@sysoev.ru 
142431Sigor@sysoev.ru 
143431Sigor@sysoev.ru typedef void (*nxt_http_proto_body_read_t)(nxt_task_t *task,
144431Sigor@sysoev.ru     nxt_http_request_t *r);
145431Sigor@sysoev.ru typedef void (*nxt_http_proto_local_addr_t)(nxt_task_t *task,
146431Sigor@sysoev.ru     nxt_http_request_t *r);
147431Sigor@sysoev.ru typedef void (*nxt_http_proto_header_send_t)(nxt_task_t *task,
148431Sigor@sysoev.ru     nxt_http_request_t *r);
149431Sigor@sysoev.ru typedef void (*nxt_http_proto_send_t)(nxt_task_t *task, nxt_http_request_t *r,
150431Sigor@sysoev.ru     nxt_buf_t *out);
151*630Svbart@nginx.com typedef nxt_off_t (*nxt_http_proto_body_bytes_sent_t)(nxt_task_t *task,
152*630Svbart@nginx.com     nxt_http_proto_t proto);
153608Sigor@sysoev.ru typedef void (*nxt_http_proto_discard_t)(nxt_task_t *task,
154608Sigor@sysoev.ru     nxt_http_request_t *r, nxt_buf_t *last);
155431Sigor@sysoev.ru typedef void (*nxt_http_proto_close_t)(nxt_task_t *task,
156431Sigor@sysoev.ru     nxt_http_proto_t proto);
157431Sigor@sysoev.ru 
158431Sigor@sysoev.ru 
159431Sigor@sysoev.ru nxt_int_t nxt_http_init(nxt_task_t *task, nxt_runtime_t *rt);
160431Sigor@sysoev.ru nxt_int_t nxt_h1p_init(nxt_task_t *task, nxt_runtime_t *rt);
161431Sigor@sysoev.ru nxt_int_t nxt_http_response_hash_init(nxt_task_t *task, nxt_runtime_t *rt);
162431Sigor@sysoev.ru 
163431Sigor@sysoev.ru void nxt_http_conn_init(nxt_task_t *task, void *obj, void *data);
164431Sigor@sysoev.ru nxt_http_request_t *nxt_http_request_create(nxt_task_t *task);
165431Sigor@sysoev.ru void nxt_http_request_error(nxt_task_t *task, nxt_http_request_t *r,
166431Sigor@sysoev.ru     nxt_http_status_t status);
167431Sigor@sysoev.ru void nxt_http_request_read_body(nxt_task_t *task, nxt_http_request_t *r);
168431Sigor@sysoev.ru void nxt_http_request_local_addr(nxt_task_t *task, nxt_http_request_t *r);
169431Sigor@sysoev.ru void nxt_http_request_header_send(nxt_task_t *task, nxt_http_request_t *r);
170431Sigor@sysoev.ru void nxt_http_request_send(nxt_task_t *task, nxt_http_request_t *r,
171431Sigor@sysoev.ru     nxt_buf_t *out);
172608Sigor@sysoev.ru nxt_buf_t *nxt_http_buf_mem(nxt_task_t *task, nxt_http_request_t *r,
173608Sigor@sysoev.ru     size_t size);
174608Sigor@sysoev.ru nxt_buf_t *nxt_http_buf_last(nxt_http_request_t *r);
175608Sigor@sysoev.ru void nxt_http_request_error_handler(nxt_task_t *task, void *obj, void *data);
176431Sigor@sysoev.ru void nxt_http_request_close_handler(nxt_task_t *task, void *obj, void *data);
177431Sigor@sysoev.ru 
178431Sigor@sysoev.ru nxt_int_t nxt_http_request_host(void *ctx, nxt_http_field_t *field,
179431Sigor@sysoev.ru     uintptr_t data);
180431Sigor@sysoev.ru nxt_int_t nxt_http_request_field(void *ctx, nxt_http_field_t *field,
181431Sigor@sysoev.ru     uintptr_t offset);
182431Sigor@sysoev.ru nxt_int_t nxt_http_request_content_length(void *ctx, nxt_http_field_t *field,
183431Sigor@sysoev.ru     uintptr_t data);
184431Sigor@sysoev.ru 
185431Sigor@sysoev.ru 
186431Sigor@sysoev.ru extern nxt_lvlhsh_t                        nxt_response_fields_hash;
187431Sigor@sysoev.ru extern const nxt_conn_state_t              nxt_router_conn_close_state;
188431Sigor@sysoev.ru 
189*630Svbart@nginx.com extern const nxt_http_proto_body_read_t        nxt_http_proto_body_read[];
190*630Svbart@nginx.com extern const nxt_http_proto_local_addr_t       nxt_http_proto_local_addr[];
191*630Svbart@nginx.com extern const nxt_http_proto_header_send_t      nxt_http_proto_header_send[];
192*630Svbart@nginx.com extern const nxt_http_proto_send_t             nxt_http_proto_send[];
193*630Svbart@nginx.com extern const nxt_http_proto_body_bytes_sent_t  nxt_http_proto_body_bytes_sent[];
194*630Svbart@nginx.com extern const nxt_http_proto_discard_t          nxt_http_proto_discard[];
195*630Svbart@nginx.com extern const nxt_http_proto_close_t            nxt_http_proto_close[];
196431Sigor@sysoev.ru 
197431Sigor@sysoev.ru 
198431Sigor@sysoev.ru #endif  /* _NXT_HTTP_H_INCLUDED_ */
199