mod_proxy.c
来自「apache服务器源代码(版本号:2.2.2)」· C语言 代码 · 共 1,862 行 · 第 1/5 页
C
1,862 行
static const char* cookie_domain(cmd_parms *cmd, void *dconf, const char *f, const char *r){ proxy_dir_conf *conf = dconf; struct proxy_alias *new; new = apr_array_push(conf->cookie_domains); new->fake = f; new->real = r; return NULL;}static const char * set_proxy_exclude(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 noproxy_entry *new; struct noproxy_entry *list = (struct noproxy_entry *) conf->noproxies->elts; struct apr_sockaddr_t *addr; int found = 0; int i; /* Don't duplicate entries */ for (i = 0; i < conf->noproxies->nelts; i++) { if (strcasecmp(arg, list[i].name) == 0) { /* ignore case for host names */ found = 1; } } if (!found) { new = apr_array_push(conf->noproxies); new->name = arg; if (APR_SUCCESS == apr_sockaddr_info_get(&addr, new->name, APR_UNSPEC, 0, 0, parms->pool)) { new->addr = addr; } else { new->addr = NULL; } } 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); if (s < 0) { return "ProxyMaxForwards must be greater or equal to zero.."; } 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 | block"; } 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); } 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){
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?