1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
|
# vim:set ft= ts=4 sw=4 et fdm=marker:
use Test::Nginx::Socket::Lua::Stream;
repeat_each(2);
plan tests => repeat_each() * (blocks() * 3 + 1);
our $HtmlDir = html_dir;
$ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;
my $pwd = `pwd`;
chomp $pwd;
$ENV{TEST_NGINX_PWD} ||= $pwd;
#master_on();
workers(1);
#log_level('warn');
#worker_connections(1014);
no_long_string();
run_tests();
__DATA__
=== TEST 1: sanity
--- stream_config
lua_package_path '$TEST_NGINX_PWD/t/lib/?.lua;;';
--- stream_server_config
content_by_lua_block {
package.loaded["socket"] = ngx.socket
local Memcached = require "Memcached"
Memcached.socket = ngx.socket
local memc = Memcached.Connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)
memc:set("some_key", "hello 1234")
local data = memc:get("some_key")
ngx.say("some_key: ", data)
}
--- stream_response
some_key: hello 1234
--- no_error_log
[error]
=== TEST 2: raw memcached
--- stream_config eval
"lua_package_path '$::HtmlDir/?.lua;;';"
--- stream_server_config
content_by_lua_block {
local memcached = require "resty.memcached"
local memc, err = memcached.connect("127.0.0.1", $TEST_NGINX_MEMCACHED_PORT)
local ok, err = memc:set("some_key", "hello 1234")
if not ok then
ngx.log(ngx.ERR, "failed to set some_key: ", err)
ngx.exit(500)
end
local data, err = memc:get("some_key")
if not data and err then
ngx.log(ngx.ERR, "failed to get some_key: ", err)
ngx.exit(500)
end
ngx.say("some_key: ", data)
local res, err = memc:set_keepalive()
if not res then
ngx.say("failed to set keepalive: ", err)
return
end
}
--- user_files
>>> resty/memcached.lua
module("resty.memcached", package.seeall)
local mt = { __index = resty.memcached }
local sub = string.sub
local escape_uri = ngx.escape_uri
local socket_connect = ngx.socket.connect
local match = string.match
function connect(...)
local sock, err = socket_connect(...)
return setmetatable({ sock = sock }, mt)
end
function get(self, key)
local cmd = "get " .. escape_uri(key) .. "\r\n"
local bytes, err = self.sock:send(cmd)
if not bytes then
return nil, err
end
local line, err = self.sock:receive()
if line == 'END' then
return nil, nil
end
local flags, len = match(line, [[^VALUE %S+ (%d+) (%d+)]])
if not flags then
return nil, "bad response: " .. line
end
print("size: ", size, ", flags: ", len)
local data, err = self.sock:receive(len)
if not data then
return nil, err
end
line, err = self.sock:receive(2) -- discard the trailing CRLF
if not line then
return nil, nil, "failed to receive CRLF: " .. (err or "")
end
line, err = self.sock:receive() -- discard "END\r\n"
if not line then
return nil, nil, "failed to receive END CRLF: " .. (err or "")
end
return data
end
function set(self, key, value, exptime, flags)
if not exptime then
exptime = 0
end
if not flags then
flags = 0
end
local cmd = table.concat({"set ", escape_uri(key), " ", flags, " ", exptime, " ", #value, "\r\n", value, "\r\n"}, "")
local bytes, err = self.sock:send(cmd)
if not bytes then
return nil, err
end
local data, err = self.sock:receive()
if sub(data, 1, 6) == "STORED" then
return true
end
return false, err
end
function set_keepalive(self)
return self.sock:setkeepalive(0, 100)
end
--- stream_response
some_key: hello 1234
--- no_error_log
[error]
--- error_log
lua reuse free buf memory
|