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

📄 ngx_http_proxy_module.c

📁 nginx 反向代理0.7.1版本 用于实现反向代理
💻 C
📖 第 1 页 / 共 5 页
字号:
static ngx_int_tngx_http_proxy_port_variable(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data){    ngx_http_proxy_ctx_t  *ctx;    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);    if (ctx == NULL) {        v->not_found = 1;        return NGX_OK;    }    v->len = ctx->vars.port.len;    v->valid = 1;    v->no_cacheable = 0;    v->not_found = 0;    v->data = ctx->vars.port.data;    return NGX_OK;}static ngx_int_tngx_http_proxy_add_x_forwarded_for_variable(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data){    u_char  *p;    v->valid = 1;    v->no_cacheable = 0;    v->not_found = 0;    if (r->headers_in.x_forwarded_for == NULL) {        v->len = r->connection->addr_text.len;        v->data = r->connection->addr_text.data;        return NGX_OK;    }    v->len = r->headers_in.x_forwarded_for->value.len             + sizeof(", ") - 1 + r->connection->addr_text.len;    p = ngx_palloc(r->pool, v->len);    if (p == NULL) {        return NGX_ERROR;    }    v->data = p;    p = ngx_copy(p, r->headers_in.x_forwarded_for->value.data,                 r->headers_in.x_forwarded_for->value.len);    *p++ = ','; *p++ = ' ';    ngx_memcpy(p, r->connection->addr_text.data, r->connection->addr_text.len);    return NGX_OK;}static ngx_int_tngx_http_proxy_internal_body_length_variable(ngx_http_request_t *r,    ngx_http_variable_value_t *v, uintptr_t data){    ngx_http_proxy_ctx_t  *ctx;    ctx = ngx_http_get_module_ctx(r, ngx_http_proxy_module);    if (ctx == NULL) {        v->not_found = 1;        return NGX_OK;    }    v->valid = 1;    v->no_cacheable = 0;    v->not_found = 0;    v->data = ngx_palloc(r->connection->pool, NGX_SIZE_T_LEN);    if (v->data == NULL) {        return NGX_ERROR;    }    v->len = ngx_sprintf(v->data, "%uz", ctx->internal_body_length) - v->data;    return NGX_OK;}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.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.hide_headers = NGX_CONF_UNSET_PTR;    conf->upstream.pass_headers = NGX_CONF_UNSET_PTR;    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_uint_t                    i;    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));

⌨️ 快捷键说明

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