📄 mod_proxy.c
字号:
} return NULL;}/* * Set the ports CONNECT can use */static const char * set_allowed_ports(cmd_parms *parms, void *dummy, const char *arg){ server_rec *s = parms->server; proxy_server_conf *conf = ap_get_module_config(s->module_config, &proxy_module); int *New; if (!apr_isdigit(arg[0])) return "AllowCONNECT: port number must be numeric"; New = apr_array_push(conf->allowed_connect_ports); *New = atoi(arg); return NULL;}/* Similar to set_proxy_exclude(), but defining directly connected hosts, * which should never be accessed via the configured ProxyRemote servers */static const char * set_proxy_dirconn(cmd_parms *parms, void *dummy, const char *arg){ server_rec *s = parms->server; proxy_server_conf *conf = ap_get_module_config(s->module_config, &proxy_module); struct dirconn_entry *New; struct dirconn_entry *list = (struct dirconn_entry *) conf->dirconn->elts; int found = 0; int i; /* Don't duplicate entries */ for (i = 0; i < conf->dirconn->nelts; i++) { if (strcasecmp(arg, list[i].name) == 0) found = 1; } if (!found) { New = apr_array_push(conf->dirconn); New->name = apr_pstrdup(parms->pool, arg); New->hostaddr = NULL; if (ap_proxy_is_ipaddr(New, parms->pool)) {#if DEBUGGING ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, "Parsed addr %s", inet_ntoa(New->addr)); ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, "Parsed mask %s", inet_ntoa(New->mask));#endif } else if (ap_proxy_is_domainname(New, parms->pool)) { ap_str_tolower(New->name);#if DEBUGGING ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, "Parsed domain %s", New->name);#endif } else if (ap_proxy_is_hostname(New, parms->pool)) { ap_str_tolower(New->name);#if DEBUGGING ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, "Parsed host %s", New->name);#endif } else { ap_proxy_is_word(New, parms->pool);#if DEBUGGING fprintf(stderr, "Parsed word %s\n", New->name);#endif } } return NULL;}static const char * set_proxy_domain(cmd_parms *parms, void *dummy, const char *arg){ proxy_server_conf *psf = ap_get_module_config(parms->server->module_config, &proxy_module); if (arg[0] != '.') return "ProxyDomain: domain name must start with a dot."; psf->domain = arg; return NULL;}static const char * set_proxy_req(cmd_parms *parms, void *dummy, int flag){ proxy_server_conf *psf = ap_get_module_config(parms->server->module_config, &proxy_module); psf->req = flag; psf->req_set = 1; if (flag && !psf->forward) { psf->forward = ap_proxy_create_worker(parms->pool); psf->forward->name = "proxy:forward"; psf->forward->hostname = "*"; psf->forward->scheme = "*"; } return NULL;}static const char * set_proxy_error_override(cmd_parms *parms, void *dummy, int flag){ proxy_server_conf *psf = ap_get_module_config(parms->server->module_config, &proxy_module); psf->error_override = flag; psf->error_override_set = 1; return NULL;}static const char * set_preserve_host(cmd_parms *parms, void *dummy, int flag){ proxy_server_conf *psf = ap_get_module_config(parms->server->module_config, &proxy_module); psf->preserve_host = flag; psf->preserve_host_set = 1; return NULL;}static const char * set_recv_buffer_size(cmd_parms *parms, void *dummy, const char *arg){ proxy_server_conf *psf = ap_get_module_config(parms->server->module_config, &proxy_module); int s = atoi(arg); if (s < 512 && s != 0) { return "ProxyReceiveBufferSize must be >= 512 bytes, or 0 for system default."; } psf->recv_buffer_size = s; psf->recv_buffer_size_set = 1; return NULL;}static const char * set_io_buffer_size(cmd_parms *parms, void *dummy, const char *arg){ proxy_server_conf *psf = ap_get_module_config(parms->server->module_config, &proxy_module); long s = atol(arg); psf->io_buffer_size = ((s > AP_IOBUFSIZE) ? s : AP_IOBUFSIZE); psf->io_buffer_size_set = 1; return NULL;}static const char * set_max_forwards(cmd_parms *parms, void *dummy, const char *arg){ proxy_server_conf *psf = ap_get_module_config(parms->server->module_config, &proxy_module); long s = atol(arg); psf->maxfwd = s; psf->maxfwd_set = 1; return NULL;}static const char* set_proxy_timeout(cmd_parms *parms, void *dummy, const char *arg){ proxy_server_conf *psf = ap_get_module_config(parms->server->module_config, &proxy_module); int timeout; timeout=atoi(arg); if (timeout<1) { return "Proxy Timeout must be at least 1 second."; } psf->timeout_set=1; psf->timeout=apr_time_from_sec(timeout); return NULL;}static const char* set_via_opt(cmd_parms *parms, void *dummy, const char *arg){ proxy_server_conf *psf = ap_get_module_config(parms->server->module_config, &proxy_module); if (strcasecmp(arg, "Off") == 0) psf->viaopt = via_off; else if (strcasecmp(arg, "On") == 0) psf->viaopt = via_on; else if (strcasecmp(arg, "Block") == 0) psf->viaopt = via_block; else if (strcasecmp(arg, "Full") == 0) psf->viaopt = via_full; else { return "ProxyVia must be one of: " "off | on | full | block"; } psf->viaopt_set = 1; return NULL;}static const char* set_bad_opt(cmd_parms *parms, void *dummy, const char *arg){ proxy_server_conf *psf = ap_get_module_config(parms->server->module_config, &proxy_module); if (strcasecmp(arg, "IsError") == 0) psf->badopt = bad_error; else if (strcasecmp(arg, "Ignore") == 0) psf->badopt = bad_ignore; else if (strcasecmp(arg, "StartBody") == 0) psf->badopt = bad_body; else { return "ProxyBadHeader must be one of: " "IsError | Ignore | StartBody"; } psf->badopt_set = 1; return NULL;}static const char* set_status_opt(cmd_parms *parms, void *dummy, const char *arg){ proxy_server_conf *psf = ap_get_module_config(parms->server->module_config, &proxy_module); if (strcasecmp(arg, "Off") == 0) psf->proxy_status = status_off; else if (strcasecmp(arg, "On") == 0) psf->proxy_status = status_on; else if (strcasecmp(arg, "Full") == 0) psf->proxy_status = status_full; else { return "ProxyStatus must be one of: " "off | on | full"; } psf->proxy_status_set = 1; return NULL;}static const char *add_member(cmd_parms *cmd, void *dummy, const char *arg){ server_rec *s = cmd->server; proxy_server_conf *conf = ap_get_module_config(s->module_config, &proxy_module); proxy_balancer *balancer; proxy_worker *worker; char *path = cmd->path; char *name = NULL; char *word; apr_table_t *params = apr_table_make(cmd->pool, 5); const apr_array_header_t *arr; const apr_table_entry_t *elts; int i; if (cmd->path) path = apr_pstrdup(cmd->pool, cmd->path); while (*arg) { word = ap_getword_conf(cmd->pool, &arg); if (!path) path = word; else if (!name) name = word; else { char *val = strchr(word, '='); if (!val) if (cmd->path) return "BalancerMember can not have a balancer name when defined in a location"; else return "Invalid BalancerMember parameter. Parameter must " "be in the form 'key=value'"; else *val++ = '\0'; apr_table_setn(params, word, val); } } if (!path) return "BalancerMember must define balancer name when outside <Proxy > section"; if (!name) return "BalancerMember must define remote proxy server"; ap_str_tolower(path); /* lowercase scheme://hostname */ /* Try to find existing worker */ worker = ap_proxy_get_worker(cmd->temp_pool, conf, name); if (!worker) { const char *err; if ((err = ap_proxy_add_worker(&worker, cmd->pool, conf, name)) != NULL) return apr_pstrcat(cmd->temp_pool, "BalancerMember ", err, NULL); } else { ap_log_error(APLOG_MARK, APLOG_WARNING, 0, cmd->server, "worker %s already used by another worker", worker->name); } PROXY_COPY_CONF_PARAMS(worker, conf); arr = apr_table_elts(params); elts = (const apr_table_entry_t *)arr->elts; for (i = 0; i < arr->nelts; i++) { const char *err = set_worker_param(cmd->pool, worker, elts[i].key, elts[i].val); if (err) return apr_pstrcat(cmd->temp_pool, "BalancerMember ", err, NULL); } /* Try to find the balancer */ balancer = ap_proxy_get_balancer(cmd->temp_pool, conf, path); if (!balancer) { const char *err = ap_proxy_add_balancer(&balancer, cmd->pool, conf, path); if (err) return apr_pstrcat(cmd->temp_pool, "BalancerMember ", err, NULL); } /* Add the worker to the load balancer */ ap_proxy_add_worker_to_balancer(cmd->pool, balancer, worker); return NULL;}static const char * set_proxy_param(cmd_parms *cmd, void *dummy, const char *arg){ server_rec *s = cmd->server; proxy_server_conf *conf = (proxy_server_conf *) ap_get_module_config(s->module_config, &proxy_module); char *name = NULL; char *word, *val; proxy_balancer *balancer = NULL; proxy_worker *worker = NULL; const char *err; int in_proxy_section = 0; if (cmd->directive->parent && strncasecmp(cmd->directive->parent->directive, "<Proxy", 6) == 0) { const char *pargs = cmd->directive->parent->args; /* Directive inside <Proxy section * Parent directive arg is the worker/balancer name. */ name = ap_getword_conf(cmd->temp_pool, &pargs); if ((word = ap_strchr(name, '>'))) *word = '\0'; in_proxy_section = 1; } else { /* Standard set directive with worker/balancer * name as first param. */ name = ap_getword_conf(cmd->temp_pool, &arg); } if (strncasecmp(name, "balancer:", 9) == 0) { balancer = ap_proxy_get_balancer(cmd->pool, conf, name); if (!balancer) { if (in_proxy_section) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -