Changeset 7619:6439ef81e37d in nginx


Ignore:
Timestamp:
01/17/20 09:13:02 (5 weeks ago)
Author:
Vladimir Homutov <vl@…>
Branch:
default
Phase:
public
Message:

gRPC: variables support in the "grpc_pass" directive.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/http/modules/ngx_http_grpc_module.c

    r7473 r7619  
    2727    ngx_str_t                  host;
    2828    ngx_uint_t                 host_set;
     29
     30    ngx_array_t               *grpc_lengths;
     31    ngx_array_t               *grpc_values;
    2932
    3033#if (NGX_HTTP_SSL)
     
    120123
    121124    ngx_http_request_t        *request;
     125
     126    ngx_str_t                  host;
    122127} ngx_http_grpc_ctx_t;
    123128
     
    136141
    137142
     143static ngx_int_t ngx_http_grpc_eval(ngx_http_request_t *r,
     144    ngx_http_grpc_ctx_t *ctx, ngx_http_grpc_loc_conf_t *glcf);
    138145static ngx_int_t ngx_http_grpc_create_request(ngx_http_request_t *r);
    139146static ngx_int_t ngx_http_grpc_reinit_request(ngx_http_request_t *r);
     
    525532    }
    526533
     534    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_grpc_ctx_t));
     535    if (ctx == NULL) {
     536        return NGX_HTTP_INTERNAL_SERVER_ERROR;
     537    }
     538
     539    ctx->request = r;
     540
     541    ngx_http_set_ctx(r, ctx, ngx_http_grpc_module);
     542
    527543    glcf = ngx_http_get_module_loc_conf(r, ngx_http_grpc_module);
    528544
    529545    u = r->upstream;
    530546
     547    if (glcf->grpc_lengths == NULL) {
     548        ctx->host = glcf->host;
     549
    531550#if (NGX_HTTP_SSL)
    532     u->ssl = (glcf->upstream.ssl != NULL);
    533 
    534     if (u->ssl) {
    535         ngx_str_set(&u->schema, "grpcs://");
     551        u->ssl = (glcf->upstream.ssl != NULL);
     552
     553        if (u->ssl) {
     554            ngx_str_set(&u->schema, "grpcs://");
     555
     556        } else {
     557            ngx_str_set(&u->schema, "grpc://");
     558        }
     559#else
     560        ngx_str_set(&u->schema, "grpc://");
     561#endif
    536562
    537563    } else {
    538         ngx_str_set(&u->schema, "grpc://");
    539     }
    540 #else
    541     ngx_str_set(&u->schema, "grpc://");
    542 #endif
     564        if (ngx_http_grpc_eval(r, ctx, glcf) != NGX_OK) {
     565            return NGX_HTTP_INTERNAL_SERVER_ERROR;
     566        }
     567    }
    543568
    544569    u->output.tag = (ngx_buf_tag_t) &ngx_http_grpc_module;
     
    552577    u->finalize_request = ngx_http_grpc_finalize_request;
    553578
    554     ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_grpc_ctx_t));
    555     if (ctx == NULL) {
    556         return NGX_HTTP_INTERNAL_SERVER_ERROR;
    557     }
    558 
    559     ctx->request = r;
    560 
    561     ngx_http_set_ctx(r, ctx, ngx_http_grpc_module);
    562 
    563579    u->input_filter_init = ngx_http_grpc_filter_init;
    564580    u->input_filter = ngx_http_grpc_filter;
     
    574590
    575591    return NGX_DONE;
     592}
     593
     594
     595static ngx_int_t
     596ngx_http_grpc_eval(ngx_http_request_t *r, ngx_http_grpc_ctx_t *ctx,
     597    ngx_http_grpc_loc_conf_t *glcf)
     598{
     599    size_t                add;
     600    ngx_url_t             url;
     601    ngx_http_upstream_t  *u;
     602
     603    ngx_memzero(&url, sizeof(ngx_url_t));
     604
     605    if (ngx_http_script_run(r, &url.url, glcf->grpc_lengths->elts, 0,
     606                            glcf->grpc_values->elts)
     607        == NULL)
     608    {
     609        return NGX_ERROR;
     610    }
     611
     612    if (url.url.len > 7
     613        && ngx_strncasecmp(url.url.data, (u_char *) "grpc://", 7) == 0)
     614    {
     615        add = 7;
     616
     617    } else if (url.url.len > 8
     618               && ngx_strncasecmp(url.url.data, (u_char *) "grpcs://", 8) == 0)
     619    {
     620
     621#if (NGX_HTTP_SSL)
     622        add = 8;
     623        r->upstream->ssl = 1;
     624#else
     625        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
     626                      "grpcs protocol requires SSL support");
     627        return NGX_ERROR;
     628#endif
     629
     630    } else {
     631        add = 0;
     632    }
     633
     634    u = r->upstream;
     635
     636    if (add) {
     637        u->schema.len = add;
     638        u->schema.data = url.url.data;
     639
     640        url.url.data += add;
     641        url.url.len -= add;
     642
     643    } else {
     644        ngx_str_set(&u->schema, "grpc://");
     645    }
     646
     647    url.no_resolve = 1;
     648
     649    if (ngx_parse_url(r->pool, &url) != NGX_OK) {
     650        if (url.err) {
     651            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
     652                          "%s in upstream \"%V\"", url.err, &url.url);
     653        }
     654
     655        return NGX_ERROR;
     656    }
     657
     658    u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t));
     659    if (u->resolved == NULL) {
     660        return NGX_ERROR;
     661    }
     662
     663    if (url.addrs) {
     664        u->resolved->sockaddr = url.addrs[0].sockaddr;
     665        u->resolved->socklen = url.addrs[0].socklen;
     666        u->resolved->name = url.addrs[0].name;
     667        u->resolved->naddrs = 1;
     668    }
     669
     670    u->resolved->host = url.host;
     671    u->resolved->port = url.port;
     672    u->resolved->no_port = url.no_port;
     673
     674    if (url.family != AF_UNIX) {
     675
     676        if (url.no_port) {
     677            ctx->host = url.host;
     678
     679        } else {
     680            ctx->host.len = url.host.len + 1 + url.port_text.len;
     681            ctx->host.data = url.host.data;
     682        }
     683
     684    } else {
     685        ngx_str_set(&ctx->host, "localhost");
     686    }
     687
     688    return NGX_OK;
    576689}
    577690
     
    588701    ngx_list_part_t              *part;
    589702    ngx_table_elt_t              *header;
     703    ngx_http_grpc_ctx_t          *ctx;
    590704    ngx_http_upstream_t          *u;
    591705    ngx_http_grpc_frame_t        *f;
     
    599713    glcf = ngx_http_get_module_loc_conf(r, ngx_http_grpc_module);
    600714
     715    ctx = ngx_http_get_module_ctx(r, ngx_http_grpc_module);
     716
    601717    len = sizeof(ngx_http_grpc_connection_start) - 1
    602718          + sizeof(ngx_http_grpc_frame_t);             /* headers frame */
     
    638754
    639755    if (!glcf->host_set) {
    640         len += 1 + NGX_HTTP_V2_INT_OCTETS + glcf->host.len;
    641 
    642         if (tmp_len < glcf->host.len) {
    643             tmp_len = glcf->host.len;
     756        len += 1 + NGX_HTTP_V2_INT_OCTETS + ctx->host.len;
     757
     758        if (tmp_len < ctx->host.len) {
     759            tmp_len = ctx->host.len;
    644760        }
    645761    }
     
    786902
    787903#if (NGX_HTTP_SSL)
    788     if (glcf->ssl) {
     904    if (u->ssl) {
    789905        *b->last++ = ngx_http_v2_indexed(NGX_HTTP_V2_SCHEME_HTTPS_INDEX);
    790906
     
    847963    if (!glcf->host_set) {
    848964        *b->last++ = ngx_http_v2_inc_indexed(NGX_HTTP_V2_AUTHORITY_INDEX);
    849         b->last = ngx_http_v2_write_value(b->last, glcf->host.data,
    850                                           glcf->host.len, tmp);
     965        b->last = ngx_http_v2_write_value(b->last, ctx->host.data,
     966                                          ctx->host.len, tmp);
    851967
    852968        ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
    853                        "grpc header: \":authority: %V\"", &glcf->host);
     969                       "grpc header: \":authority: %V\"", &ctx->host);
    854970    }
    855971
     
    43204436    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
    43214437
    4322     if (clcf->noname && conf->upstream.upstream == NULL) {
     4438    if (clcf->noname
     4439        && conf->upstream.upstream == NULL && conf->grpc_lengths == NULL)
     4440    {
    43234441        conf->upstream.upstream = prev->upstream.upstream;
    43244442        conf->host = prev->host;
     4443
     4444        conf->grpc_lengths = prev->grpc_lengths;
     4445        conf->grpc_values = prev->grpc_values;
     4446
    43254447#if (NGX_HTTP_SSL)
    43264448        conf->upstream.ssl = prev->upstream.ssl;
     
    43284450    }
    43294451
    4330     if (clcf->lmt_excpt && clcf->handler == NULL && conf->upstream.upstream) {
     4452    if (clcf->lmt_excpt && clcf->handler == NULL
     4453        && (conf->upstream.upstream || conf->grpc_lengths))
     4454    {
    43314455        clcf->handler = ngx_http_grpc_handler;
    43324456    }
     
    45384662    ngx_http_grpc_loc_conf_t *glcf = conf;
    45394663
    4540     size_t                     add;
    4541     ngx_str_t                 *value, *url;
    4542     ngx_url_t                  u;
    4543     ngx_http_core_loc_conf_t  *clcf;
    4544 
    4545     if (glcf->upstream.upstream) {
     4664    size_t                      add;
     4665    ngx_str_t                  *value, *url;
     4666    ngx_url_t                   u;
     4667    ngx_uint_t                  n;
     4668    ngx_http_core_loc_conf_t   *clcf;
     4669    ngx_http_script_compile_t   sc;
     4670
     4671    if (glcf->upstream.upstream || glcf->grpc_lengths) {
    45464672        return "is duplicate";
    45474673    }
    45484674
     4675    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
     4676
     4677    clcf->handler = ngx_http_grpc_handler;
     4678
     4679    if (clcf->name.len && clcf->name.data[clcf->name.len - 1] == '/') {
     4680        clcf->auto_redirect = 1;
     4681    }
     4682
    45494683    value = cf->args->elts;
     4684
    45504685    url = &value[1];
     4686
     4687    n = ngx_http_script_variables_count(url);
     4688
     4689    if (n) {
     4690
     4691        ngx_memzero(&sc, sizeof(ngx_http_script_compile_t));
     4692
     4693        sc.cf = cf;
     4694        sc.source = url;
     4695        sc.lengths = &glcf->grpc_lengths;
     4696        sc.values = &glcf->grpc_values;
     4697        sc.variables = n;
     4698        sc.complete_lengths = 1;
     4699        sc.complete_values = 1;
     4700
     4701        if (ngx_http_script_compile(&sc) != NGX_OK) {
     4702            return NGX_CONF_ERROR;
     4703        }
     4704
     4705#if (NGX_HTTP_SSL)
     4706        glcf->ssl = 1;
     4707#endif
     4708
     4709        return NGX_CONF_OK;
     4710    }
    45514711
    45524712    if (ngx_strncasecmp(url->data, (u_char *) "grpc://", 7) == 0) {
     
    45924752    } else {
    45934753        ngx_str_set(&glcf->host, "localhost");
    4594     }
    4595 
    4596     clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
    4597 
    4598     clcf->handler = ngx_http_grpc_handler;
    4599 
    4600     if (clcf->name.len && clcf->name.data[clcf->name.len - 1] == '/') {
    4601         clcf->auto_redirect = 1;
    46024754    }
    46034755
Note: See TracChangeset for help on using the changeset viewer.