xref: /unit/src/nxt_application.h (revision 84)
10Sigor@sysoev.ru 
20Sigor@sysoev.ru /*
3*84Smax.romanov@nginx.com  * Copyright (C) Max Romanov
40Sigor@sysoev.ru  * Copyright (C) Valentin V. Bartenev
50Sigor@sysoev.ru  * Copyright (C) NGINX, Inc.
60Sigor@sysoev.ru  */
70Sigor@sysoev.ru 
80Sigor@sysoev.ru #ifndef _NXT_APPLICATION_H_INCLUDED_
90Sigor@sysoev.ru #define _NXT_APPLICATION_H_INCLUDED_
100Sigor@sysoev.ru 
110Sigor@sysoev.ru 
120Sigor@sysoev.ru typedef struct {
130Sigor@sysoev.ru     nxt_str_t                  name;
140Sigor@sysoev.ru     nxt_str_t                  value;
150Sigor@sysoev.ru } nxt_app_header_field_t;
160Sigor@sysoev.ru 
170Sigor@sysoev.ru 
180Sigor@sysoev.ru typedef struct {
190Sigor@sysoev.ru     nxt_str_t                  method;
200Sigor@sysoev.ru     nxt_str_t                  path;
21*84Smax.romanov@nginx.com     nxt_str_t                  path_no_query;
22*84Smax.romanov@nginx.com     nxt_str_t                  query;
230Sigor@sysoev.ru     nxt_str_t                  version;
24*84Smax.romanov@nginx.com 
25*84Smax.romanov@nginx.com     nxt_list_t                 *fields;
260Sigor@sysoev.ru 
27*84Smax.romanov@nginx.com     nxt_str_t                  cookie;
28*84Smax.romanov@nginx.com     nxt_str_t                  content_length;
29*84Smax.romanov@nginx.com     nxt_str_t                  content_type;
30*84Smax.romanov@nginx.com     nxt_str_t                  host;
31*84Smax.romanov@nginx.com 
32*84Smax.romanov@nginx.com     off_t                      parsed_content_length;
33*84Smax.romanov@nginx.com     nxt_bool_t                 done;
340Sigor@sysoev.ru } nxt_app_request_header_t;
350Sigor@sysoev.ru 
360Sigor@sysoev.ru 
370Sigor@sysoev.ru typedef struct {
38*84Smax.romanov@nginx.com     nxt_str_t                  preread;
39*84Smax.romanov@nginx.com     nxt_bool_t                 done;
40*84Smax.romanov@nginx.com } nxt_app_request_body_t;
410Sigor@sysoev.ru 
420Sigor@sysoev.ru 
43*84Smax.romanov@nginx.com typedef struct {
440Sigor@sysoev.ru     nxt_app_request_header_t   header;
45*84Smax.romanov@nginx.com     nxt_app_request_body_t     body;
460Sigor@sysoev.ru } nxt_app_request_t;
470Sigor@sysoev.ru 
480Sigor@sysoev.ru 
490Sigor@sysoev.ru typedef struct {
50*84Smax.romanov@nginx.com     nxt_app_request_t         r;
51*84Smax.romanov@nginx.com     nxt_http_request_parse_t  parser;
52*84Smax.romanov@nginx.com     nxt_mp_t                  *mem_pool;
53*84Smax.romanov@nginx.com } nxt_app_parse_ctx_t;
54*84Smax.romanov@nginx.com 
55*84Smax.romanov@nginx.com 
56*84Smax.romanov@nginx.com nxt_int_t nxt_app_http_req_init(nxt_task_t *task, nxt_app_parse_ctx_t *ctx);
57*84Smax.romanov@nginx.com 
58*84Smax.romanov@nginx.com nxt_int_t nxt_app_http_req_parse(nxt_task_t *task, nxt_app_parse_ctx_t *ctx,
59*84Smax.romanov@nginx.com     nxt_buf_t *buf);
60*84Smax.romanov@nginx.com 
61*84Smax.romanov@nginx.com nxt_int_t nxt_app_http_req_done(nxt_task_t *task, nxt_app_parse_ctx_t *ctx);
62*84Smax.romanov@nginx.com 
63*84Smax.romanov@nginx.com nxt_int_t nxt_app_http_init(nxt_task_t *task, nxt_runtime_t *rt);
64*84Smax.romanov@nginx.com 
65*84Smax.romanov@nginx.com 
66*84Smax.romanov@nginx.com typedef struct nxt_app_wmsg_s  nxt_app_wmsg_t;
67*84Smax.romanov@nginx.com typedef struct nxt_app_rmsg_s  nxt_app_rmsg_t;
68*84Smax.romanov@nginx.com 
69*84Smax.romanov@nginx.com struct nxt_app_wmsg_s {
70*84Smax.romanov@nginx.com     nxt_port_t                 *port;  /* where prepared buf will be sent */
71*84Smax.romanov@nginx.com     nxt_buf_t                  *write;
72*84Smax.romanov@nginx.com     nxt_buf_t                  **buf;
73*84Smax.romanov@nginx.com     uint32_t                   stream;
74*84Smax.romanov@nginx.com };
75*84Smax.romanov@nginx.com 
76*84Smax.romanov@nginx.com struct nxt_app_rmsg_s {
77*84Smax.romanov@nginx.com     nxt_buf_t                 *buf;   /* current buffer to read */
78*84Smax.romanov@nginx.com };
79*84Smax.romanov@nginx.com 
80*84Smax.romanov@nginx.com 
81*84Smax.romanov@nginx.com nxt_inline u_char *
82*84Smax.romanov@nginx.com nxt_app_msg_write_length(u_char *dst, size_t length);
83*84Smax.romanov@nginx.com 
84*84Smax.romanov@nginx.com /* TODO asynchronous mmap buffer assignment */
85*84Smax.romanov@nginx.com u_char *nxt_app_msg_write_get_buf(nxt_task_t *task, nxt_app_wmsg_t *msg,
86*84Smax.romanov@nginx.com     size_t size);
87*84Smax.romanov@nginx.com 
88*84Smax.romanov@nginx.com nxt_int_t nxt_app_msg_write(nxt_task_t *task, nxt_app_wmsg_t *msg,
89*84Smax.romanov@nginx.com     u_char *c, size_t size);
90*84Smax.romanov@nginx.com 
91*84Smax.romanov@nginx.com nxt_int_t nxt_app_msg_write_prefixed_upcase(nxt_task_t *task,
92*84Smax.romanov@nginx.com     nxt_app_wmsg_t *msg, const nxt_str_t *prefix, const nxt_str_t *v);
93*84Smax.romanov@nginx.com 
94*84Smax.romanov@nginx.com nxt_inline nxt_int_t
95*84Smax.romanov@nginx.com nxt_app_msg_write_nvp_(nxt_task_t *task, nxt_app_wmsg_t *msg,
96*84Smax.romanov@nginx.com     u_char *n, size_t nsize, u_char *v, size_t vsize);
97*84Smax.romanov@nginx.com 
98*84Smax.romanov@nginx.com 
99*84Smax.romanov@nginx.com #define nxt_app_msg_write_const(task, msg, c)                                 \
100*84Smax.romanov@nginx.com     nxt_app_msg_write((task), (msg), (u_char *)(c), sizeof(c) - 1)
101*84Smax.romanov@nginx.com 
102*84Smax.romanov@nginx.com #define nxt_app_msg_write_str(task, msg, str)                                 \
103*84Smax.romanov@nginx.com     nxt_app_msg_write((task), (msg), (str)->start, (str)->length)
104*84Smax.romanov@nginx.com 
105*84Smax.romanov@nginx.com #define nxt_app_msg_write_cstr(task, msg, c)                                  \
106*84Smax.romanov@nginx.com     nxt_app_msg_write((task), (msg), (c), nxt_strlen(c))
107*84Smax.romanov@nginx.com 
108*84Smax.romanov@nginx.com #define nxt_app_msg_write_nvp(task, msg, n, v)                                \
109*84Smax.romanov@nginx.com     nxt_app_msg_write_nvp_((task), (msg), (u_char *)(n), sizeof(n) - 1,       \
110*84Smax.romanov@nginx.com                            (v)->start, (v)->length)
111*84Smax.romanov@nginx.com 
112*84Smax.romanov@nginx.com nxt_inline nxt_int_t nxt_app_msg_write_size(nxt_task_t *task,
113*84Smax.romanov@nginx.com     nxt_app_wmsg_t *msg, size_t size);
114*84Smax.romanov@nginx.com 
115*84Smax.romanov@nginx.com nxt_int_t nxt_app_msg_flush(nxt_task_t *task, nxt_app_wmsg_t *msg,
116*84Smax.romanov@nginx.com     nxt_bool_t last);
117*84Smax.romanov@nginx.com 
118*84Smax.romanov@nginx.com nxt_int_t nxt_app_msg_write_raw(nxt_task_t *task, nxt_app_wmsg_t *msg,
119*84Smax.romanov@nginx.com     const u_char *c, size_t size);
120*84Smax.romanov@nginx.com 
121*84Smax.romanov@nginx.com nxt_int_t nxt_app_msg_read_str(nxt_task_t *task, nxt_app_rmsg_t *msg,
122*84Smax.romanov@nginx.com     nxt_str_t *str);
123*84Smax.romanov@nginx.com 
124*84Smax.romanov@nginx.com nxt_int_t nxt_app_msg_read_nvp(nxt_task_t *task, nxt_app_rmsg_t *rmsg,
125*84Smax.romanov@nginx.com     nxt_str_t *n, nxt_str_t *v);
126*84Smax.romanov@nginx.com 
127*84Smax.romanov@nginx.com nxt_int_t nxt_app_msg_read_size(nxt_task_t *task, nxt_app_rmsg_t *rmsg,
128*84Smax.romanov@nginx.com     size_t *size);
129*84Smax.romanov@nginx.com 
130*84Smax.romanov@nginx.com 
131*84Smax.romanov@nginx.com typedef struct {
132*84Smax.romanov@nginx.com     nxt_int_t                  (*init)(nxt_task_t *task);
133*84Smax.romanov@nginx.com     nxt_int_t                  (*prepare_msg)(nxt_task_t *task,
134*84Smax.romanov@nginx.com                                     nxt_app_request_t *r,
135*84Smax.romanov@nginx.com                                     nxt_app_wmsg_t *wmsg);
136*84Smax.romanov@nginx.com     nxt_int_t                  (*run)(nxt_task_t *task,
137*84Smax.romanov@nginx.com                                     nxt_app_rmsg_t *rmsg,
138*84Smax.romanov@nginx.com                                     nxt_app_wmsg_t *wmsg);
1390Sigor@sysoev.ru } nxt_application_module_t;
1400Sigor@sysoev.ru 
1410Sigor@sysoev.ru 
14221Sigor@sysoev.ru extern nxt_application_module_t  *nxt_app;
14321Sigor@sysoev.ru 
1440Sigor@sysoev.ru 
1450Sigor@sysoev.ru 
14620Sigor@sysoev.ru nxt_int_t nxt_app_http_read_body(nxt_app_request_t *r, u_char *data,
14720Sigor@sysoev.ru     size_t len);
1480Sigor@sysoev.ru nxt_int_t nxt_app_write(nxt_app_request_t *r, const u_char *data, size_t len);
1490Sigor@sysoev.ru 
150*84Smax.romanov@nginx.com nxt_inline u_char *
151*84Smax.romanov@nginx.com nxt_app_msg_write_length(u_char *dst, size_t length)
152*84Smax.romanov@nginx.com {
153*84Smax.romanov@nginx.com     if (length < 128) {
154*84Smax.romanov@nginx.com         *dst = length;
155*84Smax.romanov@nginx.com         dst++;
156*84Smax.romanov@nginx.com     } else {
157*84Smax.romanov@nginx.com         dst[0] = 0x80U | (length >> 24);
158*84Smax.romanov@nginx.com         dst[1] = 0xFFU & (length >> 16);
159*84Smax.romanov@nginx.com         dst[2] = 0xFFU & (length >> 8);
160*84Smax.romanov@nginx.com         dst[3] = 0xFFU & length;
161*84Smax.romanov@nginx.com         dst += 4;
162*84Smax.romanov@nginx.com     }
163*84Smax.romanov@nginx.com 
164*84Smax.romanov@nginx.com     return dst;
165*84Smax.romanov@nginx.com }
166*84Smax.romanov@nginx.com 
167*84Smax.romanov@nginx.com 
168*84Smax.romanov@nginx.com nxt_inline nxt_int_t
169*84Smax.romanov@nginx.com nxt_app_msg_write_nvp_(nxt_task_t *task, nxt_app_wmsg_t *msg,
170*84Smax.romanov@nginx.com     u_char *n, size_t nsize, u_char *v, size_t vsize)
171*84Smax.romanov@nginx.com {
172*84Smax.romanov@nginx.com     nxt_int_t rc;
173*84Smax.romanov@nginx.com 
174*84Smax.romanov@nginx.com     rc = nxt_app_msg_write(task, msg, n, nsize);
175*84Smax.romanov@nginx.com     if (nxt_slow_path(rc != NXT_OK)) {
176*84Smax.romanov@nginx.com         return rc;
177*84Smax.romanov@nginx.com     }
178*84Smax.romanov@nginx.com 
179*84Smax.romanov@nginx.com     return nxt_app_msg_write(task, msg, v, vsize);
180*84Smax.romanov@nginx.com }
181*84Smax.romanov@nginx.com 
182*84Smax.romanov@nginx.com 
183*84Smax.romanov@nginx.com nxt_inline nxt_int_t
184*84Smax.romanov@nginx.com nxt_app_msg_write_size(nxt_task_t *task, nxt_app_wmsg_t *msg, size_t size)
185*84Smax.romanov@nginx.com {
186*84Smax.romanov@nginx.com     u_char  *dst;
187*84Smax.romanov@nginx.com     size_t  dst_length;
188*84Smax.romanov@nginx.com 
189*84Smax.romanov@nginx.com     dst_length = size < 128 ? 1 : 4;
190*84Smax.romanov@nginx.com 
191*84Smax.romanov@nginx.com     dst = nxt_app_msg_write_get_buf(task, msg, dst_length);
192*84Smax.romanov@nginx.com     if (nxt_slow_path(dst == NULL)) {
193*84Smax.romanov@nginx.com         return NXT_ERROR;
194*84Smax.romanov@nginx.com     }
195*84Smax.romanov@nginx.com 
196*84Smax.romanov@nginx.com     nxt_app_msg_write_length(dst, size);
197*84Smax.romanov@nginx.com 
198*84Smax.romanov@nginx.com     return NXT_OK;
199*84Smax.romanov@nginx.com }
200*84Smax.romanov@nginx.com 
201*84Smax.romanov@nginx.com 
202*84Smax.romanov@nginx.com nxt_inline u_char *
203*84Smax.romanov@nginx.com nxt_app_msg_read_length(u_char *src, size_t *length)
204*84Smax.romanov@nginx.com {
205*84Smax.romanov@nginx.com     if (src[0] < 128) {
206*84Smax.romanov@nginx.com         *length = src[0];
207*84Smax.romanov@nginx.com         src++;
208*84Smax.romanov@nginx.com     } else {
209*84Smax.romanov@nginx.com         *length = ((src[0] & 0x7fU) << 24) +
210*84Smax.romanov@nginx.com                   (src[1] << 16) +
211*84Smax.romanov@nginx.com                   (src[2] << 8) +
212*84Smax.romanov@nginx.com                   src[3];
213*84Smax.romanov@nginx.com         src += 4;
214*84Smax.romanov@nginx.com     }
215*84Smax.romanov@nginx.com 
216*84Smax.romanov@nginx.com     return src;
217*84Smax.romanov@nginx.com }
218*84Smax.romanov@nginx.com 
2190Sigor@sysoev.ru 
2200Sigor@sysoev.ru #endif /* _NXT_APPLICATION_H_INCLIDED_ */
221