Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

437 lines (344 sloc) 9.737 kb
# vim:set ft= ts=4 sw=4 et fdm=marker:
use lib 'lib';
use Test::Nginx::Socket;
repeat_each(2);
plan tests => repeat_each() * (blocks() * 3);
our $HtmlDir = html_dir;
$ENV{TEST_NGINX_CLIENT_PORT} ||= server_port();
$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;
no_long_string();
#no_diff();
#log_level 'warn';
run_tests();
__DATA__
=== TEST 1: read events come when socket is idle
--- config
server_tokens off;
location /t {
set $port $TEST_NGINX_CLIENT_PORT;
content_by_lua '
local sock = ngx.socket.tcp()
local port = ngx.var.port
local ok, err = sock:connect("127.0.0.1", port)
if not ok then
ngx.say("failed to connect: ", err)
return
end
ngx.say("connected: ", ok)
local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
local bytes, err = sock:send(req)
if not bytes then
ngx.say("failed to send request: ", err)
return
end
ngx.say("request sent: ", bytes)
local reader = sock:receiveuntil("foofoo\\r\\n")
local line, err, part = reader()
if line then
ngx.print("read: ", line)
else
ngx.say("failed to read a line: ", err, " [", part, "]")
end
ngx.location.capture("/sleep")
local data, err, part = sock:receive("*a")
if not data then
ngx.say("failed to read the 2nd part: ", err)
else
ngx.say("2nd part: [", data, "]")
end
ok, err = sock:close()
ngx.say("close: ", ok, " ", err)
';
}
location /sleep {
echo_sleep 0.5;
more_clear_headers Date;
}
location /foo {
echo -n foofoo;
echo_flush;
echo_sleep 0.3;
echo -n barbar;
more_clear_headers Date;
}
--- request
GET /t
--- response_body eval
qq{connected: 1
request sent: 57
read: HTTP/1.1 200 OK\r
Server: nginx\r
Content-Type: text/plain\r
Transfer-Encoding: chunked\r
Connection: close\r
\r
6\r
2nd part: [6\r
barbar\r
0\r
\r
]
close: nil closed
}
--- no_error_log
[error]
=== TEST 2: read timer cleared in time
--- config
server_tokens off;
location /t {
#set $port 5000;
set $port $TEST_NGINX_MEMCACHED_PORT;
content_by_lua '
local sock = ngx.socket.tcp()
local port = ngx.var.port
sock:settimeout(400)
local ok, err = sock:connect("127.0.0.1", port)
if not ok then
ngx.say("failed to connect: ", err)
return
end
ngx.say("connected: ", ok)
local req = "flush_all\\r\\n"
local bytes, err = sock:send(req)
if not bytes then
ngx.say("failed to send request: ", err)
return
end
ngx.say("request sent: ", bytes)
local line, err, part = sock:receive()
if line then
ngx.say("received: ", line)
else
ngx.say("failed to receive a line: ", err, " [", part, "]")
end
ngx.location.capture("/sleep")
local bytes, err = sock:send(req)
if not bytes then
ngx.say("failed to send request: ", err)
return
end
ngx.say("request sent again: ", bytes)
ok, err = sock:close()
ngx.say("close: ", ok, " ", err)
';
}
location /sleep {
echo_sleep 0.5;
}
location /foo {
echo foo;
more_clear_headers Date;
}
--- request
GET /t
--- response_body
connected: 1
request sent: 11
received: OK
request sent again: 11
close: 1 nil
--- no_error_log
[error]
=== TEST 3: connect timer cleared in time
--- config
server_tokens off;
location /t {
#set $port 5000;
set $port $TEST_NGINX_MEMCACHED_PORT;
content_by_lua '
local sock = ngx.socket.tcp()
local port = ngx.var.port
sock:settimeout(300)
local ok, err = sock:connect("127.0.0.1", port)
if not ok then
ngx.say("failed to connect: ", err)
return
end
ngx.say("connected: ", ok)
ngx.location.capture("/sleep")
local req = "flush_all\\r\\n"
local bytes, err = sock:send(req)
if not bytes then
ngx.say("failed to send request: ", err)
return
end
ngx.say("request sent: ", bytes)
ok, err = sock:close()
ngx.say("close: ", ok, " ", err)
';
}
location /sleep {
echo_sleep 0.5;
}
location /foo {
echo foo;
more_clear_headers Date;
}
--- request
GET /t
--- response_body
connected: 1
request sent: 11
close: 1 nil
--- no_error_log
[error]
=== TEST 4: send timer cleared in time
--- config
server_tokens off;
location /t {
#set $port 5000;
set $port $TEST_NGINX_MEMCACHED_PORT;
content_by_lua '
local sock = ngx.socket.tcp()
local port = ngx.var.port
sock:settimeout(300)
local ok, err = sock:connect("127.0.0.1", port)
if not ok then
ngx.say("failed to connect: ", err)
return
end
ngx.say("connected: ", ok)
local req = "flush_all\\r\\n"
local bytes, err = sock:send(req)
if not bytes then
ngx.say("failed to send request: ", err)
return
end
ngx.say("request sent: ", bytes)
ngx.location.capture("/sleep")
local line, err, part = sock:receive()
if line then
ngx.say("received: ", line)
else
ngx.say("failed to receive a line: ", err, " [", part, "]")
return
end
ok, err = sock:close()
ngx.say("close: ", ok, " ", err)
';
}
location /sleep {
echo_sleep 0.5;
}
location /foo {
echo foo;
more_clear_headers Date;
}
--- request
GET /t
--- response_body
connected: 1
request sent: 11
received: OK
close: 1 nil
--- no_error_log
[error]
=== TEST 5: set keepalive when system socket recv buffer has unread data
--- config
server_tokens off;
location /t {
set $port $TEST_NGINX_CLIENT_PORT;
content_by_lua '
local sock = ngx.socket.tcp()
local port = ngx.var.port
local ok, err = sock:connect("127.0.0.1", port)
if not ok then
ngx.say("failed to connect: ", err)
return
end
ngx.say("connected: ", ok)
local req = "GET /foo HTTP/1.1\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
local bytes, err = sock:send(req)
if not bytes then
ngx.say("failed to send request: ", err)
return
end
ngx.say("request sent: ", bytes)
local reader = sock:receiveuntil("foofoo\\r\\n")
local line, err, part = reader()
if line then
ngx.print("read: ", line)
else
ngx.say("failed to read a line: ", err, " [", part, "]")
end
ngx.location.capture("/sleep")
local ok, err = sock:setkeepalive()
if not ok then
ngx.say("failed to set keepalive: ", err)
end
';
}
location /sleep {
echo_sleep 0.5;
more_clear_headers Date;
}
location /foo {
echo -n foofoo;
echo_flush;
echo_sleep 0.3;
echo -n barbar;
more_clear_headers Date;
}
--- request
GET /t
--- response_body eval
qq{connected: 1
request sent: 57
read: HTTP/1.1 200 OK\r
Server: nginx\r
Content-Type: text/plain\r
Transfer-Encoding: chunked\r
Connection: close\r
\r
6\r
failed to set keepalive: connection in dubious state
}
--- no_error_log
[error]
=== TEST 6: set keepalive when cosocket recv buffer has unread data
--- config
server_tokens off;
location /t {
set $port $TEST_NGINX_MEMCACHED_PORT;
content_by_lua '
local sock = ngx.socket.tcp()
local port = ngx.var.port
local ok, err = sock:connect("127.0.0.1", port)
if not ok then
ngx.say("failed to connect: ", err)
return
end
ngx.say("connected: ", ok)
local req = "flush_all\\r\\n"
local bytes, err = sock:send(req)
if not bytes then
ngx.say("failed to send request: ", err)
return
end
ngx.say("request sent: ", bytes)
local data, err = sock:receive(1)
if not data then
ngx.say("failed to read the 1st byte: ", err)
return
end
ngx.say("read: ", data)
local ok, err = sock:setkeepalive()
if not ok then
ngx.say("failed to set keepalive: ", err)
end
';
}
location /foo {
echo foo;
more_clear_headers Date;
}
--- request
GET /t
--- response_body eval
qq{connected: 1
request sent: 11
read: O
failed to set keepalive: unread data in buffer
}
--- no_error_log
[error]
Jump to Line
Something went wrong with that request. Please try again.