⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mod_proxy.c

📁 Apache官方在今天放出产品系列2.2的最新版本2.2.11的源码包 最流行的HTTP服务器软件之一
💻 C
📖 第 1 页 / 共 5 页
字号:
    }    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 + -