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

📄 ngx_http_proxy_module.c

📁 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器
💻 C
📖 第 1 页 / 共 5 页
字号:
static ngx_int_tngx_http_proxy_rewrite_redirect(ngx_http_request_t *r, ngx_table_elt_t *h,    size_t prefix){    ngx_int_t                   rc;    ngx_uint_t                  i;    ngx_http_proxy_loc_conf_t  *plcf;    ngx_http_proxy_redirect_t  *pr;    plcf = ngx_http_get_module_loc_conf(r, ngx_http_proxy_module);    pr = plcf->redirects->elts;    if (pr == NULL) {        return NGX_DECLINED;    }    for (i = 0; i < plcf->redirects->nelts; i++) {        rc = pr[i].handler(r, h, prefix, &pr[i]);        if (rc != NGX_DECLINED) {            return rc;        }    }    return NGX_DECLINED;}static ngx_int_tngx_http_proxy_rewrite_redirect_text(ngx_http_request_t *r, ngx_table_elt_t *h,    size_t prefix, ngx_http_proxy_redirect_t *pr){    size_t   len;    u_char  *data, *p;    if (pr->redirect.len > h->value.len - prefix        || ngx_rstrncmp(h->value.data + prefix, pr->redirect.data,                        pr->redirect.len) != 0)    {        return NGX_DECLINED;    }    len = prefix + pr->replacement.text.len + h->value.len - pr->redirect.len;    data = ngx_palloc(r->pool, len);    if (data == NULL) {        return NGX_ERROR;    }    p = data;    p = ngx_copy(p, h->value.data, prefix);    if (pr->replacement.text.len) {        p = ngx_copy(p, pr->replacement.text.data, pr->replacement.text.len);    }    ngx_memcpy(p, h->value.data + prefix + pr->redirect.len,               h->value.len - pr->redirect.len - prefix);    h->value.len = len;    h->value.data = data;    return NGX_OK;}static ngx_int_tngx_http_proxy_rewrite_redirect_vars(ngx_http_request_t *r, ngx_table_elt_t *h,    size_t prefix, ngx_http_proxy_redirect_t *pr){    size_t                        len;    u_char                       *data, *p;    ngx_http_script_code_pt       code;    ngx_http_script_engine_t      e;    ngx_http_script_len_code_pt   lcode;    if (pr->redirect.len > h->value.len - prefix        || ngx_rstrncmp(h->value.data + prefix, pr->redirect.data,                        pr->redirect.len) != 0)    {        return NGX_DECLINED;    }    ngx_memzero(&e, sizeof(ngx_http_script_engine_t));    e.ip = pr->replacement.vars.lengths;    e.request = r;    len = prefix + h->value.len - pr->redirect.len;    while (*(uintptr_t *) e.ip) {        lcode = *(ngx_http_script_len_code_pt *) e.ip;        len += lcode(&e);    }    data = ngx_palloc(r->pool, len);    if (data == NULL) {        return NGX_ERROR;    }    p = data;    p = ngx_copy(p, h->value.data, prefix);    e.ip = pr->replacement.vars.values;    e.pos = p;    while (*(uintptr_t *) e.ip) {        code = *(ngx_http_script_code_pt *) e.ip;        code(&e);    }    ngx_memcpy(e.pos, h->value.data + prefix + pr->redirect.len,               h->value.len - pr->redirect.len - prefix);    h->value.len = len;    h->value.data = data;    return NGX_OK;}static ngx_int_tngx_http_proxy_add_variables(ngx_conf_t *cf){    ngx_http_variable_t  *var, *v;    for (v = ngx_http_proxy_vars; v->name.len; v++) {        var = ngx_http_add_variable(cf, &v->name, v->flags);        if (var == NULL) {            return NGX_ERROR;        }        var->get_handler = v->get_handler;        var->data = v->data;    }    return NGX_OK;}static void *ngx_http_proxy_create_loc_conf(ngx_conf_t *cf){    ngx_http_proxy_loc_conf_t  *conf;    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_proxy_loc_conf_t));    if (conf == NULL) {        return NGX_CONF_ERROR;    }    /*     * set by ngx_pcalloc():     *     *     conf->upstream.bufs.num = 0;     *     conf->upstream.next_upstream = 0;     *     conf->upstream.temp_path = NULL;     *     conf->upstream.hide_headers_hash = { NULL, 0 };     *     conf->upstream.hide_headers = NULL;     *     conf->upstream.pass_headers = NULL;     *     conf->upstream.schema = { 0, NULL };     *     conf->upstream.uri = { 0, NULL };     *     conf->upstream.location = NULL;     *     conf->upstream.store_lengths = NULL;     *     conf->upstream.store_values = NULL;     *     *     conf->method = NULL;     *     conf->headers_source = NULL;     *     conf->headers_set_len = NULL;     *     conf->headers_set = NULL;     *     conf->headers_set_hash = NULL;     *     conf->body_set_len = NULL;     *     conf->body_set = NULL;     *     conf->body_source = { 0, NULL };     *     conf->rewrite_locations = NULL;     */    conf->upstream.store = NGX_CONF_UNSET;    conf->upstream.store_access = NGX_CONF_UNSET_UINT;    conf->upstream.buffering = NGX_CONF_UNSET;    conf->upstream.ignore_client_abort = NGX_CONF_UNSET;    conf->upstream.connect_timeout = NGX_CONF_UNSET_MSEC;    conf->upstream.send_timeout = NGX_CONF_UNSET_MSEC;    conf->upstream.read_timeout = NGX_CONF_UNSET_MSEC;    conf->upstream.send_lowat = NGX_CONF_UNSET_SIZE;    conf->upstream.buffer_size = NGX_CONF_UNSET_SIZE;    conf->upstream.busy_buffers_size_conf = NGX_CONF_UNSET_SIZE;    conf->upstream.max_temp_file_size_conf = NGX_CONF_UNSET_SIZE;    conf->upstream.temp_file_write_size_conf = NGX_CONF_UNSET_SIZE;    conf->upstream.pass_request_headers = NGX_CONF_UNSET;    conf->upstream.pass_request_body = NGX_CONF_UNSET;    conf->upstream.intercept_errors = NGX_CONF_UNSET;    /* "proxy_cyclic_temp_file" is disabled */    conf->upstream.cyclic_temp_file = 0;    conf->redirect = NGX_CONF_UNSET;    conf->upstream.change_buffering = 1;    conf->headers_hash_max_size = NGX_CONF_UNSET_UINT;    conf->headers_hash_bucket_size = NGX_CONF_UNSET_UINT;    return conf;}static char *ngx_http_proxy_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child){    ngx_http_proxy_loc_conf_t *prev = parent;    ngx_http_proxy_loc_conf_t *conf = child;    u_char                       *p;    size_t                        size;    uintptr_t                    *code;    ngx_str_t                    *header;    ngx_uint_t                    i, j;    ngx_array_t                   hide_headers;    ngx_keyval_t                 *src, *s, *h;    ngx_hash_key_t               *hk;    ngx_hash_init_t               hash;    ngx_http_proxy_redirect_t    *pr;    ngx_http_script_compile_t     sc;    ngx_http_script_copy_code_t  *copy;    if (conf->upstream.store != 0) {        ngx_conf_merge_value(conf->upstream.store,                                  prev->upstream.store, 0);        if (conf->upstream.store_lengths == NULL) {            conf->upstream.store_lengths = prev->upstream.store_lengths;            conf->upstream.store_values = prev->upstream.store_values;        }    }    ngx_conf_merge_uint_value(conf->upstream.store_access,                              prev->upstream.store_access, 0600);    ngx_conf_merge_value(conf->upstream.buffering,                              prev->upstream.buffering, 1);    ngx_conf_merge_value(conf->upstream.ignore_client_abort,                              prev->upstream.ignore_client_abort, 0);    ngx_conf_merge_msec_value(conf->upstream.connect_timeout,                              prev->upstream.connect_timeout, 60000);    ngx_conf_merge_msec_value(conf->upstream.send_timeout,                              prev->upstream.send_timeout, 60000);    ngx_conf_merge_msec_value(conf->upstream.read_timeout,                              prev->upstream.read_timeout, 60000);    ngx_conf_merge_size_value(conf->upstream.send_lowat,                              prev->upstream.send_lowat, 0);    ngx_conf_merge_size_value(conf->upstream.buffer_size,                              prev->upstream.buffer_size,                              (size_t) ngx_pagesize);    ngx_conf_merge_bufs_value(conf->upstream.bufs, prev->upstream.bufs,                              8, ngx_pagesize);    if (conf->upstream.bufs.num < 2) {        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,                           "there must be at least 2 \"proxy_buffers\"");        return NGX_CONF_ERROR;    }    size = conf->upstream.buffer_size;    if (size < conf->upstream.bufs.size) {        size = conf->upstream.bufs.size;    }    ngx_conf_merge_size_value(conf->upstream.busy_buffers_size_conf,                              prev->upstream.busy_buffers_size_conf,                              NGX_CONF_UNSET_SIZE);    if (conf->upstream.busy_buffers_size_conf == NGX_CONF_UNSET_SIZE) {        conf->upstream.busy_buffers_size = 2 * size;    } else {        conf->upstream.busy_buffers_size =                                         conf->upstream.busy_buffers_size_conf;    }    if (conf->upstream.busy_buffers_size < size) {        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,             "\"proxy_busy_buffers_size\" must be equal or bigger than "             "maximum of the value of \"proxy_buffer_size\" and "             "one of the \"proxy_buffers\"");        return NGX_CONF_ERROR;    }    if (conf->upstream.busy_buffers_size        > (conf->upstream.bufs.num - 1) * conf->upstream.bufs.size)    {        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,             "\"proxy_busy_buffers_size\" must be less than "             "the size of all \"proxy_buffers\" minus one buffer");        return NGX_CONF_ERROR;    }    ngx_conf_merge_size_value(conf->upstream.temp_file_write_size_conf,                              prev->upstream.temp_file_write_size_conf,                              NGX_CONF_UNSET_SIZE);    if (conf->upstream.temp_file_write_size_conf == NGX_CONF_UNSET_SIZE) {        conf->upstream.temp_file_write_size = 2 * size;    } else {        conf->upstream.temp_file_write_size =                                      conf->upstream.temp_file_write_size_conf;    }    if (conf->upstream.temp_file_write_size < size) {        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,             "\"proxy_temp_file_write_size\" must be equal or bigger than "             "maximum of the value of \"proxy_buffer_size\" and "             "one of the \"proxy_buffers\"");        return NGX_CONF_ERROR;    }    ngx_conf_merge_size_value(conf->upstream.max_temp_file_size_conf,                              prev->upstream.max_temp_file_size_conf,                              NGX_CONF_UNSET_SIZE);    if (conf->upstream.max_temp_file_size_conf == NGX_CONF_UNSET_SIZE) {        conf->upstream.max_temp_file_size = 1024 * 1024 * 1024;    } else {        conf->upstream.max_temp_file_size =                                        conf->upstream.max_temp_file_size_conf;    }    if (conf->upstream.max_temp_file_size != 0        && conf->upstream.max_temp_file_size < size)    {        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,             "\"proxy_max_temp_file_size\" must be equal to zero to disable "             "the temporary files usage or must be equal or bigger than "             "maximum of the value of \"proxy_buffer_size\" and "             "one of the \"proxy_buffers\"");        return NGX_CONF_ERROR;    }    ngx_conf_merge_bitmask_value(conf->upstream.next_upstream,                              prev->upstream.next_upstream,                              (NGX_CONF_BITMASK_SET                               |NGX_HTTP_UPSTREAM_FT_ERROR                               |NGX_HTTP_UPSTREAM_FT_TIMEOUT));    if (conf->upstream.next_upstream & NGX_HTTP_UPSTREAM_FT_OFF) {        conf->upstream.next_upstream = NGX_CONF_BITMASK_SET                                       |NGX_HTTP_UPSTREAM_FT_OFF;    }    ngx_conf_merge_path_value(conf->upstream.temp_path,                              prev->upstream.temp_path,                              NGX_HTTP_PROXY_TEMP_PATH, 1, 2, 0,                              ngx_garbage_collector_temp_handler, cf);    if (conf->method.len == 0) {        conf->method = prev->method;    } else {        conf->method.data[conf->method.len] = ' ';        conf->method.len++;    }    ngx_conf_merge_value(conf->upstream.pass_request_headers,                              prev->upstream.pass_request_headers, 1);    ngx_conf_merge_value(conf->upstream.pass_request_body,                              prev->upstream.pass_request_body, 1);    ngx_conf_merge_value(conf->upstream.intercept_errors,                              prev->upstream.intercept_errors, 0);    ngx_conf_merge_value(conf->redirect, prev->redirect, 1);    if (conf->redirect) {        if (conf->redirects == NULL) {            conf->redirects = prev->redirects;        }        if (conf->redirects == NULL && conf->upstream.url.data) {            conf->redirects = ngx_array_create(cf->pool, 1,                                            sizeof(ngx_http_proxy_redirect_t));            if (conf->redirects == NULL) {                return NGX_CONF_ERROR;            }            pr = ngx_array_push(conf->redirects);            if (pr == NULL) {                return NGX_CONF_ERROR;            }            pr->handler = ngx_http_proxy_rewrite_redirect_text;            pr->redirect = conf->upstream.url;            if (conf->upstream.uri.len) {                pr->replacement.text = conf->upstream.location;            } else {                pr->replacement.text.len = 0;                pr->replacement.text.data = NULL;            }        }    }    ngx_conf_merge_uint_value(conf->headers_hash_max_size,                              prev->headers_hash_max_size, 512);    ngx_conf_merge_uint_value(conf->headers_hash_bucket_size,                              prev->headers_hash_bucket_size, 64);    conf->headers_hash_bucket_size = ngx_align(conf->headers_hash_bucket_size,                                               ngx_cacheline_size);    if (conf->upstream.hide_headers == NULL        && conf->upstream.pass_headers == NULL)    {        conf->upstream.hide_headers = prev->upstream.hide_headers;        conf->upstream.pass_headers = prev->upstream.pass_headers;        conf->upstream.hide_headers_hash = prev->upstream.hide_headers_hash;        if (conf->upstream.hide_headers_hash.buckets) {            goto peers;        }    } else {        if (conf->upstream.hide_headers == NULL) {            conf->upstream.hide_headers = prev->upstream.hide_headers;        }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -