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 12*133Sigor@sysoev.ru typedef enum { 13*133Sigor@sysoev.ru NXT_APP_PYTHON = 0, 14*133Sigor@sysoev.ru NXT_APP_PHP, 15*133Sigor@sysoev.ru NXT_APP_RUBY, 16*133Sigor@sysoev.ru NXT_APP_GO, 17*133Sigor@sysoev.ru } nxt_app_type_t; 18*133Sigor@sysoev.ru 19*133Sigor@sysoev.ru 200Sigor@sysoev.ru typedef struct { 210Sigor@sysoev.ru nxt_str_t name; 220Sigor@sysoev.ru nxt_str_t value; 230Sigor@sysoev.ru } nxt_app_header_field_t; 240Sigor@sysoev.ru 250Sigor@sysoev.ru 260Sigor@sysoev.ru typedef struct { 270Sigor@sysoev.ru nxt_str_t method; 28112Smax.romanov@nginx.com nxt_str_t target; 29112Smax.romanov@nginx.com nxt_str_t version; 300Sigor@sysoev.ru nxt_str_t path; 3184Smax.romanov@nginx.com nxt_str_t query; 3284Smax.romanov@nginx.com 3384Smax.romanov@nginx.com nxt_list_t *fields; 340Sigor@sysoev.ru 3584Smax.romanov@nginx.com nxt_str_t cookie; 3684Smax.romanov@nginx.com nxt_str_t content_length; 3784Smax.romanov@nginx.com nxt_str_t content_type; 3884Smax.romanov@nginx.com nxt_str_t host; 3984Smax.romanov@nginx.com 4084Smax.romanov@nginx.com off_t parsed_content_length; 4184Smax.romanov@nginx.com nxt_bool_t done; 420Sigor@sysoev.ru } nxt_app_request_header_t; 430Sigor@sysoev.ru 440Sigor@sysoev.ru 450Sigor@sysoev.ru typedef struct { 4684Smax.romanov@nginx.com nxt_str_t preread; 4784Smax.romanov@nginx.com nxt_bool_t done; 4884Smax.romanov@nginx.com } nxt_app_request_body_t; 490Sigor@sysoev.ru 500Sigor@sysoev.ru 5184Smax.romanov@nginx.com typedef struct { 520Sigor@sysoev.ru nxt_app_request_header_t header; 5384Smax.romanov@nginx.com nxt_app_request_body_t body; 54113Smax.romanov@nginx.com 55113Smax.romanov@nginx.com nxt_str_t remote; 560Sigor@sysoev.ru } nxt_app_request_t; 570Sigor@sysoev.ru 580Sigor@sysoev.ru 590Sigor@sysoev.ru typedef struct { 6084Smax.romanov@nginx.com nxt_app_request_t r; 6184Smax.romanov@nginx.com nxt_http_request_parse_t parser; 6284Smax.romanov@nginx.com nxt_mp_t *mem_pool; 6384Smax.romanov@nginx.com } nxt_app_parse_ctx_t; 6484Smax.romanov@nginx.com 6584Smax.romanov@nginx.com 6684Smax.romanov@nginx.com nxt_int_t nxt_app_http_req_init(nxt_task_t *task, nxt_app_parse_ctx_t *ctx); 6784Smax.romanov@nginx.com 6884Smax.romanov@nginx.com nxt_int_t nxt_app_http_req_parse(nxt_task_t *task, nxt_app_parse_ctx_t *ctx, 6984Smax.romanov@nginx.com nxt_buf_t *buf); 7084Smax.romanov@nginx.com 7184Smax.romanov@nginx.com nxt_int_t nxt_app_http_req_done(nxt_task_t *task, nxt_app_parse_ctx_t *ctx); 7284Smax.romanov@nginx.com 7384Smax.romanov@nginx.com nxt_int_t nxt_app_http_init(nxt_task_t *task, nxt_runtime_t *rt); 7484Smax.romanov@nginx.com 7584Smax.romanov@nginx.com 7684Smax.romanov@nginx.com typedef struct nxt_app_wmsg_s nxt_app_wmsg_t; 7784Smax.romanov@nginx.com typedef struct nxt_app_rmsg_s nxt_app_rmsg_t; 7884Smax.romanov@nginx.com 7984Smax.romanov@nginx.com struct nxt_app_wmsg_s { 8084Smax.romanov@nginx.com nxt_port_t *port; /* where prepared buf will be sent */ 8184Smax.romanov@nginx.com nxt_buf_t *write; 8284Smax.romanov@nginx.com nxt_buf_t **buf; 8384Smax.romanov@nginx.com uint32_t stream; 8484Smax.romanov@nginx.com }; 8584Smax.romanov@nginx.com 8684Smax.romanov@nginx.com struct nxt_app_rmsg_s { 8784Smax.romanov@nginx.com nxt_buf_t *buf; /* current buffer to read */ 8884Smax.romanov@nginx.com }; 8984Smax.romanov@nginx.com 9084Smax.romanov@nginx.com 9184Smax.romanov@nginx.com nxt_inline u_char * 9284Smax.romanov@nginx.com nxt_app_msg_write_length(u_char *dst, size_t length); 9384Smax.romanov@nginx.com 9484Smax.romanov@nginx.com /* TODO asynchronous mmap buffer assignment */ 9584Smax.romanov@nginx.com u_char *nxt_app_msg_write_get_buf(nxt_task_t *task, nxt_app_wmsg_t *msg, 9684Smax.romanov@nginx.com size_t size); 9784Smax.romanov@nginx.com 9884Smax.romanov@nginx.com nxt_int_t nxt_app_msg_write(nxt_task_t *task, nxt_app_wmsg_t *msg, 9984Smax.romanov@nginx.com u_char *c, size_t size); 10084Smax.romanov@nginx.com 10184Smax.romanov@nginx.com nxt_int_t nxt_app_msg_write_prefixed_upcase(nxt_task_t *task, 10284Smax.romanov@nginx.com nxt_app_wmsg_t *msg, const nxt_str_t *prefix, const nxt_str_t *v); 10384Smax.romanov@nginx.com 10484Smax.romanov@nginx.com nxt_inline nxt_int_t 10584Smax.romanov@nginx.com nxt_app_msg_write_nvp_(nxt_task_t *task, nxt_app_wmsg_t *msg, 10684Smax.romanov@nginx.com u_char *n, size_t nsize, u_char *v, size_t vsize); 10784Smax.romanov@nginx.com 10884Smax.romanov@nginx.com 10984Smax.romanov@nginx.com #define nxt_app_msg_write_const(task, msg, c) \ 11084Smax.romanov@nginx.com nxt_app_msg_write((task), (msg), (u_char *)(c), sizeof(c) - 1) 11184Smax.romanov@nginx.com 11284Smax.romanov@nginx.com #define nxt_app_msg_write_str(task, msg, str) \ 11384Smax.romanov@nginx.com nxt_app_msg_write((task), (msg), (str)->start, (str)->length) 11484Smax.romanov@nginx.com 11584Smax.romanov@nginx.com #define nxt_app_msg_write_cstr(task, msg, c) \ 11684Smax.romanov@nginx.com nxt_app_msg_write((task), (msg), (c), nxt_strlen(c)) 11784Smax.romanov@nginx.com 11884Smax.romanov@nginx.com #define nxt_app_msg_write_nvp(task, msg, n, v) \ 11984Smax.romanov@nginx.com nxt_app_msg_write_nvp_((task), (msg), (u_char *)(n), sizeof(n) - 1, \ 12084Smax.romanov@nginx.com (v)->start, (v)->length) 12184Smax.romanov@nginx.com 12284Smax.romanov@nginx.com nxt_inline nxt_int_t nxt_app_msg_write_size(nxt_task_t *task, 12384Smax.romanov@nginx.com nxt_app_wmsg_t *msg, size_t size); 12484Smax.romanov@nginx.com 12584Smax.romanov@nginx.com nxt_int_t nxt_app_msg_flush(nxt_task_t *task, nxt_app_wmsg_t *msg, 12684Smax.romanov@nginx.com nxt_bool_t last); 12784Smax.romanov@nginx.com 12884Smax.romanov@nginx.com nxt_int_t nxt_app_msg_write_raw(nxt_task_t *task, nxt_app_wmsg_t *msg, 12984Smax.romanov@nginx.com const u_char *c, size_t size); 13084Smax.romanov@nginx.com 13184Smax.romanov@nginx.com nxt_int_t nxt_app_msg_read_str(nxt_task_t *task, nxt_app_rmsg_t *msg, 13284Smax.romanov@nginx.com nxt_str_t *str); 13384Smax.romanov@nginx.com 13484Smax.romanov@nginx.com nxt_int_t nxt_app_msg_read_nvp(nxt_task_t *task, nxt_app_rmsg_t *rmsg, 13584Smax.romanov@nginx.com nxt_str_t *n, nxt_str_t *v); 13684Smax.romanov@nginx.com 13784Smax.romanov@nginx.com nxt_int_t nxt_app_msg_read_size(nxt_task_t *task, nxt_app_rmsg_t *rmsg, 13884Smax.romanov@nginx.com size_t *size); 13984Smax.romanov@nginx.com 14084Smax.romanov@nginx.com 14184Smax.romanov@nginx.com typedef struct { 14284Smax.romanov@nginx.com nxt_int_t (*init)(nxt_task_t *task); 14384Smax.romanov@nginx.com nxt_int_t (*prepare_msg)(nxt_task_t *task, 14484Smax.romanov@nginx.com nxt_app_request_t *r, 14584Smax.romanov@nginx.com nxt_app_wmsg_t *wmsg); 14684Smax.romanov@nginx.com nxt_int_t (*run)(nxt_task_t *task, 14784Smax.romanov@nginx.com nxt_app_rmsg_t *rmsg, 14884Smax.romanov@nginx.com nxt_app_wmsg_t *wmsg); 1490Sigor@sysoev.ru } nxt_application_module_t; 1500Sigor@sysoev.ru 1510Sigor@sysoev.ru 15221Sigor@sysoev.ru extern nxt_application_module_t *nxt_app; 15321Sigor@sysoev.ru 1540Sigor@sysoev.ru 1550Sigor@sysoev.ru 15620Sigor@sysoev.ru nxt_int_t nxt_app_http_read_body(nxt_app_request_t *r, u_char *data, 15720Sigor@sysoev.ru size_t len); 1580Sigor@sysoev.ru nxt_int_t nxt_app_write(nxt_app_request_t *r, const u_char *data, size_t len); 1590Sigor@sysoev.ru 16084Smax.romanov@nginx.com nxt_inline u_char * 16184Smax.romanov@nginx.com nxt_app_msg_write_length(u_char *dst, size_t length) 16284Smax.romanov@nginx.com { 16384Smax.romanov@nginx.com if (length < 128) { 16484Smax.romanov@nginx.com *dst = length; 16584Smax.romanov@nginx.com dst++; 16684Smax.romanov@nginx.com } else { 16784Smax.romanov@nginx.com dst[0] = 0x80U | (length >> 24); 16884Smax.romanov@nginx.com dst[1] = 0xFFU & (length >> 16); 16984Smax.romanov@nginx.com dst[2] = 0xFFU & (length >> 8); 17084Smax.romanov@nginx.com dst[3] = 0xFFU & length; 17184Smax.romanov@nginx.com dst += 4; 17284Smax.romanov@nginx.com } 17384Smax.romanov@nginx.com 17484Smax.romanov@nginx.com return dst; 17584Smax.romanov@nginx.com } 17684Smax.romanov@nginx.com 17784Smax.romanov@nginx.com 17884Smax.romanov@nginx.com nxt_inline nxt_int_t 17984Smax.romanov@nginx.com nxt_app_msg_write_nvp_(nxt_task_t *task, nxt_app_wmsg_t *msg, 18084Smax.romanov@nginx.com u_char *n, size_t nsize, u_char *v, size_t vsize) 18184Smax.romanov@nginx.com { 18284Smax.romanov@nginx.com nxt_int_t rc; 18384Smax.romanov@nginx.com 18484Smax.romanov@nginx.com rc = nxt_app_msg_write(task, msg, n, nsize); 18584Smax.romanov@nginx.com if (nxt_slow_path(rc != NXT_OK)) { 18684Smax.romanov@nginx.com return rc; 18784Smax.romanov@nginx.com } 18884Smax.romanov@nginx.com 18984Smax.romanov@nginx.com return nxt_app_msg_write(task, msg, v, vsize); 19084Smax.romanov@nginx.com } 19184Smax.romanov@nginx.com 19284Smax.romanov@nginx.com 19384Smax.romanov@nginx.com nxt_inline nxt_int_t 19484Smax.romanov@nginx.com nxt_app_msg_write_size(nxt_task_t *task, nxt_app_wmsg_t *msg, size_t size) 19584Smax.romanov@nginx.com { 19684Smax.romanov@nginx.com u_char *dst; 19784Smax.romanov@nginx.com size_t dst_length; 19884Smax.romanov@nginx.com 19984Smax.romanov@nginx.com dst_length = size < 128 ? 1 : 4; 20084Smax.romanov@nginx.com 20184Smax.romanov@nginx.com dst = nxt_app_msg_write_get_buf(task, msg, dst_length); 20284Smax.romanov@nginx.com if (nxt_slow_path(dst == NULL)) { 20384Smax.romanov@nginx.com return NXT_ERROR; 20484Smax.romanov@nginx.com } 20584Smax.romanov@nginx.com 20684Smax.romanov@nginx.com nxt_app_msg_write_length(dst, size); 20784Smax.romanov@nginx.com 20884Smax.romanov@nginx.com return NXT_OK; 20984Smax.romanov@nginx.com } 21084Smax.romanov@nginx.com 21184Smax.romanov@nginx.com 21284Smax.romanov@nginx.com nxt_inline u_char * 21384Smax.romanov@nginx.com nxt_app_msg_read_length(u_char *src, size_t *length) 21484Smax.romanov@nginx.com { 21584Smax.romanov@nginx.com if (src[0] < 128) { 21684Smax.romanov@nginx.com *length = src[0]; 21784Smax.romanov@nginx.com src++; 21884Smax.romanov@nginx.com } else { 21984Smax.romanov@nginx.com *length = ((src[0] & 0x7fU) << 24) + 22084Smax.romanov@nginx.com (src[1] << 16) + 22184Smax.romanov@nginx.com (src[2] << 8) + 22284Smax.romanov@nginx.com src[3]; 22384Smax.romanov@nginx.com src += 4; 22484Smax.romanov@nginx.com } 22584Smax.romanov@nginx.com 22684Smax.romanov@nginx.com return src; 22784Smax.romanov@nginx.com } 22884Smax.romanov@nginx.com 2290Sigor@sysoev.ru 2300Sigor@sysoev.ru #endif /* _NXT_APPLICATION_H_INCLIDED_ */ 231