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