PageRenderTime 53ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/t/058-tcp-socket.t

https://github.com/npk/lua-nginx-module
Unknown | 1975 lines | 1607 code | 368 blank | 0 comment | 0 complexity | 69ff0551dac7b505631bc84e417ddc82 MD5 | raw file
  1. # vim:set ft= ts=4 sw=4 et fdm=marker:
  2. use lib 'lib';
  3. use Test::Nginx::Socket;
  4. repeat_each(2);
  5. plan tests => repeat_each() * 87;
  6. our $HtmlDir = html_dir;
  7. $ENV{TEST_NGINX_CLIENT_PORT} ||= server_port();
  8. $ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;
  9. $ENV{TEST_NGINX_RESOLVER} ||= '8.8.8.8';
  10. #log_level 'warn';
  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_CLIENT_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. ngx.say("connected: ", ok)
  30. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  31. -- req = "OK"
  32. local bytes, err = sock:send(req)
  33. if not bytes then
  34. ngx.say("failed to send request: ", err)
  35. return
  36. end
  37. ngx.say("request sent: ", bytes)
  38. while true do
  39. local line, err, part = sock:receive()
  40. if line then
  41. ngx.say("received: ", line)
  42. else
  43. ngx.say("failed to receive a line: ", err, " [", part, "]")
  44. break
  45. end
  46. end
  47. ok, err = sock:close()
  48. ngx.say("close: ", ok, " ", err)
  49. ';
  50. }
  51. location /foo {
  52. content_by_lua 'ngx.say("foo")';
  53. more_clear_headers Date;
  54. }
  55. --- request
  56. GET /t
  57. --- response_body
  58. connected: 1
  59. request sent: 57
  60. received: HTTP/1.1 200 OK
  61. received: Server: nginx
  62. received: Content-Type: text/plain
  63. received: Content-Length: 4
  64. received: Connection: close
  65. received:
  66. received: foo
  67. failed to receive a line: closed []
  68. close: nil closed
  69. --- no_error_log
  70. [error]
  71. === TEST 2: no trailing newline
  72. --- config
  73. server_tokens off;
  74. location /t {
  75. #set $port 1234;
  76. set $port $TEST_NGINX_CLIENT_PORT;
  77. content_by_lua '
  78. local sock = ngx.socket.tcp()
  79. local port = ngx.var.port
  80. local ok, err = sock:connect("127.0.0.1", port)
  81. if not ok then
  82. ngx.say("failed to connect: ", err)
  83. return
  84. end
  85. ngx.say("connected: ", ok)
  86. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  87. -- req = "OK"
  88. local bytes, err = sock:send(req)
  89. if not bytes then
  90. ngx.say("failed to send request: ", err)
  91. return
  92. end
  93. ngx.say("request sent: ", bytes)
  94. while true do
  95. local line, err, part = sock:receive()
  96. if line then
  97. ngx.say("received: ", line)
  98. else
  99. ngx.say("failed to receive a line: ", err, " [", part, "]")
  100. break
  101. end
  102. end
  103. sock:close()
  104. ngx.say("closed")
  105. ';
  106. }
  107. location /foo {
  108. content_by_lua 'ngx.print("foo")';
  109. more_clear_headers Date;
  110. }
  111. --- request
  112. GET /t
  113. --- response_body
  114. connected: 1
  115. request sent: 57
  116. received: HTTP/1.1 200 OK
  117. received: Server: nginx
  118. received: Content-Type: text/plain
  119. received: Content-Length: 3
  120. received: Connection: close
  121. received:
  122. failed to receive a line: closed [foo]
  123. closed
  124. --- no_error_log
  125. [error]
  126. === TEST 3: no resolver defined
  127. --- config
  128. server_tokens off;
  129. location /t {
  130. #set $port 1234;
  131. set $port $TEST_NGINX_CLIENT_PORT;
  132. content_by_lua '
  133. local sock = ngx.socket.tcp()
  134. local port = ngx.var.port
  135. local ok, err = sock:connect("agentzh.org", port)
  136. if not ok then
  137. ngx.say("failed to connect: ", err)
  138. end
  139. ngx.say("connected: ", ok)
  140. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  141. -- req = "OK"
  142. local bytes, err = sock:send(req)
  143. if not bytes then
  144. ngx.say("failed to send request: ", err)
  145. return
  146. end
  147. ngx.say("request sent: ", bytes)
  148. ';
  149. }
  150. --- request
  151. GET /t
  152. --- response_body
  153. failed to connect: no resolver defined to resolve "agentzh.org"
  154. connected: nil
  155. failed to send request: closed
  156. --- error_log
  157. attempt to send data on a closed socket:
  158. === TEST 4: with resolver
  159. --- timeout: 10
  160. --- config
  161. server_tokens off;
  162. resolver $TEST_NGINX_RESOLVER;
  163. resolver_timeout 5s;
  164. location /t {
  165. content_by_lua '
  166. local sock = ngx.socket.tcp()
  167. local port = 80
  168. local ok, err = sock:connect("agentzh.org", port)
  169. if not ok then
  170. ngx.say("failed to connect: ", err)
  171. return
  172. end
  173. ngx.say("connected: ", ok)
  174. local req = "GET / HTTP/1.0\\r\\nHost: agentzh.org\\r\\nConnection: close\\r\\n\\r\\n"
  175. -- req = "OK"
  176. local bytes, err = sock:send(req)
  177. if not bytes then
  178. ngx.say("failed to send request: ", err)
  179. return
  180. end
  181. ngx.say("request sent: ", bytes)
  182. local line, err = sock:receive()
  183. if line then
  184. ngx.say("first line received: ", line)
  185. else
  186. ngx.say("failed to receive the first line: ", err)
  187. end
  188. line, err = sock:receive()
  189. if line then
  190. ngx.say("second line received: ", line)
  191. else
  192. ngx.say("failed to receive the second line: ", err)
  193. end
  194. ';
  195. }
  196. --- request
  197. GET /t
  198. --- response_body
  199. connected: 1
  200. request sent: 56
  201. first line received: HTTP/1.1 200 OK
  202. second line received: Server: ngx_openresty
  203. --- no_error_log
  204. [error]
  205. === TEST 5: connection refused (tcp)
  206. --- config
  207. location /test {
  208. content_by_lua '
  209. local sock = ngx.socket.tcp()
  210. local ok, err = sock:connect("127.0.0.1", 16787)
  211. ngx.say("connect: ", ok, " ", err)
  212. local bytes
  213. bytes, err = sock:send("hello")
  214. ngx.say("send: ", bytes, " ", err)
  215. local line
  216. line, err = sock:receive()
  217. ngx.say("receive: ", line, " ", err)
  218. ok, err = sock:close()
  219. ngx.say("close: ", ok, " ", err)
  220. ';
  221. }
  222. --- request
  223. GET /test
  224. --- response_body
  225. connect: nil connection refused
  226. send: nil closed
  227. receive: nil closed
  228. close: nil closed
  229. --- error_log
  230. connect() failed (111: Connection refused)
  231. === TEST 6: connection timeout (tcp)
  232. --- config
  233. resolver $TEST_NGINX_RESOLVER;
  234. lua_socket_connect_timeout 100ms;
  235. lua_socket_send_timeout 100ms;
  236. lua_socket_read_timeout 100ms;
  237. resolver_timeout 2s;
  238. location /test {
  239. content_by_lua '
  240. local sock = ngx.socket.tcp()
  241. local ok, err = sock:connect("taobao.com", 16787)
  242. ngx.say("connect: ", ok, " ", err)
  243. local bytes
  244. bytes, err = sock:send("hello")
  245. ngx.say("send: ", bytes, " ", err)
  246. local line
  247. line, err = sock:receive()
  248. ngx.say("receive: ", line, " ", err)
  249. ok, err = sock:close()
  250. ngx.say("close: ", ok, " ", err)
  251. ';
  252. }
  253. --- request
  254. GET /test
  255. --- response_body
  256. connect: nil timeout
  257. send: nil closed
  258. receive: nil closed
  259. close: nil closed
  260. --- error_log
  261. lua socket connect timed out
  262. === TEST 7: not closed manually
  263. --- config
  264. server_tokens off;
  265. location /t {
  266. #set $port 5000;
  267. set $port $TEST_NGINX_CLIENT_PORT;
  268. content_by_lua '
  269. local sock = ngx.socket.tcp()
  270. local port = ngx.var.port
  271. local ok, err = sock:connect("127.0.0.1", port)
  272. if not ok then
  273. ngx.say("failed to connect: ", err)
  274. return
  275. end
  276. ngx.say("connected: ", ok)
  277. ';
  278. }
  279. location /foo {
  280. echo foo;
  281. more_clear_headers Date;
  282. }
  283. --- request
  284. GET /t
  285. --- response_body
  286. connected: 1
  287. --- no_error_log
  288. [error]
  289. === TEST 8: resolver error (host not found)
  290. --- config
  291. server_tokens off;
  292. resolver $TEST_NGINX_RESOLVER;
  293. resolver_timeout 4s;
  294. location /t {
  295. content_by_lua '
  296. local sock = ngx.socket.tcp()
  297. local port = 80
  298. local ok, err = sock:connect("blah-blah-not-found.agentzh.org", port)
  299. print("connected: ", ok, " ", err, " ", not ok)
  300. if not ok then
  301. ngx.say("failed to connect: ", err)
  302. end
  303. ngx.say("connected: ", ok)
  304. local req = "GET / HTTP/1.0\\r\\nHost: agentzh.org\\r\\nConnection: close\\r\\n\\r\\n"
  305. -- req = "OK"
  306. local bytes, err = sock:send(req)
  307. if not bytes then
  308. ngx.say("failed to send request: ", err)
  309. return
  310. end
  311. ngx.say("request sent: ", bytes)
  312. ';
  313. }
  314. --- request
  315. GET /t
  316. --- response_body_like
  317. ^failed to connect: blah-blah-not-found\.agentzh\.org could not be resolved(?: \(3: Host not found\))?
  318. connected: nil
  319. failed to send request: closed$
  320. --- error_log
  321. attempt to send data on a closed socket
  322. --- timeout: 5
  323. === TEST 9: resolver error (timeout)
  324. --- config
  325. server_tokens off;
  326. resolver 8.8.8.8;
  327. resolver_timeout 1ms;
  328. location /t {
  329. content_by_lua '
  330. local sock = ngx.socket.tcp()
  331. local port = 80
  332. local ok, err = sock:connect("blah-blah-not-found.agentzh.org", port)
  333. print("connected: ", ok, " ", err, " ", not ok)
  334. if not ok then
  335. ngx.say("failed to connect: ", err)
  336. end
  337. ngx.say("connected: ", ok)
  338. local req = "GET / HTTP/1.0\\r\\nHost: agentzh.org\\r\\nConnection: close\\r\\n\\r\\n"
  339. -- req = "OK"
  340. local bytes, err = sock:send(req)
  341. if not bytes then
  342. ngx.say("failed to send request: ", err)
  343. return
  344. end
  345. ngx.say("request sent: ", bytes)
  346. ';
  347. }
  348. --- request
  349. GET /t
  350. --- response_body_like
  351. ^failed to connect: blah-blah-not-found\.agentzh\.org could not be resolved(?: \(110: Operation timed out\))?
  352. connected: nil
  353. failed to send request: closed$
  354. --- error_log
  355. attempt to send data on a closed socket
  356. === TEST 10: explicit *l pattern for receive
  357. --- config
  358. server_tokens off;
  359. location /t {
  360. #set $port 5000;
  361. set $port $TEST_NGINX_CLIENT_PORT;
  362. content_by_lua '
  363. local sock = ngx.socket.tcp()
  364. local port = ngx.var.port
  365. local ok, err = sock:connect("127.0.0.1", port)
  366. if not ok then
  367. ngx.say("failed to connect: ", err)
  368. return
  369. end
  370. ngx.say("connected: ", ok)
  371. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  372. -- req = "OK"
  373. local bytes, err = sock:send(req)
  374. if not bytes then
  375. ngx.say("failed to send request: ", err)
  376. return
  377. end
  378. ngx.say("request sent: ", bytes)
  379. while true do
  380. local line, err = sock:receive("*l")
  381. if line then
  382. ngx.say("received: ", line)
  383. else
  384. ngx.say("failed to receive a line: ", err)
  385. break
  386. end
  387. end
  388. ok, err = sock:close()
  389. ngx.say("close: ", ok, " ", err)
  390. ';
  391. }
  392. location /foo {
  393. content_by_lua 'ngx.say("foo")';
  394. more_clear_headers Date;
  395. }
  396. --- request
  397. GET /t
  398. --- response_body
  399. connected: 1
  400. request sent: 57
  401. received: HTTP/1.1 200 OK
  402. received: Server: nginx
  403. received: Content-Type: text/plain
  404. received: Content-Length: 4
  405. received: Connection: close
  406. received:
  407. received: foo
  408. failed to receive a line: closed
  409. close: nil closed
  410. --- no_error_log
  411. [error]
  412. === TEST 11: *a pattern for receive
  413. --- config
  414. server_tokens off;
  415. location /t {
  416. #set $port 5000;
  417. set $port $TEST_NGINX_CLIENT_PORT;
  418. content_by_lua '
  419. local sock = ngx.socket.tcp()
  420. local port = ngx.var.port
  421. local ok, err = sock:connect("127.0.0.1", port)
  422. if not ok then
  423. ngx.say("failed to connect: ", err)
  424. return
  425. end
  426. ngx.say("connected: ", ok)
  427. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  428. -- req = "OK"
  429. local bytes, err = sock:send(req)
  430. if not bytes then
  431. ngx.say("failed to send request: ", err)
  432. return
  433. end
  434. ngx.say("request sent: ", bytes)
  435. local data, err = sock:receive("*a")
  436. if data then
  437. ngx.say("receive: ", data)
  438. ngx.say("err: ", err)
  439. else
  440. ngx.say("failed to receive: ", err)
  441. end
  442. ok, err = sock:close()
  443. ngx.say("close: ", ok, " ", err)
  444. ';
  445. }
  446. location /foo {
  447. content_by_lua 'ngx.say("foo")';
  448. more_clear_headers Date;
  449. }
  450. --- request
  451. GET /t
  452. --- response_body eval
  453. "connected: 1
  454. request sent: 57
  455. receive: HTTP/1.1 200 OK\r
  456. Server: nginx\r
  457. Content-Type: text/plain\r
  458. Content-Length: 4\r
  459. Connection: close\r
  460. \r
  461. foo
  462. err: nil
  463. close: nil closed
  464. "
  465. --- no_error_log
  466. [error]
  467. === TEST 12: mixing *a and *l patterns for receive
  468. --- config
  469. server_tokens off;
  470. location /t {
  471. #set $port 5000;
  472. set $port $TEST_NGINX_CLIENT_PORT;
  473. content_by_lua '
  474. local sock = ngx.socket.tcp()
  475. local port = ngx.var.port
  476. local ok, err = sock:connect("127.0.0.1", port)
  477. if not ok then
  478. ngx.say("failed to connect: ", err)
  479. return
  480. end
  481. ngx.say("connected: ", ok)
  482. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  483. -- req = "OK"
  484. local bytes, err = sock:send(req)
  485. if not bytes then
  486. ngx.say("failed to send request: ", err)
  487. return
  488. end
  489. ngx.say("request sent: ", bytes)
  490. local line, err = sock:receive("*l")
  491. if line then
  492. ngx.say("receive: ", line)
  493. ngx.say("err: ", err)
  494. else
  495. ngx.say("failed to receive: ", err)
  496. end
  497. local data
  498. data, err = sock:receive("*a")
  499. if data then
  500. ngx.say("receive: ", data)
  501. ngx.say("err: ", err)
  502. else
  503. ngx.say("failed to receive: ", err)
  504. end
  505. ok, err = sock:close()
  506. ngx.say("close: ", ok, " ", err)
  507. ';
  508. }
  509. location /foo {
  510. content_by_lua 'ngx.say("foo")';
  511. more_clear_headers Date;
  512. }
  513. --- request
  514. GET /t
  515. --- response_body eval
  516. "connected: 1
  517. request sent: 57
  518. receive: HTTP/1.1 200 OK
  519. err: nil
  520. receive: Server: nginx\r
  521. Content-Type: text/plain\r
  522. Content-Length: 4\r
  523. Connection: close\r
  524. \r
  525. foo
  526. err: nil
  527. close: nil closed
  528. "
  529. --- no_error_log
  530. [error]
  531. === TEST 13: receive by chunks
  532. --- timeout: 5
  533. --- config
  534. server_tokens off;
  535. location /t {
  536. #set $port 5000;
  537. set $port $TEST_NGINX_CLIENT_PORT;
  538. content_by_lua '
  539. local sock = ngx.socket.tcp()
  540. local port = ngx.var.port
  541. local ok, err = sock:connect("127.0.0.1", port)
  542. if not ok then
  543. ngx.say("failed to connect: ", err)
  544. return
  545. end
  546. ngx.say("connected: ", ok)
  547. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  548. -- req = "OK"
  549. local bytes, err = sock:send(req)
  550. if not bytes then
  551. ngx.say("failed to send request: ", err)
  552. return
  553. end
  554. ngx.say("request sent: ", bytes)
  555. while true do
  556. local data, err, partial = sock:receive(10)
  557. if data then
  558. local len = string.len(data)
  559. if len == 10 then
  560. ngx.print("[", data, "]")
  561. else
  562. ngx.say("ERROR: returned invalid length of data: ", len)
  563. end
  564. else
  565. ngx.say("failed to receive a line: ", err, " [", partial, "]")
  566. break
  567. end
  568. end
  569. ok, err = sock:close()
  570. ngx.say("close: ", ok, " ", err)
  571. ';
  572. }
  573. location /foo {
  574. content_by_lua 'ngx.say("foo")';
  575. more_clear_headers Date;
  576. }
  577. --- request
  578. GET /t
  579. --- response_body eval
  580. "connected: 1
  581. request sent: 57
  582. [HTTP/1.1 2][00 OK\r
  583. Ser][ver: nginx][\r
  584. Content-][Type: text][/plain\r
  585. Co][ntent-Leng][th: 4\r
  586. Con][nection: c][lose\r
  587. \r
  588. fo]failed to receive a line: closed [o
  589. ]
  590. close: nil closed
  591. "
  592. --- no_error_log
  593. [error]
  594. === TEST 14: receive by chunks (very small buffer)
  595. --- timeout: 5
  596. --- config
  597. server_tokens off;
  598. lua_socket_buffer_size 1;
  599. location /t {
  600. #set $port 5000;
  601. set $port $TEST_NGINX_CLIENT_PORT;
  602. content_by_lua '
  603. local sock = ngx.socket.tcp()
  604. local port = ngx.var.port
  605. local ok, err = sock:connect("127.0.0.1", port)
  606. if not ok then
  607. ngx.say("failed to connect: ", err)
  608. return
  609. end
  610. ngx.say("connected: ", ok)
  611. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  612. -- req = "OK"
  613. local bytes, err = sock:send(req)
  614. if not bytes then
  615. ngx.say("failed to send request: ", err)
  616. return
  617. end
  618. ngx.say("request sent: ", bytes)
  619. while true do
  620. local data, err, partial = sock:receive(10)
  621. if data then
  622. local len = string.len(data)
  623. if len == 10 then
  624. ngx.print("[", data, "]")
  625. else
  626. ngx.say("ERROR: returned invalid length of data: ", len)
  627. end
  628. else
  629. ngx.say("failed to receive a line: ", err, " [", partial, "]")
  630. break
  631. end
  632. end
  633. ok, err = sock:close()
  634. ngx.say("close: ", ok, " ", err)
  635. ';
  636. }
  637. location /foo {
  638. content_by_lua 'ngx.say("foo")';
  639. more_clear_headers Date;
  640. }
  641. --- request
  642. GET /t
  643. --- response_body eval
  644. "connected: 1
  645. request sent: 57
  646. [HTTP/1.1 2][00 OK\r
  647. Ser][ver: nginx][\r
  648. Content-][Type: text][/plain\r
  649. Co][ntent-Leng][th: 4\r
  650. Con][nection: c][lose\r
  651. \r
  652. fo]failed to receive a line: closed [o
  653. ]
  654. close: nil closed
  655. "
  656. --- no_error_log
  657. [error]
  658. === TEST 15: line reading (very small buffer)
  659. --- config
  660. server_tokens off;
  661. lua_socket_buffer_size 1;
  662. location /t {
  663. #set $port 5000;
  664. set $port $TEST_NGINX_CLIENT_PORT;
  665. content_by_lua '
  666. local sock = ngx.socket.tcp()
  667. local port = ngx.var.port
  668. local ok, err = sock:connect("127.0.0.1", port)
  669. if not ok then
  670. ngx.say("failed to connect: ", err)
  671. return
  672. end
  673. ngx.say("connected: ", ok)
  674. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  675. -- req = "OK"
  676. local bytes, err = sock:send(req)
  677. if not bytes then
  678. ngx.say("failed to send request: ", err)
  679. return
  680. end
  681. ngx.say("request sent: ", bytes)
  682. while true do
  683. local line, err, part = sock:receive()
  684. if line then
  685. ngx.say("received: ", line)
  686. else
  687. ngx.say("failed to receive a line: ", err, " [", part, "]")
  688. break
  689. end
  690. end
  691. ok, err = sock:close()
  692. ngx.say("close: ", ok, " ", err)
  693. ';
  694. }
  695. location /foo {
  696. content_by_lua 'ngx.say("foo")';
  697. more_clear_headers Date;
  698. }
  699. --- request
  700. GET /t
  701. --- response_body
  702. connected: 1
  703. request sent: 57
  704. received: HTTP/1.1 200 OK
  705. received: Server: nginx
  706. received: Content-Type: text/plain
  707. received: Content-Length: 4
  708. received: Connection: close
  709. received:
  710. received: foo
  711. failed to receive a line: closed []
  712. close: nil closed
  713. --- no_error_log
  714. [error]
  715. === TEST 16: ngx.socket.connect (working)
  716. --- config
  717. server_tokens off;
  718. location /t {
  719. #set $port 5000;
  720. set $port $TEST_NGINX_CLIENT_PORT;
  721. content_by_lua '
  722. local port = ngx.var.port
  723. local sock, err = ngx.socket.connect("127.0.0.1", port)
  724. if not sock then
  725. ngx.say("failed to connect: ", err)
  726. return
  727. end
  728. ngx.say("connected.")
  729. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  730. -- req = "OK"
  731. local bytes, err = sock:send(req)
  732. if not bytes then
  733. ngx.say("failed to send request: ", err)
  734. return
  735. end
  736. ngx.say("request sent: ", bytes)
  737. while true do
  738. local line, err, part = sock:receive()
  739. if line then
  740. ngx.say("received: ", line)
  741. else
  742. ngx.say("failed to receive a line: ", err, " [", part, "]")
  743. break
  744. end
  745. end
  746. ok, err = sock:close()
  747. ngx.say("close: ", ok, " ", err)
  748. ';
  749. }
  750. location /foo {
  751. content_by_lua 'ngx.say("foo")';
  752. more_clear_headers Date;
  753. }
  754. --- request
  755. GET /t
  756. --- response_body
  757. connected.
  758. request sent: 57
  759. received: HTTP/1.1 200 OK
  760. received: Server: nginx
  761. received: Content-Type: text/plain
  762. received: Content-Length: 4
  763. received: Connection: close
  764. received:
  765. received: foo
  766. failed to receive a line: closed []
  767. close: nil closed
  768. --- no_error_log
  769. [error]
  770. === TEST 17: ngx.socket.connect() shortcut (connection refused)
  771. --- config
  772. location /test {
  773. content_by_lua '
  774. local sock = ngx.socket.tcp()
  775. local sock, err = sock:connect("127.0.0.1", 16787)
  776. if not sock then
  777. ngx.say("failed to connect: ", err)
  778. return
  779. end
  780. local bytes
  781. bytes, err = sock:send("hello")
  782. ngx.say("send: ", bytes, " ", err)
  783. local line
  784. line, err = sock:receive()
  785. ngx.say("receive: ", line, " ", err)
  786. ok, err = sock:close()
  787. ngx.say("close: ", ok, " ", err)
  788. ';
  789. }
  790. --- request
  791. GET /test
  792. --- response_body
  793. failed to connect: connection refused
  794. --- error_log
  795. connect() failed (111: Connection refused)
  796. === TEST 18: receive by chunks (stringified size)
  797. --- config
  798. server_tokens off;
  799. location /t {
  800. #set $port 5000;
  801. set $port $TEST_NGINX_CLIENT_PORT;
  802. content_by_lua '
  803. local sock = ngx.socket.tcp()
  804. local port = ngx.var.port
  805. local ok, err = sock:connect("127.0.0.1", port)
  806. if not ok then
  807. ngx.say("failed to connect: ", err)
  808. return
  809. end
  810. ngx.say("connected: ", ok)
  811. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  812. -- req = "OK"
  813. local bytes, err = sock:send(req)
  814. if not bytes then
  815. ngx.say("failed to send request: ", err)
  816. return
  817. end
  818. ngx.say("request sent: ", bytes)
  819. while true do
  820. local data, err, partial = sock:receive("10")
  821. if data then
  822. local len = string.len(data)
  823. if len == 10 then
  824. ngx.print("[", data, "]")
  825. else
  826. ngx.say("ERROR: returned invalid length of data: ", len)
  827. end
  828. else
  829. ngx.say("failed to receive a line: ", err, " [", partial, "]")
  830. break
  831. end
  832. end
  833. ok, err = sock:close()
  834. ngx.say("close: ", ok, " ", err)
  835. ';
  836. }
  837. location /foo {
  838. content_by_lua 'ngx.say("foo")';
  839. more_clear_headers Date;
  840. }
  841. --- request
  842. GET /t
  843. --- response_body eval
  844. "connected: 1
  845. request sent: 57
  846. [HTTP/1.1 2][00 OK\r
  847. Ser][ver: nginx][\r
  848. Content-][Type: text][/plain\r
  849. Co][ntent-Leng][th: 4\r
  850. Con][nection: c][lose\r
  851. \r
  852. fo]failed to receive a line: closed [o
  853. ]
  854. close: nil closed
  855. "
  856. --- no_error_log
  857. [error]
  858. === TEST 19: cannot survive across request boundary (send)
  859. --- http_config eval
  860. "lua_package_path '$::HtmlDir/?.lua;./?.lua';"
  861. --- config
  862. server_tokens off;
  863. location /t {
  864. #set $port 5000;
  865. set $port $TEST_NGINX_MEMCACHED_PORT;
  866. content_by_lua '
  867. local test = require "test"
  868. test.go(ngx.var.port)
  869. ';
  870. }
  871. --- user_files
  872. >>> test.lua
  873. module("test", package.seeall)
  874. local sock
  875. function go(port)
  876. if not sock then
  877. sock = ngx.socket.tcp()
  878. local port = ngx.var.port
  879. local ok, err = sock:connect("127.0.0.1", port)
  880. if not ok then
  881. ngx.say("failed to connect: ", err)
  882. return
  883. end
  884. ngx.say("connected: ", ok)
  885. end
  886. local req = "flush_all\r\n"
  887. local bytes, err = sock:send(req)
  888. if not bytes then
  889. ngx.say("failed to send request: ", err)
  890. return
  891. end
  892. ngx.say("request sent: ", bytes)
  893. local line, err, part = sock:receive()
  894. if line then
  895. ngx.say("received: ", line)
  896. else
  897. ngx.say("failed to receive a line: ", err, " [", part, "]")
  898. end
  899. end
  900. --- request
  901. GET /t
  902. --- response_body_like eval
  903. "^(?:connected: 1
  904. request sent: 11
  905. received: OK|failed to send request: closed)\$"
  906. === TEST 20: cannot survive across request boundary (receive)
  907. --- http_config eval
  908. "lua_package_path '$::HtmlDir/?.lua;./?.lua';"
  909. --- config
  910. server_tokens off;
  911. location /t {
  912. #set $port 5000;
  913. set $port $TEST_NGINX_MEMCACHED_PORT;
  914. content_by_lua '
  915. local test = require "test"
  916. test.go(ngx.var.port)
  917. ';
  918. }
  919. --- user_files
  920. >>> test.lua
  921. module("test", package.seeall)
  922. local sock
  923. function go(port)
  924. if not sock then
  925. sock = ngx.socket.tcp()
  926. local port = ngx.var.port
  927. local ok, err = sock:connect("127.0.0.1", port)
  928. if not ok then
  929. ngx.say("failed to connect: ", err)
  930. return
  931. end
  932. ngx.say("connected: ", ok)
  933. else
  934. local line, err, part = sock:receive()
  935. if line then
  936. ngx.say("received: ", line)
  937. else
  938. ngx.say("failed to receive a line: ", err, " [", part, "]")
  939. end
  940. return
  941. end
  942. local req = "flush_all\r\n"
  943. local bytes, err = sock:send(req)
  944. if not bytes then
  945. ngx.say("failed to send request: ", err)
  946. return
  947. end
  948. ngx.say("request sent: ", bytes)
  949. local line, err, part = sock:receive()
  950. if line then
  951. ngx.say("received: ", line)
  952. else
  953. ngx.say("failed to receive a line: ", err, " [", part, "]")
  954. end
  955. end
  956. --- request
  957. GET /t
  958. --- response_body_like eval
  959. qr/^(?:connected: 1
  960. request sent: 11
  961. received: OK|failed to receive a line: closed \[nil\])$/
  962. === TEST 21: cannot survive across request boundary (close)
  963. --- http_config eval
  964. "lua_package_path '$::HtmlDir/?.lua;./?.lua';"
  965. --- config
  966. server_tokens off;
  967. location /t {
  968. #set $port 5000;
  969. set $port $TEST_NGINX_MEMCACHED_PORT;
  970. content_by_lua '
  971. local test = require "test"
  972. test.go(ngx.var.port)
  973. ';
  974. }
  975. --- user_files
  976. >>> test.lua
  977. module("test", package.seeall)
  978. local sock
  979. function go(port)
  980. if not sock then
  981. sock = ngx.socket.tcp()
  982. local port = ngx.var.port
  983. local ok, err = sock:connect("127.0.0.1", port)
  984. if not ok then
  985. ngx.say("failed to connect: ", err)
  986. return
  987. end
  988. ngx.say("connected: ", ok)
  989. else
  990. local ok, err = sock:close()
  991. if ok then
  992. ngx.say("successfully closed")
  993. else
  994. ngx.say("failed to close: ", err)
  995. end
  996. return
  997. end
  998. local req = "flush_all\r\n"
  999. local bytes, err = sock:send(req)
  1000. if not bytes then
  1001. ngx.say("failed to send request: ", err)
  1002. return
  1003. end
  1004. ngx.say("request sent: ", bytes)
  1005. local line, err, part = sock:receive()
  1006. if line then
  1007. ngx.say("received: ", line)
  1008. else
  1009. ngx.say("failed to receive a line: ", err, " [", part, "]")
  1010. end
  1011. end
  1012. --- request
  1013. GET /t
  1014. --- response_body_like eval
  1015. qr/^(?:connected: 1
  1016. request sent: 11
  1017. received: OK|failed to close: closed)$/
  1018. === TEST 22: cannot survive across request boundary (connect)
  1019. --- http_config eval
  1020. "lua_package_path '$::HtmlDir/?.lua;./?.lua';"
  1021. --- config
  1022. server_tokens off;
  1023. location /t {
  1024. #set $port 5000;
  1025. set $port $TEST_NGINX_MEMCACHED_PORT;
  1026. content_by_lua '
  1027. local test = require "test"
  1028. test.go(ngx.var.port)
  1029. test.go(ngx.var.port)
  1030. ';
  1031. }
  1032. --- user_files
  1033. >>> test.lua
  1034. module("test", package.seeall)
  1035. local sock
  1036. function go(port)
  1037. if not sock then
  1038. sock = ngx.socket.tcp()
  1039. local port = ngx.var.port
  1040. local ok, err = sock:connect("127.0.0.1", port)
  1041. if not ok then
  1042. ngx.say("failed to connect: ", err)
  1043. return
  1044. end
  1045. ngx.say("connected: ", ok)
  1046. else
  1047. local port = ngx.var.port
  1048. local ok, err = sock:connect("127.0.0.1", port)
  1049. if not ok then
  1050. ngx.say("failed to connect again: ", err)
  1051. return
  1052. end
  1053. ngx.say("connected again: ", ok)
  1054. end
  1055. local req = "flush_all\r\n"
  1056. local bytes, err = sock:send(req)
  1057. if not bytes then
  1058. ngx.say("failed to send request: ", err)
  1059. return
  1060. end
  1061. ngx.say("request sent: ", bytes)
  1062. local line, err, part = sock:receive()
  1063. if line then
  1064. ngx.say("received: ", line)
  1065. else
  1066. ngx.say("failed to receive a line: ", err, " [", part, "]")
  1067. end
  1068. end
  1069. --- request
  1070. GET /t
  1071. --- response_body_like eval
  1072. qr/^(?:connected(?: again)?: 1
  1073. request sent: 11
  1074. received: OK
  1075. ){2}$/
  1076. --- error_log
  1077. lua reuse socket upstream ctx
  1078. --- no_error_log
  1079. [error]
  1080. === TEST 23: connect again immediately
  1081. --- config
  1082. server_tokens off;
  1083. location /t {
  1084. #set $port 5000;
  1085. set $port $TEST_NGINX_MEMCACHED_PORT;
  1086. content_by_lua '
  1087. local sock = ngx.socket.tcp()
  1088. local port = ngx.var.port
  1089. local ok, err = sock:connect("127.0.0.1", port)
  1090. if not ok then
  1091. ngx.say("failed to connect: ", err)
  1092. return
  1093. end
  1094. ngx.say("connected: ", ok)
  1095. ok, err = sock:connect("127.0.0.1", port)
  1096. if not ok then
  1097. ngx.say("failed to connect: ", err)
  1098. return
  1099. end
  1100. ngx.say("connected again: ", ok)
  1101. local req = "flush_all\\r\\n"
  1102. local bytes, err = sock:send(req)
  1103. if not bytes then
  1104. ngx.say("failed to send request: ", err)
  1105. return
  1106. end
  1107. ngx.say("request sent: ", bytes)
  1108. local line, err, part = sock:receive()
  1109. if line then
  1110. ngx.say("received: ", line)
  1111. else
  1112. ngx.say("failed to receive a line: ", err, " [", part, "]")
  1113. end
  1114. ok, err = sock:close()
  1115. ngx.say("close: ", ok, " ", err)
  1116. ';
  1117. }
  1118. location /foo {
  1119. echo foo;
  1120. more_clear_headers Date;
  1121. }
  1122. --- request
  1123. GET /t
  1124. --- response_body
  1125. connected: 1
  1126. connected again: 1
  1127. request sent: 11
  1128. received: OK
  1129. close: 1 nil
  1130. --- no_error_log
  1131. [error]
  1132. --- error_log eval
  1133. ["lua reuse socket upstream", "lua socket reconnect without shutting down"]
  1134. === TEST 24: two sockets mix together
  1135. --- config
  1136. server_tokens off;
  1137. location /t {
  1138. #set $port 5000;
  1139. set $port1 $TEST_NGINX_MEMCACHED_PORT;
  1140. set $port2 $TEST_NGINX_CLIENT_PORT;
  1141. content_by_lua '
  1142. local sock1 = ngx.socket.tcp()
  1143. local sock2 = ngx.socket.tcp()
  1144. local port1 = ngx.var.port1
  1145. local port2 = ngx.var.port2
  1146. local ok, err = sock1:connect("127.0.0.1", port1)
  1147. if not ok then
  1148. ngx.say("1: failed to connect: ", err)
  1149. return
  1150. end
  1151. ngx.say("1: connected: ", ok)
  1152. ok, err = sock2:connect("127.0.0.1", port2)
  1153. if not ok then
  1154. ngx.say("2: failed to connect: ", err)
  1155. return
  1156. end
  1157. ngx.say("2: connected: ", ok)
  1158. local req1 = "flush_all\\r\\n"
  1159. local bytes, err = sock1:send(req1)
  1160. if not bytes then
  1161. ngx.say("1: failed to send request: ", err)
  1162. return
  1163. end
  1164. ngx.say("1: request sent: ", bytes)
  1165. local req2 = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  1166. local bytes, err = sock2:send(req2)
  1167. if not bytes then
  1168. ngx.say("2: failed to send request: ", err)
  1169. return
  1170. end
  1171. ngx.say("2: request sent: ", bytes)
  1172. local line, err, part = sock1:receive()
  1173. if line then
  1174. ngx.say("1: received: ", line)
  1175. else
  1176. ngx.say("1: failed to receive a line: ", err, " [", part, "]")
  1177. end
  1178. line, err, part = sock2:receive()
  1179. if line then
  1180. ngx.say("2: received: ", line)
  1181. else
  1182. ngx.say("2: failed to receive a line: ", err, " [", part, "]")
  1183. end
  1184. ok, err = sock1:close()
  1185. ngx.say("1: close: ", ok, " ", err)
  1186. ok, err = sock2:close()
  1187. ngx.say("2: close: ", ok, " ", err)
  1188. ';
  1189. }
  1190. location /foo {
  1191. echo foo;
  1192. more_clear_headers Date;
  1193. }
  1194. --- request
  1195. GET /t
  1196. --- response_body
  1197. 1: connected: 1
  1198. 2: connected: 1
  1199. 1: request sent: 11
  1200. 2: request sent: 57
  1201. 1: received: OK
  1202. 2: received: HTTP/1.1 200 OK
  1203. 1: close: 1 nil
  1204. 2: close: 1 nil
  1205. --- no_error_log
  1206. [error]
  1207. === TEST 25: send tables of string fragments
  1208. --- config
  1209. server_tokens off;
  1210. location /t {
  1211. #set $port 5000;
  1212. set $port $TEST_NGINX_CLIENT_PORT;
  1213. content_by_lua '
  1214. local sock = ngx.socket.tcp()
  1215. local port = ngx.var.port
  1216. local ok, err = sock:connect("127.0.0.1", port)
  1217. if not ok then
  1218. ngx.say("failed to connect: ", err)
  1219. return
  1220. end
  1221. ngx.say("connected: ", ok)
  1222. local req = {"GET", " ", "/foo", " HTTP/", 1, ".", 0, "\\r\\n",
  1223. "Host: localhost\\r\\n", "Connection: close\\r\\n",
  1224. "\\r\\n"}
  1225. -- req = "OK"
  1226. local bytes, err = sock:send(req)
  1227. if not bytes then
  1228. ngx.say("failed to send request: ", err)
  1229. return
  1230. end
  1231. ngx.say("request sent: ", bytes)
  1232. while true do
  1233. local line, err, part = sock:receive()
  1234. if line then
  1235. ngx.say("received: ", line)
  1236. else
  1237. ngx.say("failed to receive a line: ", err, " [", part, "]")
  1238. break
  1239. end
  1240. end
  1241. ok, err = sock:close()
  1242. ngx.say("close: ", ok, " ", err)
  1243. ';
  1244. }
  1245. location /foo {
  1246. content_by_lua 'ngx.say("foo")';
  1247. more_clear_headers Date;
  1248. }
  1249. --- request
  1250. GET /t
  1251. --- response_body
  1252. connected: 1
  1253. request sent: 57
  1254. received: HTTP/1.1 200 OK
  1255. received: Server: nginx
  1256. received: Content-Type: text/plain
  1257. received: Content-Length: 4
  1258. received: Connection: close
  1259. received:
  1260. received: foo
  1261. failed to receive a line: closed []
  1262. close: nil closed
  1263. --- no_error_log
  1264. [error]
  1265. === TEST 26: send tables of string fragments (bad type "nil")
  1266. --- config
  1267. server_tokens off;
  1268. location /t {
  1269. #set $port 5000;
  1270. set $port $TEST_NGINX_CLIENT_PORT;
  1271. content_by_lua '
  1272. local sock = ngx.socket.tcp()
  1273. local port = ngx.var.port
  1274. local ok, err = sock:connect("127.0.0.1", port)
  1275. if not ok then
  1276. ngx.say("failed to connect: ", err)
  1277. return
  1278. end
  1279. ngx.say("connected: ", ok)
  1280. local req = {"GET", " ", "/foo", " HTTP/", nil, 1, ".", 0, "\\r\\n",
  1281. "Host: localhost\\r\\n", "Connection: close\\r\\n",
  1282. "\\r\\n"}
  1283. -- req = "OK"
  1284. local bytes, err = sock:send(req)
  1285. if not bytes then
  1286. ngx.say("failed to send request: ", err)
  1287. return
  1288. end
  1289. ngx.say("request sent: ", bytes)
  1290. while true do
  1291. local line, err, part = sock:receive()
  1292. if line then
  1293. ngx.say("received: ", line)
  1294. else
  1295. ngx.say("failed to receive a line: ", err, " [", part, "]")
  1296. break
  1297. end
  1298. end
  1299. ok, err = sock:close()
  1300. ngx.say("close: ", ok, " ", err)
  1301. ';
  1302. }
  1303. location /foo {
  1304. echo foo;
  1305. more_clear_headers Date;
  1306. }
  1307. --- request
  1308. GET /t
  1309. --- ignore_response
  1310. --- error_log
  1311. bad argument #1 to 'send' (bad data type nil found)
  1312. === TEST 27: send tables of string fragments (bad type "boolean")
  1313. --- config
  1314. server_tokens off;
  1315. location /t {
  1316. #set $port 5000;
  1317. set $port $TEST_NGINX_CLIENT_PORT;
  1318. content_by_lua '
  1319. local sock = ngx.socket.tcp()
  1320. local port = ngx.var.port
  1321. local ok, err = sock:connect("127.0.0.1", port)
  1322. if not ok then
  1323. ngx.say("failed to connect: ", err)
  1324. return
  1325. end
  1326. ngx.say("connected: ", ok)
  1327. local req = {"GET", " ", "/foo", " HTTP/", true, 1, ".", 0, "\\r\\n",
  1328. "Host: localhost\\r\\n", "Connection: close\\r\\n",
  1329. "\\r\\n"}
  1330. -- req = "OK"
  1331. local bytes, err = sock:send(req)
  1332. if not bytes then
  1333. ngx.say("failed to send request: ", err)
  1334. return
  1335. end
  1336. ngx.say("request sent: ", bytes)
  1337. while true do
  1338. local line, err, part = sock:receive()
  1339. if line then
  1340. ngx.say("received: ", line)
  1341. else
  1342. ngx.say("failed to receive a line: ", err, " [", part, "]")
  1343. break
  1344. end
  1345. end
  1346. ok, err = sock:close()
  1347. ngx.say("close: ", ok, " ", err)
  1348. ';
  1349. }
  1350. location /foo {
  1351. echo foo;
  1352. more_clear_headers Date;
  1353. }
  1354. --- request
  1355. GET /t
  1356. --- ignore_response
  1357. --- error_log
  1358. bad argument #1 to 'send' (bad data type boolean found)
  1359. === TEST 28: send tables of string fragments (bad type ngx.null)
  1360. --- config
  1361. server_tokens off;
  1362. location /t {
  1363. #set $port 5000;
  1364. set $port $TEST_NGINX_CLIENT_PORT;
  1365. content_by_lua '
  1366. local sock = ngx.socket.tcp()
  1367. local port = ngx.var.port
  1368. local ok, err = sock:connect("127.0.0.1", port)
  1369. if not ok then
  1370. ngx.say("failed to connect: ", err)
  1371. return
  1372. end
  1373. ngx.say("connected: ", ok)
  1374. local req = {"GET", " ", "/foo", " HTTP/", ngx.null, 1, ".", 0, "\\r\\n",
  1375. "Host: localhost\\r\\n", "Connection: close\\r\\n",
  1376. "\\r\\n"}
  1377. -- req = "OK"
  1378. local bytes, err = sock:send(req)
  1379. if not bytes then
  1380. ngx.say("failed to send request: ", err)
  1381. return
  1382. end
  1383. ngx.say("request sent: ", bytes)
  1384. while true do
  1385. local line, err, part = sock:receive()
  1386. if line then
  1387. ngx.say("received: ", line)
  1388. else
  1389. ngx.say("failed to receive a line: ", err, " [", part, "]")
  1390. break
  1391. end
  1392. end
  1393. ok, err = sock:close()
  1394. ngx.say("close: ", ok, " ", err)
  1395. ';
  1396. }
  1397. location /foo {
  1398. echo foo;
  1399. more_clear_headers Date;
  1400. }
  1401. --- request
  1402. GET /t
  1403. --- ignore_response
  1404. --- error_log
  1405. bad argument #1 to 'send' (bad data type userdata found)
  1406. === TEST 29: cosocket before location capture (tcpsock:send did not clear u->waiting)
  1407. --- config
  1408. server_tokens off;
  1409. location /t {
  1410. #set $port 5000;
  1411. set $port $TEST_NGINX_MEMCACHED_PORT;
  1412. content_by_lua '
  1413. local sock = ngx.socket.tcp()
  1414. local port = ngx.var.port
  1415. local ok, err = sock:connect("127.0.0.1", port)
  1416. if not ok then
  1417. ngx.say("failed to connect: ", err)
  1418. return
  1419. end
  1420. ngx.say("connected: ", ok)
  1421. local req = "flush_all\\r\\n"
  1422. local bytes, err = sock:send(req)
  1423. if not bytes then
  1424. ngx.say("failed to send request: ", err)
  1425. return
  1426. end
  1427. ngx.say("request sent: ", bytes)
  1428. local line, err, part = sock:receive()
  1429. if line then
  1430. ngx.say("received: ", line)
  1431. else
  1432. ngx.say("failed to receive a line: ", err, " [", part, "]")
  1433. end
  1434. ok, err = sock:close()
  1435. ngx.say("close: ", ok, " ", err)
  1436. local resp = ngx.location.capture("/memc")
  1437. if type(resp) ~= "table" then
  1438. ngx.say("bad resp: type ", type(resp), ": ", resp)
  1439. return
  1440. end
  1441. ngx.print("subrequest: ", resp.status, ", ", resp.body)
  1442. ';
  1443. }
  1444. location /memc {
  1445. set $memc_cmd flush_all;
  1446. memc_pass 127.0.0.1:$TEST_NGINX_MEMCACHED_PORT;
  1447. }
  1448. --- request
  1449. GET /t
  1450. --- response_body eval
  1451. "connected: 1
  1452. request sent: 11
  1453. received: OK
  1454. close: 1 nil
  1455. subrequest: 200, OK\r
  1456. "
  1457. --- no_error_log
  1458. [error]
  1459. === TEST 30: CR in a line
  1460. --- config
  1461. server_tokens off;
  1462. location /t {
  1463. #set $port 5000;
  1464. set $port $TEST_NGINX_CLIENT_PORT;
  1465. content_by_lua '
  1466. local sock = ngx.socket.tcp()
  1467. local port = ngx.var.port
  1468. local ok, err = sock:connect("127.0.0.1", port)
  1469. if not ok then
  1470. ngx.say("failed to connect: ", err)
  1471. return
  1472. end
  1473. ngx.say("connected: ", ok)
  1474. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  1475. -- req = "OK"
  1476. local bytes, err = sock:send(req)
  1477. if not bytes then
  1478. ngx.say("failed to send request: ", err)
  1479. return
  1480. end
  1481. ngx.say("request sent: ", bytes)
  1482. while true do
  1483. local line, err, part = sock:receive()
  1484. if line then
  1485. ngx.say("received: ", line)
  1486. else
  1487. ngx.say("failed to receive a line: ", err, " [", part, "]")
  1488. break
  1489. end
  1490. end
  1491. ok, err = sock:close()
  1492. ngx.say("close: ", ok, " ", err)
  1493. ';
  1494. }
  1495. location /foo {
  1496. echo "foo\r\rbar\rbaz";
  1497. more_clear_headers Date;
  1498. }
  1499. --- request
  1500. GET /t
  1501. --- response_body
  1502. connected: 1
  1503. request sent: 57
  1504. received: HTTP/1.1 200 OK
  1505. received: Server: nginx
  1506. received: Content-Type: text/plain
  1507. received: Content-Length: 13
  1508. received: Connection: close
  1509. received:
  1510. received: foobarbaz
  1511. failed to receive a line: closed []
  1512. close: nil closed
  1513. --- no_error_log
  1514. [error]
  1515. --- SKIP
  1516. === TEST 31: receive(0)
  1517. --- config
  1518. server_tokens off;
  1519. location /t {
  1520. #set $port 5000;
  1521. set $port $TEST_NGINX_CLIENT_PORT;
  1522. content_by_lua '
  1523. local sock = ngx.socket.tcp()
  1524. local port = ngx.var.port
  1525. local ok, err = sock:connect("127.0.0.1", port)
  1526. if not ok then
  1527. ngx.say("failed to connect: ", err)
  1528. return
  1529. end
  1530. ngx.say("connected: ", ok)
  1531. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  1532. -- req = "OK"
  1533. local bytes, err = sock:send(req)
  1534. if not bytes then
  1535. ngx.say("failed to send request: ", err)
  1536. return
  1537. end
  1538. ngx.say("request sent: ", bytes)
  1539. local data, err, part = sock:receive(0)
  1540. if not data then
  1541. ngx.say("failed to receive(0): ", err)
  1542. return
  1543. end
  1544. ngx.say("receive(0): [", data, "]")
  1545. ok, err = sock:close()
  1546. ngx.say("close: ", ok, " ", err)
  1547. ';
  1548. }
  1549. location /foo {
  1550. echo foo;
  1551. more_clear_headers Date;
  1552. }
  1553. --- request
  1554. GET /t
  1555. --- response_body
  1556. connected: 1
  1557. request sent: 57
  1558. receive(0): []
  1559. close: 1 nil
  1560. --- no_error_log
  1561. [error]
  1562. === TEST 32: send("")
  1563. --- config
  1564. server_tokens off;
  1565. location /t {
  1566. #set $port 5000;
  1567. set $port $TEST_NGINX_CLIENT_PORT;
  1568. content_by_lua '
  1569. local sock = ngx.socket.tcp()
  1570. local port = ngx.var.port
  1571. local ok, err = sock:connect("127.0.0.1", port)
  1572. if not ok then
  1573. ngx.say("failed to connect: ", err)
  1574. return
  1575. end
  1576. ngx.say("connected: ", ok)
  1577. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  1578. -- req = "OK"
  1579. local bytes, err = sock:send(req)
  1580. if not bytes then
  1581. ngx.say("failed to send request: ", err)
  1582. return
  1583. end
  1584. ngx.say("request sent: ", bytes)
  1585. local bytes, err = sock:send("")
  1586. if not bytes then
  1587. ngx.say("failed to send request: ", err)
  1588. return
  1589. end
  1590. ngx.say("send(\\"\\"): ", bytes)
  1591. ok, err = sock:close()
  1592. ngx.say("close: ", ok, " ", err)
  1593. ';
  1594. }
  1595. location /foo {
  1596. echo foo;
  1597. more_clear_headers Date;
  1598. }
  1599. --- request
  1600. GET /t
  1601. --- response_body
  1602. connected: 1
  1603. request sent: 57
  1604. send(""): 0
  1605. close: 1 nil
  1606. --- no_error_log
  1607. [error]