# vim:set ft= ts=4 sw=4 et fdm=marker:

use Test::Nginx::Socket::Lua;

#worker_connections(1014);
#master_process_enabled(1);
log_level('debug'); # to ensure any log-level can be outputted

repeat_each(2);

plan tests => repeat_each() * (blocks() * 2 + 2);

#no_diff();
#no_long_string();
run_tests();

__DATA__

=== TEST 1: test reading request body
--- config
    location /echo_body {
        lua_need_request_body on;
        content_by_lua '
            ngx.print(ngx.var.request_body or "nil")
        ';
    }
--- request eval
"POST /echo_body
hello\x00\x01\x02
world\x03\x04\xff"
--- response_body eval
"hello\x00\x01\x02
world\x03\x04\xff"



=== TEST 2: test not reading request body
--- config
    location /echo_body {
        lua_need_request_body off;
        content_by_lua '
            ngx.print(ngx.var.request_body or "nil")
        ';
    }
--- request eval
"POST /echo_body
hello\x00\x01\x02
world\x03\x04\xff"
--- response_body eval
"nil"



=== TEST 3: test default setting (not reading request body)
--- config
    location /echo_body {
        content_by_lua '
            ngx.print(ngx.var.request_body or "nil")
        ';
    }
--- request eval
"POST /echo_body
hello\x00\x01\x02
world\x03\x04\xff"
--- response_body eval
"nil"



=== TEST 4: test main conf
--- http_config
    lua_need_request_body on;
--- config
    location /echo_body {
        content_by_lua '
            ngx.print(ngx.var.request_body or "nil")
        ';
    }
--- request eval
"POST /echo_body
hello\x00\x01\x02
world\x03\x04\xff"
--- response_body eval
"hello\x00\x01\x02
world\x03\x04\xff"



=== TEST 5: test server conf
--- config
    lua_need_request_body on;

    location /echo_body {
        content_by_lua '
            ngx.print(ngx.var.request_body or "nil")
        ';
    }
--- request eval
"POST /echo_body
hello\x00\x01\x02
world\x03\x04\xff"
--- response_body eval
"hello\x00\x01\x02
world\x03\x04\xff"



=== TEST 6: test override main conf
--- http_config
    lua_need_request_body on;
--- config
    location /echo_body {
        lua_need_request_body off;
        content_by_lua '
            ngx.print(ngx.var.request_body or "nil")
        ';
    }
--- request eval
"POST /echo_body
hello\x00\x01\x02
world\x03\x04\xff"
--- response_body eval
"nil"



=== TEST 7: test override server conf
--- config
    lua_need_request_body on;

    location /echo_body {
        lua_need_request_body off;
        content_by_lua '
            ngx.print(ngx.var.request_body or "nil")
        ';
    }
--- request eval
"POST /echo_body
hello\x00\x01\x02
world\x03\x04\xff"
--- response_body eval
"nil"



=== TEST 8: test override server conf
--- config
    location /proxy {
        proxy_pass http://127.0.0.1:$server_port/hi;
    }
    location /hi {
        echo_request_body;
    }
    location /echo_body {
        lua_need_request_body off;
        content_by_lua '
            ngx.say(ngx.var.request_body or "nil")
            local res = ngx.location.capture(
                "/proxy",
                { method = ngx.HTTP_POST,
                  body = ngx.var.request_body })

            ngx.say(res.status)
        ';
    }
--- request eval
"POST /echo_body
"
--- response_body
nil
200



=== TEST 9: empty POST body
--- config
    location /proxy {
        proxy_pass http://127.0.0.1:$server_port/hi;
    }
    location /hi {
        echo_request_body;
    }
    location /echo_body {
        lua_need_request_body on;
        content_by_lua '
            ngx.say(ngx.var.request_body or "nil")
            local res = ngx.location.capture(
                "/proxy",
                { method = ngx.HTTP_POST,
                  body = ngx.var.request_body })

            ngx.say(res.status)
        ';
    }
--- request eval
"POST /echo_body
"
--- response_body
nil
200



=== TEST 10: on disk request body
--- config
    location /proxy {
        proxy_pass http://127.0.0.1:$server_port/hi;
    }
    location /hi {
        echo_request_body;
    }
    location /echo_body {
        lua_need_request_body on;

        client_max_body_size 100k;
        client_body_buffer_size 1;
        sendfile on;

        content_by_lua '
            local res = ngx.location.capture(
                "/proxy",
                { method = ngx.HTTP_POST,
                  body = ngx.var.request_body })
            ngx.print(res.body)
        ';
    }
--- request eval
"POST /echo_body
" . ('a' x 1024)
--- response_body chomp



=== TEST 11: no modify main request content-length
--- config
    location /foo {
        content_by_lua '
            ngx.location.capture("/other", {body = "hello"})
            ngx.say(ngx.req.get_headers()["Content-Length"] or "nil")
        ';
    }
    location /other {
        echo hi;
    }
--- request
POST /foo
hi
--- response_body
2



=== TEST 12: Expect: 100-Continue
--- config
    location /echo_body {
        lua_need_request_body on;
        content_by_lua '
            ngx.print(ngx.var.request_body or "nil")
        ';
    }
--- request
POST /echo_body
hello world
--- more_headers
Expect: 100-Continue
--- ignore_response
--- no_error_log
[error]
[alert]
http finalize request: 500, "/echo_body?" a:1, c:2
http finalize request: 500, "/echo_body?" a:1, c:0
--- log_level: debug
--- skip_eval: 4:$ENV{TEST_NGINX_USE_HTTP3}



=== TEST 13: test reading the first n bytes of request body
--- config
    location /echo_body {
        lua_need_request_body on;
        content_by_lua_block {
            local data = ngx.req.get_body_data(1)
            ngx.say(data)
        }
    }
--- request
POST /echo_body
hello
--- response_body
h
--- skip_eval: 2:$ENV{TEST_NGINX_USE_HTTP3}
