Skip to content

Commit 73b15a1

Browse files
authored
feature: added the receiveany function for raw req socket. (#184)
1 parent dac4013 commit 73b15a1

File tree

5 files changed

+199
-6
lines changed

5 files changed

+199
-6
lines changed

.travis.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,12 @@ install:
5656
- git clone https://github.com/openresty/mockeagain.git
5757
- git clone https://github.com/openresty/test-nginx.git
5858
- git clone -b v2.1-agentzh https://github.com/openresty/luajit2.git
59-
- git clone -b feat/ssl-server-port https://github.com/halfcrazy/lua-nginx-module.git ../lua-nginx-module
59+
- git clone https://github.com/openresty/lua-nginx-module.git ../lua-nginx-module
6060
- git clone https://github.com/openresty/echo-nginx-module.git ../echo-nginx-module
6161
- git clone https://github.com/openresty/memc-nginx-module.git ../memc-nginx-module
6262
- git clone https://github.com/openresty/headers-more-nginx-module.git ../headers-more-nginx-module
6363
- git clone https://github.com/openresty/lua-resty-lrucache.git ../lua-resty-lrucache
64-
- git clone -b feat/ssl-server-port https://github.com/halfcrazy/lua-resty-core.git ../lua-resty-core
64+
- git clone https://github.com/openresty/lua-resty-core.git ../lua-resty-core
6565

6666
script:
6767
- sudo iptables -I OUTPUT 1 -p udp --dport 10086 -j REJECT

README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,19 @@ The raw TCP sockets returned by this module will contain the following extra met
334334

335335
[Back to TOC](#directives)
336336

337+
reqsock:receiveany
338+
------------------
339+
340+
**syntax:** *data, err = reqsock:receiveany(max)*
341+
342+
**context:** *content_by_lua*, ngx.timer.*, ssl_certificate_by_lua**
343+
344+
This method is similar to [tcpsock:receiveany](https://github.com/openresty/lua-nginx-module#tcpsockreceiveany) method
345+
346+
This method was introduced into `stream-lua-nginx-module` since `v0.0.8`.
347+
348+
[Back to TOC](#directives)
349+
337350
tcpsock:shutdown
338351
----------------
339352

src/ngx_stream_lua_socket_tcp.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,11 +286,14 @@ ngx_stream_lua_inject_socket_tcp_api(ngx_log_t *log, lua_State *L)
286286
/* {{{raw req socket object metatable */
287287
lua_pushlightuserdata(L, ngx_stream_lua_lightudata_mask(
288288
raw_req_socket_metatable_key));
289-
lua_createtable(L, 0 /* narr */, 8 /* nrec */);
289+
lua_createtable(L, 0 /* narr */, 9 /* nrec */);
290290

291291
lua_pushcfunction(L, ngx_stream_lua_socket_tcp_receive);
292292
lua_setfield(L, -2, "receive");
293293

294+
lua_pushcfunction(L, ngx_stream_lua_socket_tcp_receiveany);
295+
lua_setfield(L, -2, "receiveany");
296+
294297
lua_pushcfunction(L, ngx_stream_lua_socket_tcp_receiveuntil);
295298
lua_setfield(L, -2, "receiveuntil");
296299

t/062-count.t

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ n = 10
103103
assert(ngx.say("n = ", n))
104104
}
105105
--- stream_response
106-
n = 8
106+
n = 9
107107
--- no_error_log
108108
[error]
109109
@@ -295,6 +295,6 @@ n = 6
295295
end
296296
}
297297
--- stream_response
298-
n = 8
298+
n = 9
299299
--- no_error_log
300300
[error]

t/067-req-socket.t

Lines changed: 178 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use Test::Nginx::Socket::Lua::Stream;
44

55
repeat_each(2);
66

7-
plan tests => repeat_each() * (blocks() * 3 + 1);
7+
plan tests => repeat_each() * (blocks() * 3 + 1) + 16;
88

99
our $HtmlDir = html_dir;
1010

@@ -823,3 +823,180 @@ done
823823
--- grep_error_log_out
824824
stream lua finalize socket
825825
GC cycle done
826+
827+
828+
829+
=== TEST 13: sanity of raw req socket receive any
830+
--- stream_server_config
831+
832+
content_by_lua_block {
833+
local sock, err = ngx.req.socket(true)
834+
if not sock then
835+
ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)
836+
return
837+
end
838+
ngx.log(ngx.INFO, "Got raw req socket")
839+
local data, err = sock:receiveany(500)
840+
if not data then
841+
ngx.log(ngx.ERR, "server: failed to receive: ", err)
842+
return
843+
end
844+
ngx.log(ngx.INFO, "Got: ", #data, " bytes")
845+
846+
local bytes, err = sock:send("1: received: " .. data .. "\n")
847+
if not bytes then
848+
ngx.log(ngx.ERR, "server: failed to send: ", err)
849+
return
850+
end
851+
}
852+
853+
--- stream_request: hello
854+
--- stream_response
855+
1: received: hello
856+
--- no_error_log
857+
stream lua socket tcp_nodelay
858+
[error]
859+
--- error_log
860+
Got raw req socket
861+
Got: 5 bytes
862+
863+
864+
865+
=== TEST 14: receiveany small block size for a big size block
866+
--- stream_server_config
867+
content_by_lua_block {
868+
local sock, err = ngx.req.socket(true)
869+
if not sock then
870+
ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)
871+
return
872+
end
873+
sock:settimeouts(500, 100, 500)
874+
ngx.sleep(0.2)
875+
ngx.log(ngx.INFO, 'receiveany every 3 bytes per read ...')
876+
local i = 0
877+
while true do
878+
i = i + 1
879+
ngx.log(ngx.INFO, 'reading: ', i)
880+
local data, err = sock:receiveany(3)
881+
if not data then
882+
if err == 'closed' then
883+
ngx.log(ngx.INFO, 'client closed')
884+
break
885+
end
886+
if err == 'timeout' then
887+
ngx.log(ngx.INFO, 'client timeout, considered as closed')
888+
break
889+
end
890+
ngx.log(ngx.ERR, 'server receiveany error: ', err)
891+
break
892+
end
893+
if i == 1 then
894+
ngx.log(ngx.INFO, 'send back ok ...')
895+
local ok, err = sock:send("ok\n")
896+
if not ok then
897+
ngx.log(ngx.ERR, "failed to send: ", err)
898+
return
899+
end
900+
end
901+
ngx.log(ngx.INFO, "Time ", i, " - got ", #data, " bytes: ", data)
902+
sock:send("receive: " .. data .. "\n")
903+
end
904+
}
905+
906+
--- stream_request: hello, stream receiveany!
907+
--- stream_response
908+
ok
909+
receive: hel
910+
receive: lo,
911+
receive: st
912+
receive: rea
913+
receive: m r
914+
receive: ece
915+
receive: ive
916+
receive: any
917+
receive: !
918+
--- no_error_log
919+
receiveany error:
920+
--- error_log
921+
read timed out
922+
client timeout
923+
924+
925+
926+
=== TEST 15: receiveany with limited, max <= 0
927+
--- stream_server_config
928+
content_by_lua_block {
929+
local sock, err = ngx.req.socket(true)
930+
if sock == nil then
931+
ngx.log(ngx.ERR, 'raw req socket error: ', err)
932+
return
933+
end
934+
sock:settimeouts(500, 500, 500)
935+
936+
local function receiveany_log_err(...)
937+
local ok, err = pcall(sock.receiveany, sock, ...)
938+
if not ok then
939+
ngx.log(ngx.ERR, 'failed receiveany ', err)
940+
end
941+
end
942+
943+
944+
receiveany_log_err(0)
945+
receiveany_log_err(-1)
946+
receiveany_log_err(100, 200)
947+
receiveany_log_err()
948+
receiveany_log_err(nil)
949+
}
950+
--- error_log
951+
bad argument #2 to '?' (bad max argument)
952+
bad argument #2 to '?' (bad max argument)
953+
expecting 2 arguments (including the object), but got 3
954+
expecting 2 arguments (including the object), but got 1
955+
bad argument #2 to '?' (bad max argument)
956+
957+
958+
959+
=== TEST 16: receiveany send data after read side timeout
960+
--- stream_server_config
961+
content_by_lua_block {
962+
local sock, err = ngx.req.socket(true)
963+
if sock == nil then
964+
ngx.log(ngx.ERR, 'failed to get raw req socket', err)
965+
return
966+
end
967+
sock:settimeouts(500, 500, 500)
968+
969+
local data, err, bytes
970+
while true do
971+
data, err = sock:receiveany(1024)
972+
if err then
973+
if err ~= 'closed' then
974+
ngx.log(ngx.ERR, 'receiveany unexpected err: ', err)
975+
break
976+
end
977+
978+
data = "send data after read side closed"
979+
bytes, err = sock:send(data)
980+
if not bytes then
981+
ngx.log(ngx.ERR, 'failed to send after error ',err)
982+
end
983+
984+
break
985+
end
986+
ngx.say(data)
987+
end
988+
989+
local bytes, err2 = sock:send("send data after read side ")
990+
if not bytes then
991+
ngx.log(ngx.ERR, "failed to send: ", err2)
992+
end
993+
994+
local bytes, err2 = sock:send(err)
995+
if not bytes then
996+
ngx.log(ngx.ERR, "failed to send: ", err2)
997+
end
998+
}
999+
--- stream_response chomp
1000+
send data after read side timeout
1001+
--- error_log
1002+
receiveany unexpected err: timeout

0 commit comments

Comments
 (0)