PageRenderTime 71ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/Bazaar/nginx/ngx_ext_modules/lua-nginx-module/t/058-tcp-socket.t

https://bitbucket.org/redpitaya/redpitaya
Unknown | 2128 lines | 1728 code | 400 blank | 0 comment | 0 complexity | 454e77ee4be2d416611970daf164969e MD5 | raw file
Possible License(s): BSD-3-Clause

Large files files are truncated, but you can click here to view the full file

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

Large files files are truncated, but you can click here to view the full file