PageRenderTime 54ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/t/023-rewrite/tcp-socket.t

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