22module AP_MODULE_DECLARE_DATA proxy_fcgi_module;
42#define FCGI_MAY_BE_FPM(dconf) \
44 ((dconf->backend_type == BACKEND_DEFAULT_UNKNOWN) || \
45 (dconf->backend_type == BACKEND_FPM)))
77 "canonicalising URL %s",
url);
81 "error parsing URL %s: %s",
url,
err);
115 "To be forwarded path contains control "
116 "characters or spaces");
135 rconf->need_dirwalk = 1;
196 "fix_cgivars: Condition eval returned %d: %s",
204 if (entry->
envname[0] ==
'!') {
211 "Error evaluating expression for replacement of %s: '%s'",
218 "fix_cgivars: override %s from '%s' to '%s'",
257 n -=
vec[
i++].iov_len;
329 vec[1].iov_base = (
void *)
abrb;
352 if (
rconf->need_dirwalk) {
412 "sending env var '%s' value '%s'",
433 APLOGNO(02536)
"couldn't encode envvar '%s' in %"
458 vec[1].iov_base = body;
511 else if (*
itr ==
'\n') {
599 rv = apr_poll(&pfd, 1, &
n,
timeout);
634 *
err =
"reading input brigade";
650 *
err =
"flattening brigade";
678 *
err =
"sending stdin";
702 *
err =
"sending empty stdin";
713 unsigned char type, version;
720 "Failed to read FastCGI header");
732 "Got bogus version %d", (
int)version);
739 "Got bogus rid %d, expected %d",
758 *
err =
"reading response body";
802 *
err =
"passing headers brigade to output filters";
821 "Error parsing script headers");
848 *
err =
"passing brigade to output filters";
875 *
err =
"passing brigade to output filters";
899 *
err =
"passing brigade to output filters";
927 "Got bogus record %d",
type);
939 "Error occurred reading padding");
952 *
err =
"passing headers brigade to output filters";
979 char *
url,
char *server_portstr,
998 "Failed Writing Request to %s:", server_portstr);
1010 "Failed writing Environment to %s:", server_portstr);
1025 "The client aborted the connection.");
1031 "Error dispatching request to %s: %s%s%s",
1052#define FCGI_SCHEME "FCGI"
1054#define MAX_MEM_SPOOL 16384
1065 char server_portstr[32];
1079 "url: %s proxyname: %s proxyport: %d",
1107 sizeof(server_portstr));
1116 if (input_brigade ==
NULL) {
1223 "failed to make connection to backend: %s",
1231 server_portstr, input_brigade);
1258 ?
over->backend_type
1259 :
base->backend_type;
1276 return "ProxyFCGIBackendType requires one of the following arguments: "
1285 const char *
arg1,
const char *
arg2,
1296 return apr_psprintf(
cmd->pool,
"Could not parse expression \"%s\": %s",
1304 "allowed when using ProxyFCGISetEnvIf's unset "
1309 return "ProxyFCGISetEnvIf: \"!\" is not a valid variable name";
1323 return apr_psprintf(
cmd->pool,
"Could not parse expression \"%s\": %s",
1340 "Specify the type of FastCGI server: 'Generic', 'FPM'"),
1342 "expr-condition env-name expr-value"),
const char apr_size_t len
apr_size_t const unsigned char unsigned int unsigned int d
apr_array_append(apr_pool_t *p, const apr_array_header_t *first, const apr_array_header_t *second)
#define AP_INIT_TAKE1(directive, func, mconfig, where, help)
#define ap_get_module_config(v, m)
#define AP_DECLARE_MODULE(foo)
#define ap_set_module_config(v, m, val)
request_rec int int apr_table_t const char * path
#define AP_INIT_TAKE23(directive, func, mconfig, where, help)
void ap_fcgi_fill_in_header(ap_fcgi_header *header, unsigned char type, apr_uint16_t request_id, apr_uint16_t content_len, unsigned char padding_len)
#define AP_FCGI_MAX_CONTENT_LEN
apr_size_t ap_fcgi_encoded_env_len(apr_table_t *env, apr_size_t maxlen, int *starting_elem)
#define AP_FCGI_VERSION_1
void ap_fcgi_fill_in_request_body(ap_fcgi_begin_request_body *brb, int role, unsigned char flags)
void ap_fcgi_header_fields_from_array(unsigned char *version, unsigned char *type, apr_uint16_t *request_id, apr_uint16_t *content_len, unsigned char *padding_len, unsigned char a[])
#define AP_FCGI_HEADER_LEN
void ap_fcgi_header_to_array(ap_fcgi_header *h, unsigned char a[])
#define AP_FCGI_END_REQUEST
#define AP_FCGI_RESPONDER
apr_status_t ap_fcgi_encode_env(request_rec *r, apr_table_t *env, void *buffer, apr_size_t buflen, int *starting_elem)
#define AP_FCGI_BEGIN_REQUEST
#define AP_FCGI_KEEP_CONN
void ap_fcgi_begin_request_body_to_array(ap_fcgi_begin_request_body *h, unsigned char a[])
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_get_core_module_config(v)
#define APLOG_MODULE_INDEX
int ap_map_http_request_error(apr_status_t rv, int status)
int ap_directory_walk(request_rec *r)
int ap_is_initial_req(request_rec *r)
void ap_die(int type, request_rec *r)
void ap_add_common_vars(request_rec *r)
int ap_scan_script_header_err_brigade_ex(request_rec *r, apr_bucket_brigade *bb, char *buffer, int module_index)
void ap_add_cgi_vars(request_rec *r)
#define AP_TRUST_CGILIKE_CL_ENVVAR
const char apr_port_t port
#define APR_STATUS_IS_EINTR(s)
#define APR_STATUS_IS_TIMEUP(s)
#define APR_BRIGADE_LAST(b)
#define APR_BUCKET_IS_METADATA(e)
#define APR_BRIGADE_INSERT_TAIL(b, e)
#define APR_BUCKET_NEXT(e)
#define APR_BRIGADE_CONCAT(a, b)
#define APR_BRIGADE_EMPTY(b)
#define APR_BRIGADE_SENTINEL(b)
#define APR_BUCKET_IS_EOS(e)
#define apr_bucket_setaside(e, p)
apr_bucket apr_bucket_brigade * a
const char apr_ssize_t int flags
#define AP_EXPR_FLAG_STRING_RESULT
#define ap_expr_parse_cmd(cmd, expr, flags, err, lookup_fn)
int ap_expr_exec_re(request_rec *r, const ap_expr_info_t *expr, apr_size_t nmatch, ap_regmatch_t *pmatch, const char **source, const char **err)
const char * ap_expr_str_exec_re(request_rec *r, const ap_expr_info_t *expr, apr_size_t nmatch, ap_regmatch_t *pmatch, const char **source, const char **err)
#define HTTP_SERVICE_UNAVAILABLE
#define HTTP_PRECONDITION_FAILED
#define HTTP_NOT_MODIFIED
#define HTTP_GATEWAY_TIME_OUT
#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)
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_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)
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
void proxy_hook_canon_handler(proxy_HOOK_canon_handler_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
apr_port_t ap_proxy_port_of_scheme(const char *scheme)
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)
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)
#define STANDARD20_MODULE_STUFF
#define ap_strchr_c(s, c)
#define AP_DEBUG_ASSERT(exp)
const char * ap_scan_vchar_obstext(const char *ptr)
int ap_cstr_casecmpn(const char *s1, const char *s2, apr_size_t n)
int ap_unescape_url_keep2f(char *url, int decode_slashes)
apr_seek_where_t apr_off_t * offset
void const char apr_status_t(* cleanup)(void *))
const struct iovec apr_size_t nvec
int strcasecmp(const char *a, const char *b)
apr_vformatter_buff_t * c
#define apr_pool_create(newpool, parent)
#define apr_pcalloc(p, size)
apr_int32_t apr_int32_t apr_int32_t err
apr_int64_t apr_interval_time_t
Proxy Extension Module for Apache.
static int handle_headers(request_rec *r, int *state, const char *readbuf, apr_size_t readlen)
static const char * cmd_servertype(cmd_parms *cmd, void *in_dconf, const char *val)
static const command_rec command_table[]
static void * fcgi_merge_dconf(apr_pool_t *p, void *basev, void *overridesv)
@ HDR_STATE_READING_HEADERS
@ HDR_STATE_DONE_WITH_HEADERS
static void * fcgi_create_dconf(apr_pool_t *p, char *path)
static apr_status_t get_data(proxy_conn_rec *conn, char *buffer, apr_size_t *buflen)
static apr_status_t fix_cgivars(request_rec *r, fcgi_dirconf_t *dconf)
static int proxy_fcgi_canon(request_rec *r, char *url)
static apr_status_t dispatch(proxy_conn_rec *conn, proxy_dir_conf *conf, request_rec *r, apr_pool_t *setaside_pool, apr_uint16_t request_id, const char **err, int *bad_request, int *has_responded, apr_bucket_brigade *input_brigade)
#define FCGI_MAY_BE_FPM(dconf)
static void register_hooks(apr_pool_t *p)
static int fcgi_do_request(apr_pool_t *p, request_rec *r, proxy_conn_rec *conn, conn_rec *origin, proxy_dir_conf *conf, apr_uri_t *uri, char *url, char *server_portstr, apr_bucket_brigade *input_brigade)
static apr_status_t send_data(proxy_conn_rec *conn, struct iovec *vec, int nvec, apr_size_t *len)
static apr_status_t send_begin_request(proxy_conn_rec *conn, apr_uint16_t request_id)
static apr_status_t get_data_full(proxy_conn_rec *conn, char *buffer, apr_size_t buflen)
static int proxy_fcgi_handler(request_rec *r, proxy_worker *worker, proxy_server_conf *conf, char *url, const char *proxyname, apr_port_t proxyport)
@ BACKEND_DEFAULT_UNKNOWN
static const char * cmd_setenv(cmd_parms *cmd, void *in_dconf, const char *arg1, const char *arg2, const char *arg3)
static apr_status_t send_environment(proxy_conn_rec *conn, request_rec *r, apr_pool_t *temp_pool, apr_uint16_t request_id)
This represents the content data of the FastCGI record when the type is AP_FCGI_BEGIN_REQUEST.
Structure to store things which are per connection.
struct apr_bucket_alloc_t * bucket_alloc
Per-directory configuration.
apr_array_header_t * env_fixups
fcgi_backend_t backend_type
unsigned int disablereuse_set
enum proxy_worker_shared::@35 flush_packets
unsigned int io_buffer_size_set
apr_size_t io_buffer_size
unsigned int disablereuse
A structure that represents the current request.
struct ap_filter_t * output_filters
struct ap_filter_t * proto_input_filters
struct ap_filter_t * input_filters
struct ap_conf_vector_t * request_config
apr_table_t * subprocess_env
struct ap_conf_vector_t * per_dir_config
apr_table_t * headers_out
apr_status_t apr_socket_sendv(apr_socket_t *sock, const struct iovec *vec, apr_int32_t nvec, apr_size_t *len)
apr_status_t apr_socket_recv(apr_socket_t *sock, char *buf, apr_size_t *len)
apr_status_t apr_socket_timeout_get(apr_socket_t *sock, apr_interval_time_t *t)
FastCGI protocol definitions and support routines.