22module AP_MODULE_DECLARE_DATA proxy_http_module;
98 "HTTP: canonicalising URL %s",
base_url);
150 "To be forwarded path contains control "
151 "characters or spaces");
156 "To be forwarded query string contains control "
157 "characters or spaces");
192 if (headers ==
NULL) {
252 const char te_hdr[] =
"Transfer-Encoding: chunked" CRLF;
279#define CRLF_ASCII "\015\012"
282#define ZERO_ASCII "\060"
285#define MAX_MEM_SPOOL 16384
301 char server_portstr[32];
323 int seen_eos = 0, rv =
OK;
405 "read %s bytes of request body than expected "
414 "proxy-sendextracrlf")) {
428 input_brigade, seen_eos);
527 "%s Transfer-Encoding is not supported",
534 "client %s (%s) requested Transfer-Encoding "
535 "chunked body with Content-Length (C-L ignored)",
536 c->client_ip,
c->remote_host ?
c->remote_host:
"");
614 "could not parse request Content-Length (%s)",
699 "pass request body failed to %pI (%s) from %s (%s)",
702 c->client_ip,
c->remote_host ?
c->remote_host:
"");
759 rp->output_filters =
c->output_filters;
760 rp->input_filters =
c->input_filters;
761 rp->proto_output_filters =
c->output_filters;
762 rp->proto_input_filters =
c->input_filters;
763 rp->useragent_ip =
c->client_ip;
764 rp->useragent_addr =
c->client_addr;
776 = {
"Date",
"Expires",
"Last-Modified",
NULL };
777 static const struct {
839 "Headers received from backend:");
851 "header size is over the limit allowed by "
852 "ResponseFieldSize (%d bytes). "
853 "Bad response header: '%.*s[...]%s'",
858 "Error reading headers from backend");
885 if (
psc->badopt == bad_error) {
890 else if (
psc->badopt == bad_body) {
898 "Starting body due to bogus non-header "
899 "in headers returned by %s (%s)",
906 "No HTTP headers returned by %s (%s)",
914 "Ignoring bogus HTTP header returned by %s (%s)",
973#ifndef AP_MAX_INTERIM_RESPONSES
974#define AP_MAX_INTERIM_RESPONSES 10
1004 APLOGNO(10154)
"pass request body failed "
1005 "to %pI (%s) from %s (%s) with status %i",
1008 c->client_ip,
c->remote_host ?
c->remote_host :
"",
1042 {
"Keep-Alive",
"Proxy-Authenticate",
"TE",
"Trailer",
"Upgrade",
NULL};
1046 int proxy_status =
OK;
1079 "could not set 100-Continue timeout");
1097 const char *upgrade =
NULL;
1098 int major = 0, minor = 0;
1104 backend->
r, 0, &
len);
1108 backend->
r, 0, &
len);
1112 "error reading status line from remote "
1117 if (do_100_continue) {
1119 "Timeout on 100-Continue");
1138 "Closing connection to client because"
1139 " reading from backend server %s:%d failed."
1140 " Number of keepalives %i", backend->
hostname,
1141 backend->
port,
c->keepalives);
1186 if (!
c->keepalives) {
1188 "NOT Closing connection to client"
1189 " although reading from backend server %s:%d"
1194 "Error reading from remote server");
1209 if ((major != 1) || (
len >= response_field_size - 1)) {
1240 "Status from backend: %d", proxy_status);
1249 "Set-Cookie",
NULL);
1257 "bad HTTP/%d.%d header returned by %s (%s)",
1273 "Set-Cookie",
NULL);
1302 "server %s:%d returned Transfer-Encoding"
1303 " and Content-Length",
1314 upgrade ? upgrade :
"n/a",
1329 "Malformed connection header");
1377 if ((major < 1) || (minor < 1)) {
1392 r->
status = proxy_status = 200;
1421 "proxy-interim-response");
1424 "HTTP: received interim %d response (policy: %s)",
1430 switch (proxy_status) {
1445 "undefined proxy interim response policy");
1474 || (!
toclose && major > 0 && minor > 0));
1482 "HTTP: %s100 continue sent by %pI (%s): "
1483 "%ssending body (response: HTTP/%i.%i %s)",
1510 do_100_continue = 0;
1520 if (do_100_continue) {
1529 "HTTP: tunneling protocol %s", upgrade);
1534 "can't create tunnel for %s", upgrade);
1568 const char *
wa =
"WWW-Authenticate";
1573 "origin server sent 401 without "
1574 "WWW-Authenticate header");
1604 return proxy_status;
1612 (*req->
proto ==
'w')
1613 ?
"WebSocket" :
NULL)) {
1719 "error reading response");
1841 "Too many (%d) interim responses from origin server",
1877 const char *
u =
url;
1900 if (!scheme ||
u[0] !=
'/' ||
u[1] !=
'/' ||
u[2] ==
'\0') {
1902 "HTTP: declining URL %s",
url);
1907 "HTTP: declining URL %s (mod_ssl not configured?)",
url);
1918 backend->
is_ssl = is_ssl;
1926 req->
proto = scheme;
1941 (*req->
proto ==
'w')
1942 ?
"WebSocket" :
NULL)) {
1974 "proxy-prefetch-nonblocking")) {
2004 if (input_brigade ==
NULL) {
2055 "HTTP: failed to make connection to backend: %s",
2080 "HTTP: 100-Continue failed to %pI (%s:%d)",
2120 "mod_proxy must be loaded for mod_proxy_http");
2132 warn_rx =
ap_pregcomp(
p,
"[0-9]{3}[ \t]+[^ \t]+[ \t]+\"[^\"]*\"([ \t]+\"([^\"]+)\")?", 0);
const char apr_size_t ap_regmatch_t * pmatch
const char apr_size_t len
const char apr_size_t nmatch
#define AP_SERVER_BASEVERSION
apr_size_t const unsigned char unsigned int unsigned int d
apr_bucket * ap_bucket_eoc_create(apr_bucket_alloc_t *list)
static apr_pool_t * pconf
#define ap_get_module_config(v, m)
ap_conf_vector_t * ap_create_request_config(apr_pool_t *p)
void ap_hook_post_config(ap_HOOK_post_config_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
#define AP_DECLARE_MODULE(foo)
request_rec int int apr_table_t const char * path
#define HTTP_VERSION_MAJOR(number)
#define HTTP_VERSION_MINOR(number)
#define DEFAULT_HTTPS_PORT
#define DEFAULT_HTTP_PORT
#define ap_xlate_proto_to_ascii(x, y)
apr_status_t ap_pass_brigade(ap_filter_t *filter, apr_bucket_brigade *bucket)
apr_status_t ap_get_brigade(ap_filter_t *filter, apr_bucket_brigade *bucket, ap_input_mode_t mode, apr_read_type_e block, apr_off_t readbytes)
#define AP_SQ_MS_CREATE_PRE_CONFIG
int ap_state_query(int query_code)
const char * ap_get_server_name(request_rec *r)
#define ap_get_core_module_config(v)
apr_socket_t * ap_get_conn_socket(conn_rec *c)
const unsigned char * buf
void ap_send_interim_response(request_rec *r, int send_headers)
#define AP_GETLINE_NOSPC_EOL
#define ap_rgetline(s, n, read, r, fold, bb)
void ap_set_content_type(request_rec *r, const char *ct)
int ap_discard_request_body(request_rec *r)
int ap_ssl_has_outgoing_handlers(void)
const char apr_port_t port
#define APR_STATUS_IS_ENOSPC(s)
#define APR_STATUS_IS_TIMEUP(s)
#define APR_STATUS_IS_EAGAIN(s)
#define APR_BRIGADE_LAST(b)
#define APR_BRIGADE_PREPEND(a, b)
#define APR_BRIGADE_INSERT_TAIL(b, e)
#define APR_BRIGADE_INSERT_HEAD(b, e)
#define APR_BUCKET_NEXT(e)
#define APR_BRIGADE_EMPTY(b)
#define APR_BRIGADE_SENTINEL(b)
#define apr_bucket_delete(e)
#define APR_BUCKET_IS_EOS(e)
#define apr_bucket_setaside(e, p)
#define APR_BRIGADE_FIRST(b)
#define APR_BUCKET_INSERT_BEFORE(a, b)
#define APR_BUCKET_PREV(e)
apr_dbd_transaction_t int mode
const char apr_ssize_t int flags
#define APR_RETRIEVE_OPTIONAL_FN(name)
#define HTTP_SERVICE_UNAVAILABLE
#define AP_STATUS_IS_HEADER_ONLY(x)
#define HTTP_NOT_MODIFIED
#define HTTP_INTERNAL_SERVER_ERROR
#define ap_is_HTTP_INFO(x)
#define HTTP_SWITCHING_PROTOCOLS
#define HTTP_UNAUTHORIZED
#define PROXY_CHECK_CONN_EMPTY
int ap_proxy_connect_backend(const char *proxy_function, proxy_conn_rec *conn, proxy_worker *worker, server_rec *s)
int ap_proxy_should_override(proxy_dir_conf *conf, int code)
int ap_proxy_read_input(request_rec *r, proxy_conn_rec *backend, apr_bucket_brigade *input_brigade, apr_off_t max_read)
char * ap_proxy_canon_netloc(apr_pool_t *p, char **const urlp, char **userp, char **passwordp, char **hostp, apr_port_t *port)
int ap_proxy_release_connection(const char *proxy_function, proxy_conn_rec *conn, server_rec *s)
int ap_proxy_tunnel_run(proxy_tunnel_rec *tunnel)
int ap_proxy_acquire_connection(const char *proxy_function, proxy_conn_rec **conn, proxy_worker *worker, server_rec *s)
int ap_proxy_spool_input(request_rec *r, proxy_conn_rec *backend, apr_bucket_brigade *input_brigade, apr_off_t *bytes_spooled, apr_off_t max_mem_spool)
char * ap_proxy_canonenc_ex(apr_pool_t *p, const char *x, int len, enum enctype t, int flags, int proxyreq)
void ap_proxy_backend_broke(request_rec *r, apr_bucket_brigade *brigade)
const char * ap_proxy_location_reverse_map(request_rec *r, proxy_dir_conf *conf, const char *url)
apr_status_t ap_proxy_tunnel_create(proxy_tunnel_rec **tunnel, request_rec *r, conn_rec *c_o, const char *scheme)
apr_status_t ap_proxy_check_connection(const char *scheme, proxy_conn_rec *conn, server_rec *server, unsigned max_blank_lines, int flags)
int ap_proxy_connection_reusable(proxy_conn_rec *conn)
#define PROXY_CANONENC_NOENCODEDSLASHENCODING
int ap_proxy_pre_http_request(conn_rec *c, request_rec *r)
int ap_proxy_worker_can_upgrade(apr_pool_t *p, const proxy_worker *worker, const char *upgrade, const char *dflt)
apr_status_t ap_proxy_buckets_lifetime_transform(request_rec *r, apr_bucket_brigade *from, apr_bucket_brigade *to)
const char *(* ap_proxy_header_reverse_map_fn)(request_rec *, proxy_dir_conf *, const char *)
void proxy_hook_canon_handler(proxy_HOOK_canon_handler_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
int ap_proxy_connection_create_ex(const char *proxy_function, proxy_conn_rec *conn, request_rec *r)
#define PROXY_SHOULD_PING_100_CONTINUE(w, r)
int ap_proxy_create_hdrbrgd(apr_pool_t *p, apr_bucket_brigade *header_brigade, request_rec *r, proxy_conn_rec *p_conn, proxy_worker *worker, proxy_server_conf *conf, apr_uri_t *uri, char *url, char *server_portstr, char **old_cl_val, char **old_te_val)
int ap_proxyerror(request_rec *r, int statuscode, const char *message)
int ap_proxy_determine_connection(apr_pool_t *p, request_rec *r, proxy_server_conf *conf, proxy_worker *worker, proxy_conn_rec *conn, apr_uri_t *uri, char **url, const char *proxyname, apr_port_t proxyport, char *server_portstr, int server_portstr_size)
void proxy_hook_scheme_handler(proxy_HOOK_scheme_handler_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
const char * ap_proxy_cookie_reverse_map(request_rec *r, proxy_dir_conf *conf, const char *str)
int proxy_run_create_req(request_rec *r, request_rec *pr)
int ap_proxy_prefetch_input(request_rec *r, proxy_conn_rec *backend, apr_bucket_brigade *input_brigade, apr_read_type_e block, apr_off_t *bytes_read, apr_off_t max_read)
int ap_proxy_pass_brigade(apr_bucket_alloc_t *bucket_alloc, request_rec *r, proxy_conn_rec *p_conn, conn_rec *origin, apr_bucket_brigade *bb, int flush)
#define STANDARD20_MODULE_STUFF
int ap_cstr_casecmp(const char *s1, const char *s2)
#define ap_strchr_c(s, c)
#define AP_DEBUG_ASSERT(exp)
const char * ap_scan_vchar_obstext(const char *ptr)
int ap_parse_strict_length(apr_off_t *len, const char *str)
ap_regex_t * ap_pregcomp(apr_pool_t *p, const char *pattern, int cflags)
#define PROXYREQ_RESPONSE
const char int apr_pool_t * pool
void apr_size_t apr_size_t * bytes_read
void const char apr_status_t(* cleanup)(void *))
int strcasecmp(const char *a, const char *b)
int strncasecmp(const char *a, const char *b, size_t n)
apr_vformatter_buff_t * c
apr_interval_time_t apr_pollcb_cb_t func
#define apr_pool_create(newpool, parent)
#define apr_pcalloc(p, size)
const void apr_size_t bytes
apr_int32_t apr_int32_t apr_int32_t err
#define APR_RFC822_DATE_LEN
apr_int64_t apr_interval_time_t
Proxy Extension Module for Apache.
static void add_te_chunked(apr_pool_t *p, apr_bucket_alloc_t *bucket_alloc, apr_bucket_brigade *header_brigade)
static const char * date_canon(apr_pool_t *p, const char *date)
static int add_trailers(void *data, const char *key, const char *val)
static apr_status_t ap_proxy_http_cleanup(const char *scheme, request_rec *r, proxy_conn_rec *backend)
static int ap_proxy_http_prefetch(proxy_http_req_t *req, apr_uri_t *uri, char *url)
static void process_proxy_header(request_rec *r, proxy_dir_conf *c, const char *key, const char *value)
static int proxy_http_post_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
static int send_continue_body(proxy_http_req_t *req)
static const char * get_url_scheme(const char **url, int *is_ssl)
static void terminate_headers(proxy_http_req_t *req)
static int stream_reqbody(proxy_http_req_t *req)
static apr_status_t ap_proxy_read_headers(request_rec *r, request_rec *rr, char *buffer, int size, conn_rec *c, int *pread_len)
static int proxy_http_handler(request_rec *r, proxy_worker *worker, proxy_server_conf *conf, char *url, const char *proxyname, apr_port_t proxyport)
static apr_table_t * ap_proxy_clean_warnings(apr_pool_t *p, apr_table_t *headers)
static int(* ap_proxy_clear_connection_fn)(request_rec *r, apr_table_t *headers)
static int proxy_http_canon(request_rec *r, char *url)
static void ap_proxy_http_register_hook(apr_pool_t *p)
static int ap_proxy_http_process_response(proxy_http_req_t *req)
static apr_status_t ap_proxygetline(apr_bucket_brigade *bb, char *s, int n, request_rec *r, int flags, int *read)
#define AP_MAX_INTERIM_RESPONSES
static int clean_warning_headers(void *data, const char *key, const char *val)
static request_rec * make_fake_req(conn_rec *c, request_rec *r)
static int ap_proxy_http_request(proxy_http_req_t *req)
static ap_regex_t * warn_rx
static void add_cl(apr_pool_t *p, apr_bucket_alloc_t *bucket_alloc, apr_bucket_brigade *header_brigade, const char *cl_val)
static int addit_dammit(void *v, const char *key, const char *val)
static int ap_proxy_clear_connection(request_rec *r, apr_table_t *headers)
static sed_label_t * search(sed_commands_t *commands)
apr_bucket_alloc_t * bucket_alloc
Structure to store things which are per connection.
ap_conn_keepalive_e keepalive
apr_sockaddr_t * local_addr
Per-directory configuration.
apr_bucket_brigade * tmp_bb
unsigned int forward_100_continue
apr_bucket_brigade * header_brigade
unsigned int prefetch_nonblocking
apr_bucket_brigade * input_brigade
unsigned int do_100_continue
apr_bucket_alloc_t * bucket_alloc
proxy_server_conf * sconf
enum proxy_server_conf::@32 viaopt
apr_size_t io_buffer_size
unsigned int ping_timeout_set
apr_size_t response_field_size
unsigned int response_field_size_set
apr_interval_time_t ping_timeout
A structure that represents the current request.
apr_table_t * trailers_in
struct ap_filter_t * output_filters
struct ap_filter_t * proto_input_filters
apr_bucket_brigade * kept_body
apr_table_t * err_headers_out
const struct ap_logconf * log
struct ap_filter_t * input_filters
apr_table_t * subprocess_env
struct ap_conf_vector_t * per_dir_config
apr_table_t * trailers_out
apr_table_t * headers_out
A structure to store information for each virtual server.
struct ap_conf_vector_t * module_config
apr_status_t apr_socket_timeout_set(apr_socket_t *sock, apr_interval_time_t t)
apr_status_t apr_socket_timeout_get(apr_socket_t *sock, apr_interval_time_t *t)
apr_status_t apr_rfc822_date(char *date_str, apr_time_t t)
typedef int(WSAAPI *apr_winapi_fpt_WSAPoll)(IN OUT LPWSAPOLLFD fdArray