- Notifications
You must be signed in to change notification settings - Fork7.4k
HTTP/2 to upstream#771
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
base:master
Are you sure you want to change the base?
Conversation
Uh oh!
There was an error while loading.Please reload this page.
5dedbca
tocc47b74
CompareUh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
Hi@arut, |
66338f9
to63a769c
CompareUh oh!
There was an error while loading.Please reload this page.
We must avoid sending the |
8e79530
toa1c2cd9
CompareThere was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Hi@hongzhidao just some minor things I noticed...
HTTP/2: ngx_http_v2_proxy_module. The module allows to use HTTP/2 protocol for proxying. HTTP/2 proxying is enabled by specifying "proxy_http_version 2.0". ...
Blank line between the subject and body...
...diff --git a/src/http/v2/ngx_http_v2_proxy_module.c b/src/http/v2/ngx_http_v2_proxy_module.cnew file mode 100644index 0000000000..a69ffcc406--- /dev/null+++ b/src/http/v2/ngx_http_v2_proxy_module.c...+ngx_int_t+ngx_http_v2_proxy_handler(ngx_http_request_t *r)+{...+#if (NGX_HTTP_SSL)+ u->ssl = plcf->ssl;++ if (u->ssl) {+ ngx_str_set(&u->schema, "https://");++ } else {+ ngx_str_set(&u->schema, "https://");+ }+#else+ ngx_str_set(&u->schema, "https://");+#endifMaybe I'm not understanding what the checks for 'ssl' here are for but inthe non-ssl cases shouldn't the schema be 'http://' ? (Otherwise all thechecks seem redundant as we set 'https://' regardless...)...+static ngx_int_t+ngx_http_v2_proxy_body_output_filter(void *data, ngx_chain_t *in)+{...+ /*+ * We have already got the response and were sending some additionals/were/we're/+ * control frames. Even if there is still something unsent, stop+ * here anyway.+ */...ngx_http_v2_proxy_parse_frame(ngx_http_request_t *r,+ ngx_http_v2_proxy_ctx_t *ctx, ngx_buf_t *b)+{...+ /* suppress warning */+ case ngx_http_v2_proxy_st_payload:+ case ngx_http_v2_proxy_st_padding:+ break;You could just use 'default:' here. Of course you won't get warned if you addmore enum values and don't handle them, but maybe you aren't planning onadding any more or it's not a concern...+ }...+static ngx_int_t+ngx_http_v2_proxy_parse_header(ngx_http_request_t *r,+ ngx_http_v2_proxy_ctx_t *ctx, ngx_buf_t *b)+{...+ if (state < sw_fragment) {++ if (b->last - b->pos < (ssize_t) ctx->rest) {Or even (ptrdiff_t) to be more explicit about _why_ we're casting...+ last = b->last;...+ if (state == sw_padding) {++ if (b->last - b->pos < (ssize_t) ctx->rest) {... and here ... and likely a few other places...+ ctx->rest -= b->last - b->pos;...
Hi@ac000,
I feel it should be touched again, I'm looking into@arut implementation about the proxy http3.
|
|
Uh oh!
There was an error while loading.Please reload this page.
c32eeeb
to731645c
Compare
Hi@arut, take a look plz, did you mean something like this?
|
Good to learn, I added it into the proxy refactoring patch. |
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
#if (NGX_HTTP_V2) | ||
if (plcf->http_version == NGX_HTTP_VERSION_20) { | ||
if (u.family != AF_UNIX) { | ||
if (u.no_port) { | ||
plcf->host = u.host; | ||
} else { | ||
plcf->host.len = u.host.len + 1 + u.port_text.len; | ||
plcf->host.data = u.host.data; | ||
} | ||
} else { | ||
ngx_str_set(&plcf->host, "localhost"); | ||
} | ||
} | ||
#endif | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
This code is almost identical to what we have inngx_http_proxy_set_vars()
. We can use host fromctx->host_header
. In fact, it's used by default if using HTTP/1 headersngx_http_proxy_headers
/ngx_http_proxy_cache_headers
instead of grpc-specificngx_http_grpc_headers
, which you are already using.
These header sets are not fully compatible though. For example, the following header is empty in HTTP/1:
{ ngx_string("TE"), ngx_string("$grpc_internal_trailers") },
We may think about adding something similar tong_http_proxy_module
, but do it natively, NOT under HTTP/2 ifdef. I think this deserves a separate patch. And I'm not sure if we want client trailers to be sent by default to upstream. Anyway, this looks like a separate feature we can think about later.
Uh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
4ca718e
to87fb0ef
CompareUh oh!
There was an error while loading.Please reload this page.
Uh oh!
There was an error while loading.Please reload this page.
I suggest skipping the paragraph about sibling location, those details don't matter here. |
The refactoring patch has no |
Also, |
This commit is prepared for HTTP/2 and HTTP/3 support.The ALPN protocol is now set per-connection inngx_http_upstream_ssl_init_connection(), allowing proper protocol negotiationfor each individual upstream connection regardless of SSL context sharing.
The module allows to use HTTP/2 protocol for proxying.HTTP/2 proxying is enabled by specifying "proxy_http_version 2.0".Example: server { listen 8000; location / { proxy_http_version 2.0; proxy_passhttps://127.0.0.1:8443; } } server { listen 8443 ssl; http2 on; ssl_certificate certs/example.com.crt; ssl_certificate_key certs/example.com.key; location / { return 200 foo; } }
@@ -1050,7 +937,7 @@ ngx_http_proxy_handler(ngx_http_request_t *r) | |||
} | |||
staticngx_int_t | |||
ngx_int_t | |||
ngx_http_proxy_eval(ngx_http_request_t *r, ngx_http_proxy_ctx_t *ctx, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Hi Roman,
What about changing it like this?
ngx_int_t-ngx_http_proxy_eval(ngx_http_request_t *r, ngx_http_proxy_ctx_t *ctx,+ngx_http_proxy_eval(ngx_http_request_t *r, ngx_http_proxy_vars_t *vars, ngx_http_proxy_loc_conf_t *plcf) { u_char *p;@@ -1015,9 +1015,9 @@ ngx_http_proxy_eval(ngx_http_request_t *r, ngx_http_proxy_ctx_t *ctx, } }- ctx->vars.key_start = u->schema;+ vars->key_start = u->schema;- ngx_http_proxy_set_vars(&url, &ctx->vars);+ ngx_http_proxy_set_vars(&url, vars); u->resolved = ngx_pcalloc(r->pool, sizeof(ngx_http_upstream_resolved_t)); if (u->resolved == NULL) {
Uh oh!
There was an error while loading.Please reload this page.
TODO:
buffering
cache