1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
|
/*
* Copyright (C) Dmitry Volyntsev
* Copyright (C) hongzhidao
* Copyright (C) Antoine Bonavita
* Copyright (C) NGINX, Inc.
*/
#ifndef _NGX_JS_HTTP_H_INCLUDED_
#define _NGX_JS_HTTP_H_INCLUDED_
typedef struct ngx_js_http_s ngx_js_http_t;
typedef struct {
ngx_uint_t state;
ngx_uint_t code;
u_char *status_text;
u_char *status_text_end;
ngx_uint_t count;
ngx_flag_t chunked;
off_t content_length_n;
u_char *header_name_start;
u_char *header_name_end;
u_char *header_start;
u_char *header_end;
} ngx_js_http_parse_t;
typedef struct {
u_char *pos;
uint64_t chunk_size;
uint8_t state;
uint8_t last;
} ngx_js_http_chunk_parse_t;
typedef struct ngx_js_tb_elt_s ngx_js_tb_elt_t;
struct ngx_js_tb_elt_s {
ngx_uint_t hash;
ngx_str_t key;
ngx_str_t value;
ngx_js_tb_elt_t *next;
};
typedef struct {
enum {
GUARD_NONE = 0,
GUARD_REQUEST,
GUARD_IMMUTABLE,
GUARD_RESPONSE,
} guard;
ngx_list_t header_list;
ngx_js_tb_elt_t *content_type;
} ngx_js_headers_t;
typedef struct {
enum {
CACHE_MODE_DEFAULT = 0,
CACHE_MODE_NO_STORE,
CACHE_MODE_RELOAD,
CACHE_MODE_NO_CACHE,
CACHE_MODE_FORCE_CACHE,
CACHE_MODE_ONLY_IF_CACHED,
} cache_mode;
enum {
CREDENTIALS_SAME_ORIGIN = 0,
CREDENTIALS_INCLUDE,
CREDENTIALS_OMIT,
} credentials;
enum {
MODE_NO_CORS = 0,
MODE_SAME_ORIGIN,
MODE_CORS,
MODE_NAVIGATE,
MODE_WEBSOCKET,
} mode;
ngx_str_t url;
ngx_str_t method;
u_char m[8];
uint8_t body_used;
ngx_str_t body;
ngx_js_headers_t headers;
njs_opaque_value_t header_value;
} ngx_js_request_t;
typedef struct {
ngx_str_t url;
ngx_int_t code;
ngx_str_t status_text;
uint8_t body_used;
njs_chb_t chain;
ngx_js_headers_t headers;
njs_opaque_value_t header_value;
} ngx_js_response_t;
struct ngx_js_http_s {
ngx_log_t *log;
ngx_pool_t *pool;
ngx_resolver_ctx_t *ctx;
ngx_addr_t addr;
ngx_addr_t *addrs;
ngx_uint_t naddrs;
ngx_uint_t naddr;
in_port_t port;
ngx_peer_connection_t peer;
ngx_msec_t timeout;
ngx_int_t buffer_size;
ngx_int_t max_response_body_size;
unsigned header_only;
#if (NGX_SSL)
ngx_str_t tls_name;
ngx_ssl_t *ssl;
njs_bool_t ssl_verify;
#endif
ngx_buf_t *buffer;
ngx_buf_t *chunk;
njs_chb_t chain;
ngx_js_response_t response;
uint8_t done;
ngx_js_http_parse_t http_parse;
ngx_js_http_chunk_parse_t http_chunk_parse;
ngx_int_t (*process)(ngx_js_http_t *http);
ngx_int_t (*append_headers)(ngx_js_http_t *http,
ngx_js_headers_t *headers,
u_char *name, size_t len,
u_char *value, size_t vlen);
void (*ready_handler)(ngx_js_http_t *http);
void (*error_handler)(ngx_js_http_t *http,
const char *err);
};
ngx_resolver_ctx_t *ngx_js_http_resolve(ngx_js_http_t *http, ngx_resolver_t *r,
ngx_str_t *host, in_port_t port, ngx_msec_t timeout);
void ngx_js_http_connect(ngx_js_http_t *http);
void ngx_js_http_resolve_done(ngx_js_http_t *http);
void ngx_js_http_close_peer(ngx_js_http_t *http);
void ngx_js_http_trim(u_char **value, size_t *len,
int trim_c0_control_or_space);
ngx_int_t ngx_js_check_header_name(u_char *name, size_t len);
#endif /* _NGX_JS_HTTP_H_INCLUDED_ */
|