# vim:set ft= ts=4 sw=4 et fdm=marker:
use lib 'lib';
use Test::Nginx::Socket::Lua;

#worker_connections(1014);
#master_on();
#workers(2);
#log_level('warn');

repeat_each(2);

plan tests => repeat_each() * (blocks() * 7);

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

__DATA__

=== TEST 1: accessing nginx variables
--- config
    location /t {
        content_by_lua '
            local function f()
                print("uri: ", ngx.var.uri)
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the current context/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 2: reading ngx.status
--- config
    location /t {
        content_by_lua '
            local function f()
                print("uri: ", ngx.status)
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the current context/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 3: writing ngx.status
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.status = 200
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the current context/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 4: ngx.req.raw_header
--- config
    location /t {
        content_by_lua '
            local function f()
                print("raw header: ", ngx.req.raw_header())
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the current context/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 5: ngx.req.get_headers
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.req.get_headers()
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the current context/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 6: ngx.req.set_header
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.req.set_header("Foo", 32)
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the current context/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 7: ngx.req.clear_header
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.req.clear_header("Foo")
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the current context/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 8: ngx.req.set_uri
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.req.set_uri("/foo")
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the current context/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 9: ngx.req.set_uri_args
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.req.set_uri_args("foo")
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the current context/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 10: ngx.redirect()
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.redirect("/foo")
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the context of ngx\.timer/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 11: ngx.exec()
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.exec("/foo")
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the context of ngx\.timer/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 12: ngx.say()
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.say("hello")
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the context of ngx\.timer/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 13: ngx.print()
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.print("hello")
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the context of ngx\.timer/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 14: ngx.flush()
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.flush()
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the context of ngx\.timer/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 15: ngx.send_headers()
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.send_headers()
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the context of ngx\.timer/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 16: ngx.req.get_uri_args()
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.req.get_uri_args()
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the current context/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 17: ngx.req.read_body
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.req.read_body()
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the context of ngx\.timer/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 18: ngx.req.discard_body
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.req.discard_body()
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the current context/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 19: ngx.req.init_body
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.req.init_body()
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the current context/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 20: ngx.header
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.header.Foo = 3
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the current context/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 21: ngx.on_abort
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.on_abort(f)
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the context of ngx\.timer/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 22: ngx.location.capture
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.location.capture("/")
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the context of ngx\.timer/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 23: ngx.location.capture_multi
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.location.capture_multi{{"/"}}
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the context of ngx\.timer/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 24: ngx.req.get_method
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.req.get_method()
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the current context/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 25: ngx.req.set_method
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.req.set_method(ngx.HTTP_POST)
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the current context/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 26: ngx.req.http_version
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.req.http_version()
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the current context/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 27: ngx.req.get_post_args
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.req.get_post_args()
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the current context/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 28: ngx.req.get_body_data
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.req.get_body_data()
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the current context/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 29: ngx.req.get_body_file
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.req.get_body_file()
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the current context/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 30: ngx.req.set_body_data
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.req.set_body_data("hello")
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the current context/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 31: ngx.req.set_body_file
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.req.set_body_file("hello")
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the current context/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 32: ngx.req.append_body
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.req.append_body("hello")
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the current context/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 33: ngx.req.finish_body
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.req.finish_body()
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the current context/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 34: ngx.headers_sent
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.headers_sent()
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the current context/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 35: ngx.eof
--- config
    location /t {
        content_by_lua '
            local function f()
                ngx.eof()
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the context of ngx\.timer/,
"lua ngx.timer expired",
"http lua close fake http connection"
]



=== TEST 36: ngx.req.socket
--- config
    location /t {
        content_by_lua '
            local function f()
                local sock, err = ngx.req.socket()
                if not sock then
                    ngx.log(ngx.ERR, "failed to get req sock: ", err)
                end
            end
            local ok, err = ngx.timer.at(0.05, f)
            if not ok then
                ngx.say("failed to set timer: ", err)
                return
            end
            ngx.say("registered timer")
        ';
    }
--- request
GET /t
--- stap2
F(ngx_http_lua_timer_handler) {
    println("lua timer handler")
}

--- response_body
registered timer

--- wait: 0.1
--- no_error_log
[alert]
[crit]

--- error_log eval
[
qr/\[error\] .*? runtime error: \[string "content_by_lua"\]:3: API disabled in the context of ngx\.timer/,
"lua ngx.timer expired",
"http lua close fake http connection"
]

