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