xref: /unit/src/nxt_application.h (revision 687)
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 
12678Svbart@nginx.com #include <nxt_conf.h>
13678Svbart@nginx.com 
14678Svbart@nginx.com 
15133Sigor@sysoev.ru typedef enum {
16141Smax.romanov@nginx.com     NXT_APP_PYTHON,
17133Sigor@sysoev.ru     NXT_APP_PHP,
18133Sigor@sysoev.ru     NXT_APP_GO,
19510Salexander.borisov@nginx.com     NXT_APP_PERL,
20584Salexander.borisov@nginx.com     NXT_APP_RUBY,
21141Smax.romanov@nginx.com 
22216Sigor@sysoev.ru     NXT_APP_UNKNOWN,
23133Sigor@sysoev.ru } nxt_app_type_t;
24133Sigor@sysoev.ru 
25133Sigor@sysoev.ru 
26216Sigor@sysoev.ru typedef struct nxt_app_module_s  nxt_application_module_t;
27216Sigor@sysoev.ru typedef struct nxt_app_module_s  nxt_app_module_t;
28216Sigor@sysoev.ru 
29216Sigor@sysoev.ru 
30216Sigor@sysoev.ru typedef struct {
31356Svbart@nginx.com     nxt_app_type_t            type;
32354Svbart@nginx.com     u_char                    *version;
33216Sigor@sysoev.ru     char                      *file;
34216Sigor@sysoev.ru     nxt_application_module_t  *module;
35216Sigor@sysoev.ru } nxt_app_lang_module_t;
36216Sigor@sysoev.ru 
37216Sigor@sysoev.ru 
38141Smax.romanov@nginx.com typedef struct nxt_common_app_conf_s nxt_common_app_conf_t;
39141Smax.romanov@nginx.com 
40141Smax.romanov@nginx.com 
41141Smax.romanov@nginx.com typedef struct {
42394Smax.romanov@nginx.com     char       *home;
43141Smax.romanov@nginx.com     nxt_str_t  path;
44141Smax.romanov@nginx.com     nxt_str_t  module;
45141Smax.romanov@nginx.com } nxt_python_app_conf_t;
46141Smax.romanov@nginx.com 
47141Smax.romanov@nginx.com 
48141Smax.romanov@nginx.com typedef struct {
49*687Svbart@nginx.com     char                       *root;
50*687Svbart@nginx.com     nxt_str_t                  script;
51*687Svbart@nginx.com     nxt_str_t                  index;
52*687Svbart@nginx.com     nxt_conf_value_t           *options;
53141Smax.romanov@nginx.com } nxt_php_app_conf_t;
54141Smax.romanov@nginx.com 
55141Smax.romanov@nginx.com 
56141Smax.romanov@nginx.com typedef struct {
57685Svbart@nginx.com     char                       *executable;
58685Svbart@nginx.com     nxt_conf_value_t           *arguments;
59141Smax.romanov@nginx.com } nxt_go_app_conf_t;
60141Smax.romanov@nginx.com 
61141Smax.romanov@nginx.com 
62510Salexander.borisov@nginx.com typedef struct {
63510Salexander.borisov@nginx.com     char       *script;
64510Salexander.borisov@nginx.com } nxt_perl_app_conf_t;
65510Salexander.borisov@nginx.com 
66510Salexander.borisov@nginx.com 
67584Salexander.borisov@nginx.com typedef struct {
68584Salexander.borisov@nginx.com     nxt_str_t  script;
69584Salexander.borisov@nginx.com } nxt_ruby_app_conf_t;
70584Salexander.borisov@nginx.com 
71584Salexander.borisov@nginx.com 
72141Smax.romanov@nginx.com struct nxt_common_app_conf_s {
73678Svbart@nginx.com     nxt_str_t                  name;
74678Svbart@nginx.com     nxt_str_t                  type;
75678Svbart@nginx.com     nxt_str_t                  user;
76678Svbart@nginx.com     nxt_str_t                  group;
77141Smax.romanov@nginx.com 
78678Svbart@nginx.com     char                       *working_directory;
79678Svbart@nginx.com     nxt_conf_value_t           *environment;
80271Smax.romanov@nginx.com 
81141Smax.romanov@nginx.com     union {
82141Smax.romanov@nginx.com         nxt_python_app_conf_t  python;
83141Smax.romanov@nginx.com         nxt_php_app_conf_t     php;
84141Smax.romanov@nginx.com         nxt_go_app_conf_t      go;
85510Salexander.borisov@nginx.com         nxt_perl_app_conf_t    perl;
86584Salexander.borisov@nginx.com         nxt_ruby_app_conf_t    ruby;
87141Smax.romanov@nginx.com     } u;
88141Smax.romanov@nginx.com };
89141Smax.romanov@nginx.com 
90141Smax.romanov@nginx.com 
910Sigor@sysoev.ru typedef struct {
920Sigor@sysoev.ru     nxt_str_t                  name;
930Sigor@sysoev.ru     nxt_str_t                  value;
940Sigor@sysoev.ru } nxt_app_header_field_t;
950Sigor@sysoev.ru 
960Sigor@sysoev.ru 
970Sigor@sysoev.ru typedef struct {
980Sigor@sysoev.ru     nxt_str_t                  method;
99112Smax.romanov@nginx.com     nxt_str_t                  target;
100112Smax.romanov@nginx.com     nxt_str_t                  version;
1010Sigor@sysoev.ru     nxt_str_t                  path;
10284Smax.romanov@nginx.com     nxt_str_t                  query;
10384Smax.romanov@nginx.com 
10484Smax.romanov@nginx.com     nxt_list_t                 *fields;
1050Sigor@sysoev.ru 
10684Smax.romanov@nginx.com     nxt_str_t                  cookie;
10784Smax.romanov@nginx.com     nxt_str_t                  content_length;
10884Smax.romanov@nginx.com     nxt_str_t                  content_type;
10984Smax.romanov@nginx.com     nxt_str_t                  host;
11084Smax.romanov@nginx.com 
11184Smax.romanov@nginx.com     off_t                      parsed_content_length;
11284Smax.romanov@nginx.com     nxt_bool_t                 done;
113206Smax.romanov@nginx.com 
114206Smax.romanov@nginx.com     size_t                     bufs;
115206Smax.romanov@nginx.com     nxt_buf_t                  *buf;
1160Sigor@sysoev.ru } nxt_app_request_header_t;
1170Sigor@sysoev.ru 
1180Sigor@sysoev.ru 
1190Sigor@sysoev.ru typedef struct {
120206Smax.romanov@nginx.com     size_t                     preread_size;
12184Smax.romanov@nginx.com     nxt_bool_t                 done;
122206Smax.romanov@nginx.com 
123206Smax.romanov@nginx.com     nxt_buf_t                  *buf;
12484Smax.romanov@nginx.com } nxt_app_request_body_t;
1250Sigor@sysoev.ru 
1260Sigor@sysoev.ru 
12784Smax.romanov@nginx.com typedef struct {
1280Sigor@sysoev.ru     nxt_app_request_header_t   header;
12984Smax.romanov@nginx.com     nxt_app_request_body_t     body;
130113Smax.romanov@nginx.com 
131113Smax.romanov@nginx.com     nxt_str_t                  remote;
132268Sigor@sysoev.ru     nxt_str_t                  local;
1330Sigor@sysoev.ru } nxt_app_request_t;
1340Sigor@sysoev.ru 
1350Sigor@sysoev.ru 
136431Sigor@sysoev.ru typedef struct nxt_app_parse_ctx_s  nxt_app_parse_ctx_t;
137163Smax.romanov@nginx.com 
138163Smax.romanov@nginx.com struct nxt_app_parse_ctx_s {
13984Smax.romanov@nginx.com     nxt_app_request_t         r;
140431Sigor@sysoev.ru     nxt_http_request_t        *request;
141431Sigor@sysoev.ru     nxt_timer_t               timer;
142615Smax.romanov@nginx.com     void                      *timer_data;
14384Smax.romanov@nginx.com     nxt_http_request_parse_t  parser;
144431Sigor@sysoev.ru     nxt_http_request_parse_t  resp_parser;
14584Smax.romanov@nginx.com     nxt_mp_t                  *mem_pool;
146163Smax.romanov@nginx.com };
14784Smax.romanov@nginx.com 
14884Smax.romanov@nginx.com 
14984Smax.romanov@nginx.com nxt_int_t nxt_app_http_req_done(nxt_task_t *task, nxt_app_parse_ctx_t *ctx);
15084Smax.romanov@nginx.com 
15184Smax.romanov@nginx.com 
15284Smax.romanov@nginx.com typedef struct nxt_app_wmsg_s  nxt_app_wmsg_t;
15384Smax.romanov@nginx.com typedef struct nxt_app_rmsg_s  nxt_app_rmsg_t;
15484Smax.romanov@nginx.com 
15584Smax.romanov@nginx.com struct nxt_app_wmsg_s {
15684Smax.romanov@nginx.com     nxt_port_t                 *port;  /* where prepared buf will be sent */
15784Smax.romanov@nginx.com     nxt_buf_t                  *write;
15884Smax.romanov@nginx.com     nxt_buf_t                  **buf;
15984Smax.romanov@nginx.com     uint32_t                   stream;
16084Smax.romanov@nginx.com };
16184Smax.romanov@nginx.com 
162584Salexander.borisov@nginx.com 
16384Smax.romanov@nginx.com struct nxt_app_rmsg_s {
164584Salexander.borisov@nginx.com     nxt_buf_t                  *buf;   /* current buffer to read */
16584Smax.romanov@nginx.com };
16684Smax.romanov@nginx.com 
16784Smax.romanov@nginx.com 
16884Smax.romanov@nginx.com nxt_inline u_char *
16984Smax.romanov@nginx.com nxt_app_msg_write_length(u_char *dst, size_t length);
17084Smax.romanov@nginx.com 
17184Smax.romanov@nginx.com /* TODO asynchronous mmap buffer assignment */
172216Sigor@sysoev.ru NXT_EXPORT u_char *nxt_app_msg_write_get_buf(nxt_task_t *task,
173216Sigor@sysoev.ru     nxt_app_wmsg_t *msg, size_t size);
17484Smax.romanov@nginx.com 
175216Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_app_msg_write(nxt_task_t *task, nxt_app_wmsg_t *msg,
17684Smax.romanov@nginx.com     u_char *c, size_t size);
17784Smax.romanov@nginx.com 
178216Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_app_msg_write_prefixed_upcase(nxt_task_t *task,
179417Svbart@nginx.com     nxt_app_wmsg_t *msg, const nxt_str_t *prefix, u_char *c, size_t size);
18084Smax.romanov@nginx.com 
18184Smax.romanov@nginx.com nxt_inline nxt_int_t
18284Smax.romanov@nginx.com nxt_app_msg_write_nvp_(nxt_task_t *task, nxt_app_wmsg_t *msg,
18384Smax.romanov@nginx.com     u_char *n, size_t nsize, u_char *v, size_t vsize);
18484Smax.romanov@nginx.com 
18584Smax.romanov@nginx.com 
18684Smax.romanov@nginx.com #define nxt_app_msg_write_const(task, msg, c)                                 \
18784Smax.romanov@nginx.com     nxt_app_msg_write((task), (msg), (u_char *)(c), sizeof(c) - 1)
18884Smax.romanov@nginx.com 
18984Smax.romanov@nginx.com #define nxt_app_msg_write_str(task, msg, str)                                 \
19084Smax.romanov@nginx.com     nxt_app_msg_write((task), (msg), (str)->start, (str)->length)
19184Smax.romanov@nginx.com 
19284Smax.romanov@nginx.com #define nxt_app_msg_write_cstr(task, msg, c)                                  \
19384Smax.romanov@nginx.com     nxt_app_msg_write((task), (msg), (c), nxt_strlen(c))
19484Smax.romanov@nginx.com 
19584Smax.romanov@nginx.com #define nxt_app_msg_write_nvp(task, msg, n, v)                                \
19684Smax.romanov@nginx.com     nxt_app_msg_write_nvp_((task), (msg), (u_char *)(n), sizeof(n) - 1,       \
19784Smax.romanov@nginx.com                            (v)->start, (v)->length)
19884Smax.romanov@nginx.com 
19984Smax.romanov@nginx.com nxt_inline nxt_int_t nxt_app_msg_write_size(nxt_task_t *task,
20084Smax.romanov@nginx.com     nxt_app_wmsg_t *msg, size_t size);
20184Smax.romanov@nginx.com 
202216Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_app_msg_flush(nxt_task_t *task, nxt_app_wmsg_t *msg,
20384Smax.romanov@nginx.com     nxt_bool_t last);
20484Smax.romanov@nginx.com 
205216Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_app_msg_write_raw(nxt_task_t *task,
206216Sigor@sysoev.ru     nxt_app_wmsg_t *msg, const u_char *c, size_t size);
20784Smax.romanov@nginx.com 
208216Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_app_msg_read_str(nxt_task_t *task, nxt_app_rmsg_t *msg,
20984Smax.romanov@nginx.com     nxt_str_t *str);
21084Smax.romanov@nginx.com 
211216Sigor@sysoev.ru NXT_EXPORT size_t nxt_app_msg_read_raw(nxt_task_t *task,
212216Sigor@sysoev.ru     nxt_app_rmsg_t *msg, void *buf, size_t size);
213206Smax.romanov@nginx.com 
214216Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_app_msg_read_nvp(nxt_task_t *task,
215216Sigor@sysoev.ru     nxt_app_rmsg_t *rmsg, nxt_str_t *n, nxt_str_t *v);
21684Smax.romanov@nginx.com 
217216Sigor@sysoev.ru NXT_EXPORT nxt_int_t nxt_app_msg_read_size(nxt_task_t *task,
218216Sigor@sysoev.ru     nxt_app_rmsg_t *rmsg, size_t *size);
21984Smax.romanov@nginx.com 
22084Smax.romanov@nginx.com 
221216Sigor@sysoev.ru struct nxt_app_module_s {
222258Sigor@sysoev.ru     size_t                     compat_length;
223258Sigor@sysoev.ru     uint32_t                   *compat;
224258Sigor@sysoev.ru 
225216Sigor@sysoev.ru     nxt_str_t                  type;
226612Salexander.borisov@nginx.com     const char                 *version;
227141Smax.romanov@nginx.com 
228141Smax.romanov@nginx.com     nxt_int_t                  (*init)(nxt_task_t *task,
229141Smax.romanov@nginx.com                                     nxt_common_app_conf_t *conf);
23084Smax.romanov@nginx.com     nxt_int_t                  (*run)(nxt_task_t *task,
23184Smax.romanov@nginx.com                                     nxt_app_rmsg_t *rmsg,
23284Smax.romanov@nginx.com                                     nxt_app_wmsg_t *wmsg);
233421Smax.romanov@nginx.com     void                       (*atexit)(nxt_task_t *task);
234141Smax.romanov@nginx.com };
2350Sigor@sysoev.ru 
2360Sigor@sysoev.ru 
23720Sigor@sysoev.ru nxt_int_t nxt_app_http_read_body(nxt_app_request_t *r, u_char *data,
23820Sigor@sysoev.ru     size_t len);
2390Sigor@sysoev.ru nxt_int_t nxt_app_write(nxt_app_request_t *r, const u_char *data, size_t len);
2400Sigor@sysoev.ru 
24184Smax.romanov@nginx.com nxt_inline u_char *
24284Smax.romanov@nginx.com nxt_app_msg_write_length(u_char *dst, size_t length)
24384Smax.romanov@nginx.com {
24484Smax.romanov@nginx.com     if (length < 128) {
24584Smax.romanov@nginx.com         *dst = length;
24684Smax.romanov@nginx.com         dst++;
247277Sigor@sysoev.ru 
24884Smax.romanov@nginx.com     } else {
24984Smax.romanov@nginx.com         dst[0] = 0x80U | (length >> 24);
25084Smax.romanov@nginx.com         dst[1] = 0xFFU & (length >> 16);
25184Smax.romanov@nginx.com         dst[2] = 0xFFU & (length >> 8);
25284Smax.romanov@nginx.com         dst[3] = 0xFFU & length;
25384Smax.romanov@nginx.com         dst += 4;
25484Smax.romanov@nginx.com     }
25584Smax.romanov@nginx.com 
25684Smax.romanov@nginx.com     return dst;
25784Smax.romanov@nginx.com }
25884Smax.romanov@nginx.com 
25984Smax.romanov@nginx.com 
26084Smax.romanov@nginx.com nxt_inline nxt_int_t
26184Smax.romanov@nginx.com nxt_app_msg_write_nvp_(nxt_task_t *task, nxt_app_wmsg_t *msg,
26284Smax.romanov@nginx.com     u_char *n, size_t nsize, u_char *v, size_t vsize)
26384Smax.romanov@nginx.com {
26484Smax.romanov@nginx.com     nxt_int_t rc;
26584Smax.romanov@nginx.com 
26684Smax.romanov@nginx.com     rc = nxt_app_msg_write(task, msg, n, nsize);
26784Smax.romanov@nginx.com     if (nxt_slow_path(rc != NXT_OK)) {
26884Smax.romanov@nginx.com         return rc;
26984Smax.romanov@nginx.com     }
27084Smax.romanov@nginx.com 
27184Smax.romanov@nginx.com     return nxt_app_msg_write(task, msg, v, vsize);
27284Smax.romanov@nginx.com }
27384Smax.romanov@nginx.com 
27484Smax.romanov@nginx.com 
27584Smax.romanov@nginx.com nxt_inline nxt_int_t
27684Smax.romanov@nginx.com nxt_app_msg_write_size(nxt_task_t *task, nxt_app_wmsg_t *msg, size_t size)
27784Smax.romanov@nginx.com {
27884Smax.romanov@nginx.com     u_char  *dst;
27984Smax.romanov@nginx.com     size_t  dst_length;
28084Smax.romanov@nginx.com 
28184Smax.romanov@nginx.com     dst_length = size < 128 ? 1 : 4;
28284Smax.romanov@nginx.com 
28384Smax.romanov@nginx.com     dst = nxt_app_msg_write_get_buf(task, msg, dst_length);
28484Smax.romanov@nginx.com     if (nxt_slow_path(dst == NULL)) {
28584Smax.romanov@nginx.com         return NXT_ERROR;
28684Smax.romanov@nginx.com     }
28784Smax.romanov@nginx.com 
28884Smax.romanov@nginx.com     nxt_app_msg_write_length(dst, size);
28984Smax.romanov@nginx.com 
29084Smax.romanov@nginx.com     return NXT_OK;
29184Smax.romanov@nginx.com }
29284Smax.romanov@nginx.com 
29384Smax.romanov@nginx.com 
29484Smax.romanov@nginx.com nxt_inline u_char *
29584Smax.romanov@nginx.com nxt_app_msg_read_length(u_char *src, size_t *length)
29684Smax.romanov@nginx.com {
29784Smax.romanov@nginx.com     if (src[0] < 128) {
29884Smax.romanov@nginx.com         *length = src[0];
29984Smax.romanov@nginx.com         src++;
300277Sigor@sysoev.ru 
30184Smax.romanov@nginx.com     } else {
302613Svbart@nginx.com         *length = ((src[0] & 0x7FU) << 24)
303613Svbart@nginx.com                 + ( src[1]          << 16)
304613Svbart@nginx.com                 + ( src[2]          <<  8)
305613Svbart@nginx.com                 +   src[3];
30684Smax.romanov@nginx.com         src += 4;
30784Smax.romanov@nginx.com     }
30884Smax.romanov@nginx.com 
30984Smax.romanov@nginx.com     return src;
31084Smax.romanov@nginx.com }
31184Smax.romanov@nginx.com 
3120Sigor@sysoev.ru 
313216Sigor@sysoev.ru nxt_app_lang_module_t *nxt_app_lang_module(nxt_runtime_t *rt, nxt_str_t *name);
314510Salexander.borisov@nginx.com nxt_app_type_t nxt_app_parse_type(u_char *p, size_t length);
315216Sigor@sysoev.ru 
316673Svbart@nginx.com NXT_EXPORT extern nxt_str_t      nxt_server;
317216Sigor@sysoev.ru extern nxt_application_module_t  nxt_go_module;
318216Sigor@sysoev.ru 
319216Sigor@sysoev.ru 
3200Sigor@sysoev.ru #endif /* _NXT_APPLICATION_H_INCLIDED_ */
321