PageRenderTime 64ms CodeModel.GetById 22ms RepoModel.GetById 1ms app.codeStats 0ms

/tests/test-nginx/cases/lua-tests/023-rewrite/tcp-socket.t

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