Welcome! Log In Create A New Profile

Advanced

[njs] Fetch: insuring Host header is always the first header.

Dmitry Volyntsev
May 11, 2023 12:28AM
details: https://hg.nginx.org/njs/rev/89c821242caf
branches:
changeset: 2114:89c821242caf
user: Dmitry Volyntsev <xeioex@nginx.com>
date: Tue May 09 22:09:13 2023 -0700
description:
Fetch: insuring Host header is always the first header.

diffstat:

nginx/ngx_js_fetch.c | 49 +++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 45 insertions(+), 4 deletions(-)

diffs (79 lines):

diff -r 4aed0532158c -r 89c821242caf nginx/ngx_js_fetch.c
--- a/nginx/ngx_js_fetch.c Tue May 09 22:09:13 2023 -0700
+++ b/nginx/ngx_js_fetch.c Tue May 09 22:09:13 2023 -0700
@@ -658,6 +658,7 @@ ngx_js_ext_fetch(njs_vm_t *vm, njs_value
njs_int_t ret;
ngx_url_t u;
ngx_uint_t i;
+ njs_bool_t has_host;
ngx_pool_t *pool;
njs_value_t *init, *value;
ngx_js_http_t *http;
@@ -746,10 +747,42 @@ ngx_js_ext_fetch(njs_vm_t *vm, njs_value
njs_chb_append(&http->chain, u.uri.data, u.uri.len);
njs_chb_append_literal(&http->chain, " HTTP/1.1" CRLF);

- njs_chb_append_literal(&http->chain, "Host: ");
- njs_chb_append(&http->chain, u.host.data, u.host.len);
- njs_chb_append_literal(&http->chain, CRLF);
- njs_chb_append_literal(&http->chain, "Connection: close" CRLF);
+ has_host = 0;
+ part = &request.headers.header_list.part;
+ h = part->elts;
+
+ for (i = 0; /* void */; i++) {
+
+ if (i >= part->nelts) {
+ if (part->next == NULL) {
+ break;
+ }
+
+ part = part->next;
+ h = part->elts;
+ i = 0;
+ }
+
+ if (h[i].hash == 0) {
+ continue;
+ }
+
+ if (h[i].key.len == 4
+ && ngx_strncasecmp(h[i].key.data, (u_char *) "Host", 4) == 0)
+ {
+ has_host = 1;
+ njs_chb_append_literal(&http->chain, "Host: ");
+ njs_chb_append(&http->chain, h[i].value.data, h[i].value.len);
+ njs_chb_append_literal(&http->chain, CRLF);
+ break;
+ }
+ }
+
+ if (!has_host) {
+ njs_chb_append_literal(&http->chain, "Host: ");
+ njs_chb_append(&http->chain, u.host.data, u.host.len);
+ njs_chb_append_literal(&http->chain, CRLF);
+ }

part = &request.headers.header_list.part;
h = part->elts;
@@ -770,12 +803,20 @@ ngx_js_ext_fetch(njs_vm_t *vm, njs_value
continue;
}

+ if (h[i].key.len == 4
+ && ngx_strncasecmp(h[i].key.data, (u_char *) "Host", 4) == 0)
+ {
+ continue;
+ }
+
njs_chb_append(&http->chain, h[i].key.data, h[i].key.len);
njs_chb_append_literal(&http->chain, ": ");
njs_chb_append(&http->chain, h[i].value.data, h[i].value.len);
njs_chb_append_literal(&http->chain, CRLF);
}

+ njs_chb_append_literal(&http->chain, "Connection: close" CRLF);
+
#if (NGX_SSL)
http->tls_name.data = u.host.data;
http->tls_name.len = u.host.len;
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[njs] Fetch: insuring Host header is always the first header.

Dmitry Volyntsev 240 May 11, 2023 12:28AM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 253
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready