PageRenderTime 49ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/bundle/ngx_lua-0.9.2/t/116-raw-req-socket.t

https://github.com/dome/lixen_app
Unknown | 781 lines | 658 code | 123 blank | 0 comment | 0 complexity | 815aa81bf5431b5518c1408c69c4b952 MD5 | raw file
Possible License(s): BSD-2-Clause, BSD-3-Clause
  1. # vim:set ft= ts=4 sw=4 et fdm=marker:
  2. use lib 'lib';
  3. use t::TestNginxLua;
  4. repeat_each(2);
  5. plan tests => repeat_each() * 36;
  6. our $HtmlDir = html_dir;
  7. $ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;
  8. $ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';
  9. #log_level 'warn';
  10. log_level 'debug';
  11. #no_long_string();
  12. #no_diff();
  13. run_tests();
  14. __DATA__
  15. === TEST 1: sanity
  16. --- config
  17. server_tokens off;
  18. location = /t {
  19. #set $port 5000;
  20. set $port $TEST_NGINX_SERVER_PORT;
  21. content_by_lua '
  22. local sock = ngx.socket.tcp()
  23. local port = ngx.var.port
  24. local ok, err = sock:connect("127.0.0.1", port)
  25. if not ok then
  26. ngx.say("failed to connect: ", err)
  27. return
  28. end
  29. local req = "GET /mysock HTTP/1.1\\r\\nUpgrade: mysock\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\nhello"
  30. -- req = "OK"
  31. local bytes, err = sock:send(req)
  32. if not bytes then
  33. ngx.say("failed to send request: ", err)
  34. return
  35. end
  36. local reader = sock:receiveuntil("\\r\\n\\r\\n")
  37. local data, err, partial = reader()
  38. if not data then
  39. ngx.say("no response header found")
  40. return
  41. end
  42. local msg, err = sock:receive()
  43. if not msg then
  44. ngx.say("failed to receive: ", err)
  45. return
  46. end
  47. ngx.say("msg: ", msg)
  48. ok, err = sock:close()
  49. if not ok then
  50. ngx.say("failed to close socket: ", err)
  51. return
  52. end
  53. ';
  54. }
  55. location = /mysock {
  56. content_by_lua '
  57. ngx.status = 101
  58. ngx.send_headers()
  59. ngx.flush(true)
  60. ngx.req.read_body()
  61. local sock, err = ngx.req.socket(true)
  62. if not sock then
  63. ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)
  64. return
  65. end
  66. local data, err = sock:receive(5)
  67. if not data then
  68. ngx.log(ngx.ERR, "server: failed to receive: ", err)
  69. return
  70. end
  71. local bytes, err = sock:send("1: received: " .. data .. "\\n")
  72. if not bytes then
  73. ngx.log(ngx.ERR, "server: failed to send: ", err)
  74. return
  75. end
  76. ';
  77. more_clear_headers Date;
  78. }
  79. --- request
  80. GET /t
  81. --- response_body
  82. msg: 1: received: hello
  83. --- error_log
  84. lua raw req socket tcp_nodelay
  85. --- no_error_log
  86. [error]
  87. === TEST 2: header not sent yet
  88. --- config
  89. server_tokens off;
  90. location = /t {
  91. content_by_lua '
  92. ngx.status = 101
  93. ngx.req.read_body()
  94. local sock, err = ngx.req.socket(true)
  95. if not sock then
  96. ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)
  97. return
  98. end
  99. local ok, err = sock:send("HTTP/1.1 200 OK\\r\\nContent-Length: 5\\r\\n\\r\\nhello")
  100. if not ok then
  101. ngx.log(ngx.ERR, "failed to send: ", err)
  102. return
  103. end
  104. ';
  105. }
  106. --- raw_request eval
  107. "GET /t HTTP/1.0\r
  108. Host: localhost\r
  109. Content-Length: 5\r
  110. \r
  111. hello"
  112. --- response_headers
  113. Content-Length: 5
  114. --- response_body chop
  115. hello
  116. --- no_error_log
  117. [error]
  118. === TEST 3: http 1.0 buffering
  119. --- config
  120. server_tokens off;
  121. location = /t {
  122. content_by_lua '
  123. ngx.say("hello")
  124. ngx.req.read_body()
  125. local sock, err = ngx.req.socket(true)
  126. if not sock then
  127. ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)
  128. return ngx.exit(500)
  129. end
  130. ';
  131. }
  132. --- raw_request eval
  133. "GET /t HTTP/1.0\r
  134. Host: localhost\r
  135. Upgrade: mysocket\r
  136. \r
  137. hello"
  138. --- stap2
  139. F(ngx_http_header_filter) {
  140. println("header filter")
  141. }
  142. F(ngx_http_lua_req_socket) {
  143. println("lua req socket")
  144. }
  145. --- ignore_response
  146. --- error_log
  147. server: failed to get raw req socket: http 1.0 buffering
  148. === TEST 4: multiple raw req sockets
  149. --- config
  150. server_tokens off;
  151. location = /t {
  152. content_by_lua '
  153. ngx.say("hello")
  154. ngx.flush(true)
  155. ngx.req.read_body()
  156. local sock, err = ngx.req.socket(true)
  157. if not sock then
  158. ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)
  159. return
  160. end
  161. local sock2, err = ngx.req.socket(true)
  162. if not sock2 then
  163. ngx.log(ngx.ERR, "server: failed to get raw req socket2: ", err)
  164. return
  165. end
  166. ';
  167. }
  168. --- raw_request eval
  169. "GET /t HTTP/1.1\r
  170. Host: localhost\r
  171. Upgrade: mysocket\r
  172. \r
  173. hello"
  174. --- stap2
  175. F(ngx_http_header_filter) {
  176. println("header filter")
  177. }
  178. F(ngx_http_lua_req_socket) {
  179. println("lua req socket")
  180. }
  181. --- ignore_response
  182. --- error_log
  183. server: failed to get raw req socket2: duplicate call
  184. === TEST 5: ngx.say after ngx.req.socket(true)
  185. --- config
  186. server_tokens off;
  187. location = /t {
  188. content_by_lua '
  189. ngx.send_headers()
  190. ngx.flush(true)
  191. ngx.req.read_body()
  192. local sock, err = ngx.req.socket(true)
  193. if not sock then
  194. ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)
  195. return
  196. end
  197. local ok, err = ngx.say("ok")
  198. if not ok then
  199. ngx.log(ngx.ERR, "failed to say: ", err)
  200. return
  201. end
  202. ';
  203. }
  204. --- raw_request eval
  205. "GET /t HTTP/1.1\r
  206. Host: localhost\r
  207. Upgrade: mysocket\r
  208. \r
  209. hello"
  210. --- ignore_response
  211. --- error_log
  212. failed to say: raw request socket acquired
  213. === TEST 6: ngx.print after ngx.req.socket(true)
  214. --- config
  215. server_tokens off;
  216. location = /t {
  217. content_by_lua '
  218. ngx.send_headers()
  219. ngx.flush(true)
  220. ngx.req.read_body()
  221. local sock, err = ngx.req.socket(true)
  222. if not sock then
  223. ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)
  224. return
  225. end
  226. local ok, err = ngx.print("ok")
  227. if not ok then
  228. ngx.log(ngx.ERR, "failed to print: ", err)
  229. return
  230. end
  231. ';
  232. }
  233. --- raw_request eval
  234. "GET /t HTTP/1.1\r
  235. Host: localhost\r
  236. Upgrade: mysocket\r
  237. \r
  238. hello"
  239. --- ignore_response
  240. --- error_log
  241. failed to print: raw request socket acquired
  242. === TEST 7: ngx.eof after ngx.req.socket(true)
  243. --- config
  244. server_tokens off;
  245. location = /t {
  246. content_by_lua '
  247. ngx.send_headers()
  248. ngx.flush(true)
  249. ngx.req.read_body()
  250. local sock, err = ngx.req.socket(true)
  251. if not sock then
  252. ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)
  253. return
  254. end
  255. local ok, err = ngx.eof()
  256. if not ok then
  257. ngx.log(ngx.ERR, "failed to eof: ", err)
  258. return
  259. end
  260. ';
  261. }
  262. --- raw_request eval
  263. "GET /t HTTP/1.1\r
  264. Host: localhost\r
  265. Upgrade: mysocket\r
  266. \r
  267. hello"
  268. --- ignore_response
  269. --- error_log
  270. failed to eof: raw request socket acquired
  271. === TEST 8: ngx.flush after ngx.req.socket(true)
  272. --- config
  273. server_tokens off;
  274. location = /t {
  275. content_by_lua '
  276. ngx.send_headers()
  277. ngx.flush(true)
  278. ngx.req.read_body()
  279. local sock, err = ngx.req.socket(true)
  280. if not sock then
  281. ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)
  282. return
  283. end
  284. local ok, err = ngx.flush()
  285. if not ok then
  286. ngx.log(ngx.ERR, "failed to flush: ", err)
  287. return
  288. end
  289. ';
  290. }
  291. --- raw_request eval
  292. "GET /t HTTP/1.1\r
  293. Host: localhost\r
  294. Upgrade: mysocket\r
  295. \r
  296. hello"
  297. --- ignore_response
  298. --- error_log
  299. failed to flush: raw request socket acquired
  300. === TEST 9: receive timeout
  301. --- config
  302. server_tokens off;
  303. postpone_output 1;
  304. location = /t {
  305. content_by_lua '
  306. ngx.send_headers()
  307. ngx.req.read_body()
  308. ngx.flush(true)
  309. local sock, err = ngx.req.socket(true)
  310. if not sock then
  311. ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)
  312. return
  313. end
  314. sock:settimeout(100)
  315. local data, err, partial = sock:receive(10)
  316. if not data then
  317. ngx.log(ngx.ERR, "server: 1: failed to receive: ", err, ", received: ", partial)
  318. end
  319. data, err, partial = sock:receive(10)
  320. if not data then
  321. ngx.log(ngx.ERR, "server: 2: failed to receive: ", err, ", received: ", partial)
  322. end
  323. ngx.exit(444)
  324. ';
  325. }
  326. --- raw_request eval
  327. "GET /t HTTP/1.1\r
  328. Host: localhost\r
  329. Upgrade: mysocket\r
  330. Connection: close\r
  331. \r
  332. ab"
  333. --- ignore_response
  334. --- wait: 0.1
  335. --- error_log
  336. lua tcp socket read timed out
  337. server: 1: failed to receive: timeout, received: ab,
  338. server: 2: failed to receive: timeout, received: ,
  339. --- no_error_log
  340. [alert]
  341. === TEST 10: on_abort called during ngx.sleep()
  342. --- config
  343. server_tokens off;
  344. lua_check_client_abort on;
  345. location = /t {
  346. #set $port 5000;
  347. set $port $TEST_NGINX_SERVER_PORT;
  348. content_by_lua '
  349. local sock = ngx.socket.tcp()
  350. local port = ngx.var.port
  351. local ok, err = sock:connect("127.0.0.1", port)
  352. if not ok then
  353. ngx.say("failed to connect: ", err)
  354. return
  355. end
  356. local req = "GET /mysock HTTP/1.1\\r\\nUpgrade: mysock\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\nhello"
  357. -- req = "OK"
  358. local bytes, err = sock:send(req)
  359. if not bytes then
  360. ngx.say("failed to send request: ", err)
  361. return
  362. end
  363. local reader = sock:receiveuntil("\\r\\n\\r\\n")
  364. local data, err, partial = reader()
  365. if not data then
  366. ngx.say("no response header found")
  367. return
  368. end
  369. local msg, err = sock:receive()
  370. if not msg then
  371. ngx.say("failed to receive: ", err)
  372. return
  373. end
  374. ngx.say("msg: ", msg)
  375. ngx.sleep(0.1)
  376. ok, err = sock:close()
  377. if not ok then
  378. ngx.say("failed to close socket: ", err)
  379. return
  380. end
  381. ';
  382. }
  383. location = /mysock {
  384. content_by_lua '
  385. ngx.status = 101
  386. ngx.send_headers()
  387. ngx.flush(true)
  388. local ok, err = ngx.on_abort(function (premature) ngx.log(ngx.WARN, "mysock handler aborted") end)
  389. if not ok then
  390. ngx.log(ngx.ERR, "failed to set on_abort handler: ", err)
  391. return
  392. end
  393. ngx.req.read_body()
  394. local sock, err = ngx.req.socket(true)
  395. if not sock then
  396. ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)
  397. return
  398. end
  399. local data, err = sock:receive(5)
  400. if not data then
  401. ngx.log(ngx.ERR, "server: failed to receive: ", err)
  402. return
  403. end
  404. local bytes, err = sock:send("1: received: " .. data .. "\\n")
  405. if not bytes then
  406. ngx.log(ngx.ERR, "server: failed to send: ", err)
  407. return
  408. end
  409. ngx.sleep(1)
  410. ';
  411. more_clear_headers Date;
  412. }
  413. --- request
  414. GET /t
  415. --- response_body
  416. msg: 1: received: hello
  417. --- error_log
  418. mysock handler aborted
  419. --- no_error_log
  420. [error]
  421. --- wait: 0.1
  422. === TEST 11: on_abort called during sock:receive()
  423. --- config
  424. server_tokens off;
  425. lua_check_client_abort on;
  426. location = /t {
  427. #set $port 5000;
  428. set $port $TEST_NGINX_SERVER_PORT;
  429. content_by_lua '
  430. local sock = ngx.socket.tcp()
  431. local port = ngx.var.port
  432. local ok, err = sock:connect("127.0.0.1", port)
  433. if not ok then
  434. ngx.say("failed to connect: ", err)
  435. return
  436. end
  437. local req = "GET /mysock HTTP/1.1\\r\\nUpgrade: mysock\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\nhello"
  438. -- req = "OK"
  439. local bytes, err = sock:send(req)
  440. if not bytes then
  441. ngx.say("failed to send request: ", err)
  442. return
  443. end
  444. local reader = sock:receiveuntil("\\r\\n\\r\\n")
  445. local data, err, partial = reader()
  446. if not data then
  447. ngx.say("no response header found")
  448. return
  449. end
  450. local msg, err = sock:receive()
  451. if not msg then
  452. ngx.say("failed to receive: ", err)
  453. return
  454. end
  455. ngx.say("msg: ", msg)
  456. ngx.sleep(0.1)
  457. ok, err = sock:close()
  458. if not ok then
  459. ngx.say("failed to close socket: ", err)
  460. return
  461. end
  462. ';
  463. }
  464. location = /mysock {
  465. content_by_lua '
  466. ngx.status = 101
  467. ngx.send_headers()
  468. ngx.flush(true)
  469. local ok, err = ngx.on_abort(function (premature) ngx.log(ngx.WARN, "mysock handler aborted") end)
  470. if not ok then
  471. ngx.log(ngx.ERR, "failed to set on_abort handler: ", err)
  472. return
  473. end
  474. ngx.req.read_body()
  475. local sock, err = ngx.req.socket(true)
  476. if not sock then
  477. ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)
  478. return
  479. end
  480. local data, err = sock:receive(5)
  481. if not data then
  482. ngx.log(ngx.ERR, "server: failed to receive: ", err)
  483. return
  484. end
  485. local bytes, err = sock:send("1: received: " .. data .. "\\n")
  486. if not bytes then
  487. ngx.log(ngx.ERR, "server: failed to send: ", err)
  488. return
  489. end
  490. local data, err = sock:receive()
  491. if not data then
  492. ngx.log(ngx.WARN, "failed to receive a line: ", err)
  493. return
  494. end
  495. ';
  496. more_clear_headers Date;
  497. }
  498. --- request
  499. GET /t
  500. --- response_body
  501. msg: 1: received: hello
  502. --- error_log
  503. failed to receive a line: client aborted
  504. --- no_error_log
  505. [error]
  506. --- wait: 0.1
  507. === TEST 12: receiveuntil
  508. --- config
  509. server_tokens off;
  510. location = /t {
  511. #set $port 5000;
  512. set $port $TEST_NGINX_SERVER_PORT;
  513. content_by_lua '
  514. local sock = ngx.socket.tcp()
  515. local port = ngx.var.port
  516. local ok, err = sock:connect("127.0.0.1", port)
  517. if not ok then
  518. ngx.say("failed to connect: ", err)
  519. return
  520. end
  521. local req = "GET /mysock HTTP/1.1\\r\\nUpgrade: mysock\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\nhello"
  522. -- req = "OK"
  523. local bytes, err = sock:send(req)
  524. if not bytes then
  525. ngx.say("failed to send request: ", err)
  526. return
  527. end
  528. local bytes, err = sock:send(", ")
  529. if not bytes then
  530. ngx.say("failed to send packet 1: ", err)
  531. return
  532. end
  533. local bytes, err = sock:send("world")
  534. if not bytes then
  535. ngx.say("failed to send packet 2: ", err)
  536. return
  537. end
  538. local reader = sock:receiveuntil("\\r\\n\\r\\n")
  539. local data, err, partial = reader()
  540. if not data then
  541. ngx.say("no response header found")
  542. return
  543. end
  544. local msg, err = sock:receive()
  545. if not msg then
  546. ngx.say("failed to receive: ", err)
  547. return
  548. end
  549. ngx.say("msg: ", msg)
  550. ok, err = sock:close()
  551. if not ok then
  552. ngx.say("failed to close socket: ", err)
  553. return
  554. end
  555. ';
  556. }
  557. location = /mysock {
  558. content_by_lua '
  559. ngx.status = 101
  560. ngx.send_headers()
  561. ngx.flush(true)
  562. ngx.req.read_body()
  563. local sock, err = ngx.req.socket(true)
  564. if not sock then
  565. ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)
  566. return
  567. end
  568. local reader = sock:receiveuntil("rld")
  569. local data, err = reader()
  570. if not data then
  571. ngx.log(ngx.ERR, "server: failed to receive: ", err)
  572. return
  573. end
  574. local bytes, err = sock:send("1: received: " .. data .. "\\n")
  575. if not bytes then
  576. ngx.log(ngx.ERR, "server: failed to send: ", err)
  577. return
  578. end
  579. ';
  580. more_clear_headers Date;
  581. }
  582. --- request
  583. GET /t
  584. --- response_body
  585. msg: 1: received: hello, wo
  586. --- no_error_log
  587. [error]
  588. === TEST 13: request body not read yet
  589. --- config
  590. server_tokens off;
  591. location = /t {
  592. content_by_lua '
  593. local sock, err = ngx.req.socket(true)
  594. if not sock then
  595. ngx.log(ngx.ERR, "server: failed to get raw req socket: ", err)
  596. return
  597. end
  598. local data, err = sock:receive(5)
  599. if not data then
  600. ngx.log(ngx.ERR, "failed to receive: ", err)
  601. return
  602. end
  603. local ok, err = sock:send("HTTP/1.1 200 OK\\r\\nContent-Length: 5\\r\\n\\r\\n" .. data)
  604. if not ok then
  605. ngx.log(ngx.ERR, "failed to send: ", err)
  606. return
  607. end
  608. ';
  609. }
  610. --- raw_request eval
  611. "GET /t HTTP/1.0\r
  612. Host: localhost\r
  613. Content-Length: 5\r
  614. \r
  615. hello"
  616. --- response_headers
  617. Content-Length: 5
  618. --- response_body chop
  619. hello
  620. --- no_error_log
  621. [error]
  622. === TEST 14: pending request body reading
  623. --- config
  624. server_tokens off;
  625. location = /t {
  626. content_by_lua '
  627. ngx.thread.spawn(function ()
  628. ngx.req.read_body()
  629. end)
  630. local sock, err = ngx.req.socket(true)
  631. if not sock then
  632. ngx.log(ngx.WARN, "server: failed to get raw req socket: ", err)
  633. return ngx.exit(444)
  634. end
  635. local data, err = sock:receive(5)
  636. if not data then
  637. ngx.log(ngx.ERR, "failed to receive: ", err)
  638. return
  639. end
  640. local ok, err = sock:send("HTTP/1.1 200 OK\\r\\nContent-Length: 5\\r\\n\\r\\n" .. data)
  641. if not ok then
  642. ngx.log(ngx.ERR, "failed to send: ", err)
  643. return
  644. end
  645. ';
  646. }
  647. --- raw_request eval
  648. "GET /t HTTP/1.0\r
  649. Host: localhost\r
  650. Content-Length: 5\r
  651. \r
  652. hell"
  653. --- ignore_response
  654. --- no_error_log
  655. [error]
  656. [alert]
  657. --- error_log
  658. server: failed to get raw req socket: pending request body reading in some other thread