xref: /unit/src/nxt_application.h (revision 277)
10Sigor@sysoev.ru 
20Sigor@sysoev.ru /*
384Smax.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 
12133Sigor@sysoev.ru typedef enum {
13141Smax.romanov@nginx.com     NXT_APP_PYTHON,
14133Sigor@sysoev.ru     NXT_APP_PHP,
15133Sigor@sysoev.ru     NXT_APP_GO,
16141Smax.romanov@nginx.com 
17216Sigor@sysoev.ru     NXT_APP_UNKNOWN,
18133Sigor@sysoev.ru } nxt_app_type_t;
19133Sigor@sysoev.ru 
20133Sigor@sysoev.ru 
21216Sigor@sysoev.ru typedef struct nxt_app_module_s  nxt_application_module_t;
22216Sigor@sysoev.ru typedef struct nxt_app_module_s  nxt_app_module_t;
23216Sigor@sysoev.ru 
24216Sigor@sysoev.ru 
25216Sigor@sysoev.ru typedef struct {
26216Sigor@sysoev.ru     nxt_str_t                 type;
27216Sigor@sysoev.ru     nxt_str_t                 version;
28216Sigor@sysoev.ru     char                      *file;
29216Sigor@sysoev.ru     nxt_application_module_t  *module;
30216Sigor@sysoev.ru } nxt_app_lang_module_t;
31216Sigor@sysoev.ru 
32216Sigor@sysoev.ru 
33141Smax.romanov@nginx.com typedef struct nxt_common_app_conf_s nxt_common_app_conf_t;
34141Smax.romanov@nginx.com 
35141Smax.romanov@nginx.com 
36141Smax.romanov@nginx.com typedef struct {
37141Smax.romanov@nginx.com     nxt_str_t  path;
38141Smax.romanov@nginx.com     nxt_str_t  module;
39141Smax.romanov@nginx.com } nxt_python_app_conf_t;
40141Smax.romanov@nginx.com 
41141Smax.romanov@nginx.com 
42141Smax.romanov@nginx.com typedef struct {
43141Smax.romanov@nginx.com     nxt_str_t  root;
44141Smax.romanov@nginx.com     nxt_str_t  script;
45141Smax.romanov@nginx.com     nxt_str_t  index;
46141Smax.romanov@nginx.com } nxt_php_app_conf_t;
47141Smax.romanov@nginx.com 
48141Smax.romanov@nginx.com 
49141Smax.romanov@nginx.com typedef struct {
50272Smax.romanov@nginx.com     char       *executable;
51141Smax.romanov@nginx.com } nxt_go_app_conf_t;
52141Smax.romanov@nginx.com 
53141Smax.romanov@nginx.com 
54141Smax.romanov@nginx.com struct nxt_common_app_conf_s {
55174Sigor@sysoev.ru     nxt_str_t       name;
56141Smax.romanov@nginx.com     nxt_str_t       type;
57141Smax.romanov@nginx.com     nxt_str_t       user;
58141Smax.romanov@nginx.com     nxt_str_t       group;
59141Smax.romanov@nginx.com 
60271Smax.romanov@nginx.com     char       *working_directory;
61271Smax.romanov@nginx.com 
62141Smax.romanov@nginx.com     uint32_t   workers;
63141Smax.romanov@nginx.com 
64141Smax.romanov@nginx.com     union {
65141Smax.romanov@nginx.com         nxt_python_app_conf_t  python;
66141Smax.romanov@nginx.com         nxt_php_app_conf_t     php;
67141Smax.romanov@nginx.com         nxt_go_app_conf_t      go;
68141Smax.romanov@nginx.com     } u;
69141Smax.romanov@nginx.com };
70141Smax.romanov@nginx.com 
71141Smax.romanov@nginx.com 
720Sigor@sysoev.ru typedef struct {
730Sigor@sysoev.ru     nxt_str_t                  name;
740Sigor@sysoev.ru     nxt_str_t                  value;
750Sigor@sysoev.ru } nxt_app_header_field_t;
760Sigor@sysoev.ru 
770Sigor@sysoev.ru 
780Sigor@sysoev.ru typedef struct {
790Sigor@sysoev.ru     nxt_str_t                  method;
80112Smax.romanov@nginx.com     nxt_str_t                  target;
81112Smax.romanov@nginx.com     nxt_str_t                  version;
820Sigor@sysoev.ru     nxt_str_t                  path;
8384Smax.romanov@nginx.com     nxt_str_t                  query;
8484Smax.romanov@nginx.com 
8584Smax.romanov@nginx.com     nxt_list_t                 *fields;
860Sigor@sysoev.ru 
8784Smax.romanov@nginx.com     nxt_str_t                  cookie;
8884Smax.romanov@nginx.com     nxt_str_t                  content_length;
8984Smax.romanov@nginx.com     nxt_str_t                  content_type;
9084Smax.romanov@nginx.com     nxt_str_t                  host;
9184Smax.romanov@nginx.com 
9284Smax.romanov@nginx.com     off_t                      parsed_content_length;
9384Smax.romanov@nginx.com     nxt_bool_t                 done;
94206Smax.romanov@nginx.com 
95206Smax.romanov@nginx.com     size_t                     bufs;
96206Smax.romanov@nginx.com     nxt_buf_t                  *buf;
970Sigor@sysoev.ru } nxt_app_request_header_t;
980Sigor@sysoev.ru 
990Sigor@sysoev.ru 
1000Sigor@sysoev.ru typedef struct {
101206Smax.romanov@nginx.com     size_t                     preread_size;
10284Smax.romanov@nginx.com     nxt_bool_t                 done;
103206Smax.romanov@nginx.com 
104206Smax.romanov@nginx.com     nxt_buf_t                  *buf;
10584Smax.romanov@nginx.com } nxt_app_request_body_t;
1060Sigor@sysoev.ru 
1070Sigor@sysoev.ru 
10884Smax.romanov@nginx.com typedef struct {
1090Sigor@sysoev.ru     nxt_app_request_header_t   header;
11084Smax.romanov@nginx.com     nxt_app_request_body_t     body;
111113Smax.romanov@nginx.com 
112113Smax.romanov@nginx.com     nxt_str_t                  remote;
113268Sigor@sysoev.ru     nxt_str_t                  local;
1140Sigor@sysoev.ru } nxt_app_request_t;
1150Sigor@sysoev.ru 
1160Sigor@sysoev.ru 
117180Smax.romanov@nginx.com typedef struct nxt_app_parse_ctx_s nxt_app_parse_ctx_t;
118163Smax.romanov@nginx.com 
119163Smax.romanov@nginx.com struct nxt_app_parse_ctx_s {
12084Smax.romanov@nginx.com     nxt_app_request_t         r;
12184Smax.romanov@nginx.com     nxt_http_request_parse_t  parser;
12284Smax.romanov@nginx.com     nxt_mp_t                  *mem_pool;
123163Smax.romanov@nginx.com };
12484Smax.romanov@nginx.com 
12584Smax.romanov@nginx.com 
12684Smax.romanov@nginx.com nxt_int_t nxt_app_http_req_init(nxt_task_t *task, nxt_app_parse_ctx_t *ctx);
12784Smax.romanov@nginx.com 
128206Smax.romanov@nginx.com nxt_int_t nxt_app_http_req_header_parse(nxt_task_t *task,
129206Smax.romanov@nginx.com     nxt_app_parse_ctx_t *ctx, nxt_buf_t *buf);
130206Smax.romanov@nginx.com 
131206Smax.romanov@nginx.com nxt_int_t nxt_app_http_req_body_read(nxt_task_t *task,
132206Smax.romanov@nginx.com     nxt_app_parse_ctx_t *ctx, nxt_buf_t *buf);
133206Smax.romanov@nginx.com 
13484Smax.romanov@nginx.com 
13584Smax.romanov@nginx.com nxt_int_t nxt_app_http_req_done(nxt_task_t *task, nxt_app_parse_ctx_t *ctx);
13684Smax.romanov@nginx.com 
13784Smax.romanov@nginx.com nxt_int_t nxt_app_http_init(nxt_task_t *task, nxt_runtime_t *rt);
13884Smax.romanov@nginx.com 
13984Smax.romanov@nginx.com 
14084Smax.romanov@nginx.com typedef struct nxt_app_wmsg_s  nxt_app_wmsg_t;
14184Smax.romanov@nginx.com typedef struct nxt_app_rmsg_s  nxt_app_rmsg_t;
14284Smax.romanov@nginx.com 
14384Smax.romanov@nginx.com struct nxt_app_wmsg_s {
14484Smax.romanov@nginx.com     nxt_port_t                 *port;  /* where prepared buf will be sent */
14584Smax.romanov@nginx.com     nxt_buf_t                  *write;
14684Smax.romanov@nginx.com     nxt_buf_t                  **buf;
14784Smax.romanov@nginx.com     uint32_t                   stream;
14884Smax.romanov@nginx.com };
14984Smax.romanov@nginx.com 
15084Smax.romanov@nginx.com struct nxt_app_rmsg_s {
15184Smax.romanov@nginx.com     nxt_buf_t                 *buf;   /* current buffer to read */
15284Smax.romanov@nginx.com };
15384Smax.romanov@nginx.com 
15484Smax.romanov@nginx.com 
15584Smax.romanov@nginx.com nxt_inline u_char *
15684Smax.romanov@nginx.com nxt_app_msg_write_length(u_char *dst, size_t length);
15784Smax.romanov@nginx.com 
15884Smax.romanov@nginx.com /* TODO asynchronous mmap buffer assignment */
159216Sigor@sysoev.ru NXT_EXPORT u_char *nxt_app_msg_write_get_buf(nxt_task_t *task,
160216Sigor@sysoev.ru     nxt_app_wmsg_t *msg, size_t size);
16184Smax.romanov@nginx.com 
162216Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_app_msg_write(nxt_task_t *task, nxt_app_wmsg_t *msg,
16384Smax.romanov@nginx.com     u_char *c, size_t size);
16484Smax.romanov@nginx.com 
165216Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_app_msg_write_prefixed_upcase(nxt_task_t *task,
16684Smax.romanov@nginx.com     nxt_app_wmsg_t *msg, const nxt_str_t *prefix, const nxt_str_t *v);
16784Smax.romanov@nginx.com 
16884Smax.romanov@nginx.com nxt_inline nxt_int_t
16984Smax.romanov@nginx.com nxt_app_msg_write_nvp_(nxt_task_t *task, nxt_app_wmsg_t *msg,
17084Smax.romanov@nginx.com     u_char *n, size_t nsize, u_char *v, size_t vsize);
17184Smax.romanov@nginx.com 
17284Smax.romanov@nginx.com 
17384Smax.romanov@nginx.com #define nxt_app_msg_write_const(task, msg, c)                                 \
17484Smax.romanov@nginx.com     nxt_app_msg_write((task), (msg), (u_char *)(c), sizeof(c) - 1)
17584Smax.romanov@nginx.com 
17684Smax.romanov@nginx.com #define nxt_app_msg_write_str(task, msg, str)                                 \
17784Smax.romanov@nginx.com     nxt_app_msg_write((task), (msg), (str)->start, (str)->length)
17884Smax.romanov@nginx.com 
17984Smax.romanov@nginx.com #define nxt_app_msg_write_cstr(task, msg, c)                                  \
18084Smax.romanov@nginx.com     nxt_app_msg_write((task), (msg), (c), nxt_strlen(c))
18184Smax.romanov@nginx.com 
18284Smax.romanov@nginx.com #define nxt_app_msg_write_nvp(task, msg, n, v)                                \
18384Smax.romanov@nginx.com     nxt_app_msg_write_nvp_((task), (msg), (u_char *)(n), sizeof(n) - 1,       \
18484Smax.romanov@nginx.com                            (v)->start, (v)->length)
18584Smax.romanov@nginx.com 
18684Smax.romanov@nginx.com nxt_inline nxt_int_t nxt_app_msg_write_size(nxt_task_t *task,
18784Smax.romanov@nginx.com     nxt_app_wmsg_t *msg, size_t size);
18884Smax.romanov@nginx.com 
189216Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_app_msg_flush(nxt_task_t *task, nxt_app_wmsg_t *msg,
19084Smax.romanov@nginx.com     nxt_bool_t last);
19184Smax.romanov@nginx.com 
192216Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_app_msg_write_raw(nxt_task_t *task,
193216Sigor@sysoev.ru     nxt_app_wmsg_t *msg, const u_char *c, size_t size);
19484Smax.romanov@nginx.com 
195216Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_app_msg_read_str(nxt_task_t *task, nxt_app_rmsg_t *msg,
19684Smax.romanov@nginx.com     nxt_str_t *str);
19784Smax.romanov@nginx.com 
198216Sigor@sysoev.ru NXT_EXPORT size_t nxt_app_msg_read_raw(nxt_task_t *task,
199216Sigor@sysoev.ru     nxt_app_rmsg_t *msg, void *buf, size_t size);
200206Smax.romanov@nginx.com 
201216Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_app_msg_read_nvp(nxt_task_t *task,
202216Sigor@sysoev.ru     nxt_app_rmsg_t *rmsg, nxt_str_t *n, nxt_str_t *v);
20384Smax.romanov@nginx.com 
204216Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_app_msg_read_size(nxt_task_t *task,
205216Sigor@sysoev.ru     nxt_app_rmsg_t *rmsg, size_t *size);
20684Smax.romanov@nginx.com 
20784Smax.romanov@nginx.com 
208216Sigor@sysoev.ru struct nxt_app_module_s {
209258Sigor@sysoev.ru     size_t                     compat_length;
210258Sigor@sysoev.ru     uint32_t                   *compat;
211258Sigor@sysoev.ru 
212216Sigor@sysoev.ru     nxt_str_t                  type;
213216Sigor@sysoev.ru     nxt_str_t                  version;
214141Smax.romanov@nginx.com 
215141Smax.romanov@nginx.com     nxt_int_t                  (*init)(nxt_task_t *task,
216141Smax.romanov@nginx.com                                     nxt_common_app_conf_t *conf);
21784Smax.romanov@nginx.com     nxt_int_t                  (*run)(nxt_task_t *task,
21884Smax.romanov@nginx.com                                     nxt_app_rmsg_t *rmsg,
21984Smax.romanov@nginx.com                                     nxt_app_wmsg_t *wmsg);
220141Smax.romanov@nginx.com };
2210Sigor@sysoev.ru 
2220Sigor@sysoev.ru 
22320Sigor@sysoev.ru nxt_int_t nxt_app_http_read_body(nxt_app_request_t *r, u_char *data,
22420Sigor@sysoev.ru     size_t len);
2250Sigor@sysoev.ru nxt_int_t nxt_app_write(nxt_app_request_t *r, const u_char *data, size_t len);
2260Sigor@sysoev.ru 
22784Smax.romanov@nginx.com nxt_inline u_char *
22884Smax.romanov@nginx.com nxt_app_msg_write_length(u_char *dst, size_t length)
22984Smax.romanov@nginx.com {
23084Smax.romanov@nginx.com     if (length < 128) {
23184Smax.romanov@nginx.com         *dst = length;
23284Smax.romanov@nginx.com         dst++;
233*277Sigor@sysoev.ru 
23484Smax.romanov@nginx.com     } else {
23584Smax.romanov@nginx.com         dst[0] = 0x80U | (length >> 24);
23684Smax.romanov@nginx.com         dst[1] = 0xFFU & (length >> 16);
23784Smax.romanov@nginx.com         dst[2] = 0xFFU & (length >> 8);
23884Smax.romanov@nginx.com         dst[3] = 0xFFU & length;
23984Smax.romanov@nginx.com         dst += 4;
24084Smax.romanov@nginx.com     }
24184Smax.romanov@nginx.com 
24284Smax.romanov@nginx.com     return dst;
24384Smax.romanov@nginx.com }
24484Smax.romanov@nginx.com 
24584Smax.romanov@nginx.com 
24684Smax.romanov@nginx.com nxt_inline nxt_int_t
24784Smax.romanov@nginx.com nxt_app_msg_write_nvp_(nxt_task_t *task, nxt_app_wmsg_t *msg,
24884Smax.romanov@nginx.com     u_char *n, size_t nsize, u_char *v, size_t vsize)
24984Smax.romanov@nginx.com {
25084Smax.romanov@nginx.com     nxt_int_t rc;
25184Smax.romanov@nginx.com 
25284Smax.romanov@nginx.com     rc = nxt_app_msg_write(task, msg, n, nsize);
25384Smax.romanov@nginx.com     if (nxt_slow_path(rc != NXT_OK)) {
25484Smax.romanov@nginx.com         return rc;
25584Smax.romanov@nginx.com     }
25684Smax.romanov@nginx.com 
25784Smax.romanov@nginx.com     return nxt_app_msg_write(task, msg, v, vsize);
25884Smax.romanov@nginx.com }
25984Smax.romanov@nginx.com 
26084Smax.romanov@nginx.com 
26184Smax.romanov@nginx.com nxt_inline nxt_int_t
26284Smax.romanov@nginx.com nxt_app_msg_write_size(nxt_task_t *task, nxt_app_wmsg_t *msg, size_t size)
26384Smax.romanov@nginx.com {
26484Smax.romanov@nginx.com     u_char  *dst;
26584Smax.romanov@nginx.com     size_t  dst_length;
26684Smax.romanov@nginx.com 
26784Smax.romanov@nginx.com     dst_length = size < 128 ? 1 : 4;
26884Smax.romanov@nginx.com 
26984Smax.romanov@nginx.com     dst = nxt_app_msg_write_get_buf(task, msg, dst_length);
27084Smax.romanov@nginx.com     if (nxt_slow_path(dst == NULL)) {
27184Smax.romanov@nginx.com         return NXT_ERROR;
27284Smax.romanov@nginx.com     }
27384Smax.romanov@nginx.com 
27484Smax.romanov@nginx.com     nxt_app_msg_write_length(dst, size);
27584Smax.romanov@nginx.com 
27684Smax.romanov@nginx.com     return NXT_OK;
27784Smax.romanov@nginx.com }
27884Smax.romanov@nginx.com 
27984Smax.romanov@nginx.com 
28084Smax.romanov@nginx.com nxt_inline u_char *
28184Smax.romanov@nginx.com nxt_app_msg_read_length(u_char *src, size_t *length)
28284Smax.romanov@nginx.com {
28384Smax.romanov@nginx.com     if (src[0] < 128) {
28484Smax.romanov@nginx.com         *length = src[0];
28584Smax.romanov@nginx.com         src++;
286*277Sigor@sysoev.ru 
28784Smax.romanov@nginx.com     } else {
28884Smax.romanov@nginx.com         *length = ((src[0] & 0x7fU) << 24) +
28984Smax.romanov@nginx.com                   (src[1] << 16) +
29084Smax.romanov@nginx.com                   (src[2] << 8) +
29184Smax.romanov@nginx.com                   src[3];
29284Smax.romanov@nginx.com         src += 4;
29384Smax.romanov@nginx.com     }
29484Smax.romanov@nginx.com 
29584Smax.romanov@nginx.com     return src;
29684Smax.romanov@nginx.com }
29784Smax.romanov@nginx.com 
2980Sigor@sysoev.ru 
299216Sigor@sysoev.ru nxt_app_lang_module_t *nxt_app_lang_module(nxt_runtime_t *rt, nxt_str_t *name);
300141Smax.romanov@nginx.com nxt_app_type_t nxt_app_parse_type(nxt_str_t *str);
301141Smax.romanov@nginx.com 
302216Sigor@sysoev.ru 
303216Sigor@sysoev.ru extern nxt_application_module_t  nxt_go_module;
304216Sigor@sysoev.ru 
305216Sigor@sysoev.ru 
3060Sigor@sysoev.ru #endif /* _NXT_APPLICATION_H_INCLIDED_ */
307