LINUX.ORG.RU
решено ФорумAdmin

nginx, njs, subrequest, полное отсутствие хедеров

 


0

1

./nginx -V

nginx version: nginx/1.16.1 built by clang 3.4.1 (tags/RELEASE_34/dot1-final 208032) 20140512 built with OpenSSL 1.0.2j 26 Sep 2016 TLS SNI support enabled configure arguments: –prefix=/opt/nginx –with-pcre=/home/user/pcre-8.40 –with-zlib=/home/user/zlib-1.2.11 –with-openssl=/home/user/openssl-1.0.2j –with-http_ssl_module –with-http_realip_module –with-http_stub_status_module –with-http_secure_link_module –add-module=/home/user/njs/nginx –with-http_sub_module

конфиг без воды относящийся к делу

location /doc
{
    proxy_set_header        Host $http_host;
    proxy_set_header        X-Forwarded-Proto https;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    access_log  logs/443.doc.access.log up_log;
    error_log   logs/443.doc.error.log;

    client_max_body_size 50M;
    subrequest_output_buffer_size 100M;
    js_content write_body;
}

location /NJSNJS/doc
{
    proxy_set_header        Host $http_host;
    proxy_set_header        X-Forwarded-Proto https;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

    access_log  logs/443.doc_njs.access.log up_log;
    error_log   logs/443.doc_njs.error.log;

    client_max_body_size 50M;
    subrequest_output_buffer_size 100M;

    proxy_pass  https://10.2.11.1/doc;
}

function write_body (r) {

var TOURI = "/NJSNJS" + r.variables.request_uri;

// if ( 0 )

if ( 1 )
{
    var HEADERS = "";
    var h;
    for (h in r.headersIn) {
        HEADERS += "  header '" + h + "' is '" + r.headersIn[h] + "'\n";
    }

    r.subrequest(TOURI, { method: r.method }, function logging(res)
         {
            var dater;
            dater = "\n\n========== " + r.variables.time_local + " =========="; //Date of the request

            if ( res.status == "301" || res.status == "302" || res.status == "303" || res.status == "307" || res.status == "308")
            {
                r.return (res.status, r.variables.http_location);
            }
            else
            {
                r.return (res.status, res.responseBody);
            }

            var HEADERSOUT = "";
            var g;
            for (g in r.headersOut) {
                HEADERSOUT += "  header '" + g + "' is '" + r.headersOut[g] + "'\n";
            }

            var BODY = "Source IP - " + r.remoteAddress + " Method - " + r.method + " Status - " + res.status + " URI - " + r.variables.request_uri + "\n" + " Headers in " + "\n" + HEADERS + "\n Headers out\n" + HEADERSOUT + "\nRequest body - " + r.requestBody + "\nResponse body - " + res.responseBody;
            var messageTOlog = dater + "\n" + BODY;
            var fs = require('fs');
            var filename = "/opt/nginx/logs/BODY.txt";
            fs.appendFileSync(filename, messageTOlog, { encoding: 'utf8' });
        }
    );
}
else
{
    r.internalRedirect(TOURI);
}

}

Если идти по ветке else (т.е. без подзапроса) то хедеры присутствуют в полном объеме, если идти по пути подзапроса то хедеров нет, что видно и по вгету и по логированию. В случае 301 302 итд хедер Location есть, но пустой, что неприемлемо. Доки 3 раза уже перечитал, гугл тоже, уже подозреваю что баг в njs.

Ответ на: комментарий от drsm

0.3.7 ранее читал нотации к выпуску 0.4.0 и не нашел там своей проблемы в описаниях фиксов пробую новую, спасиб

anatol_dp
() автор топика

Стало немного лучше, хедеры появились, но не все

HTTP request sent, awaiting response... 
  HTTP/1.1 302 Moved Temporarily
  Server: nginx
  Date: Wed, 29 Apr 2020 11:26:40 GMT
  Content-Type: text/html
  Content-Length: 138
  Connection: keep-alive
  Location: 
Location:  [following]
anatol_dp
() автор топика
Ответ на: комментарий от drsm

Нет, мне ж нужно получить от апстримов хедер, а не передать на них его. Уже пробовал add_header, но понятно что этот метод просто все под корень вырезает и остаются считаные хедеры на 0.4.0 версии, на прошлой и того хуже было. Пока только идея дикого костыля который через пень колоду работает и не ломает ничего

r.subrequest
...
if ( res.status == "301" || res.status == "302" || res.status == "303" || res.status == "307" || res.status == "308")
            {
                r.internalRedirect(TOURI);
            }
...

но он ведет к двойному запросу на апстримы

anatol_dp
() автор топика
Ответ на: комментарий от anatol_dp

Уже пробовал add_header, но понятно что этот метод просто все под корень вырезает

more_set_headers

zolden ★★★★★
()
Ответ на: комментарий от anatol_dp

я не пойму что ты делаешь.

server {
    listen 1113;
    location /test {
        js_content test;
    }
    location /service {
        proxy_pass http://127.0.0.1:1114;
    }
}

server {
    listen 1114;
    location /service {
        add_header 'X-OMG' 'WTF';
        return 301 http://ya.ru/;
    }
}
function test(r) {
    r.subrequest('/service')
    .then((res) => {
        r.return(200, njs.dump(res.headersOut));
    });
}
$ curl localhost:1113/test
{Content-Type:'text/html',Content-Length:'170',Location:'http://ya.ru/',X-OMG:'WTF'}

в чем проблема?

drsm ★★
()
Ответ на: комментарий от drsm

Да, не увидел очевидного Решение r->res

r.return (res.status, res.headersOut.location);

Спасибище за наводку

anatol_dp
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.