PageRenderTime 42ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/t/066-socket-receiveuntil.t

https://github.com/npk/lua-nginx-module
Unknown | 1332 lines | 1058 code | 274 blank | 0 comment | 0 complexity | ff066bb1a090f9683a360934ae76d2d2 MD5 | raw file
  1. # vim:set ft= ts=4 sw=4 et fdm=marker:
  2. use lib 'lib';
  3. use Test::Nginx::Socket;
  4. repeat_each(2);
  5. plan tests => repeat_each() * (blocks() * 3);
  6. our $HtmlDir = html_dir;
  7. $ENV{TEST_NGINX_CLIENT_PORT} ||= server_port();
  8. $ENV{TEST_NGINX_MEMCACHED_PORT} ||= 11211;
  9. no_long_string();
  10. #no_diff();
  11. #log_level 'warn';
  12. run_tests();
  13. __DATA__
  14. === TEST 1: memcached read lines
  15. --- config
  16. server_tokens off;
  17. location /t {
  18. set $port $TEST_NGINX_MEMCACHED_PORT;
  19. content_by_lua '
  20. local sock = ngx.socket.tcp()
  21. local port = ngx.var.port
  22. local ok, err = sock:connect("127.0.0.1", port)
  23. if not ok then
  24. ngx.say("failed to connect: ", err)
  25. return
  26. end
  27. ngx.say("connected: ", ok)
  28. local req = "flush_all\\r\\n"
  29. local bytes, err = sock:send(req)
  30. if not bytes then
  31. ngx.say("failed to send request: ", err)
  32. return
  33. end
  34. ngx.say("request sent: ", bytes)
  35. local readline = sock:receiveuntil("\\r\\n")
  36. local line, err, part = readline()
  37. if line then
  38. ngx.say("received: ", line)
  39. else
  40. ngx.say("failed to receive a line: ", err, " [", part, "]")
  41. end
  42. ok, err = sock:close()
  43. ngx.say("close: ", ok, " ", err)
  44. ';
  45. }
  46. --- request
  47. GET /t
  48. --- response_body
  49. connected: 1
  50. request sent: 11
  51. received: OK
  52. close: 1 nil
  53. --- no_error_log
  54. [error]
  55. === TEST 2: http read lines
  56. --- config
  57. server_tokens off;
  58. location /t {
  59. set $port $TEST_NGINX_CLIENT_PORT;
  60. content_by_lua '
  61. local sock = ngx.socket.tcp()
  62. local port = ngx.var.port
  63. local ok, err = sock:connect("127.0.0.1", port)
  64. if not ok then
  65. ngx.say("failed to connect: ", err)
  66. return
  67. end
  68. ngx.say("connected: ", ok)
  69. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  70. local bytes, err = sock:send(req)
  71. if not bytes then
  72. ngx.say("failed to send request: ", err)
  73. return
  74. end
  75. ngx.say("request sent: ", bytes)
  76. local readline = sock:receiveuntil("\\r\\n")
  77. local line, err, part
  78. for i = 1, 7 do
  79. line, err, part = readline()
  80. if line then
  81. ngx.say("read: ", line)
  82. else
  83. ngx.say("failed to read a line: ", err, " [", part, "]")
  84. end
  85. end
  86. ok, err = sock:close()
  87. ngx.say("close: ", ok, " ", err)
  88. ';
  89. }
  90. location /foo {
  91. content_by_lua 'ngx.say("foo")';
  92. more_clear_headers Date;
  93. }
  94. --- request
  95. GET /t
  96. --- response_body eval
  97. qq{connected: 1
  98. request sent: 57
  99. read: HTTP/1.1 200 OK
  100. read: Server: nginx
  101. read: Content-Type: text/plain
  102. read: Content-Length: 4
  103. read: Connection: close
  104. read:
  105. failed to read a line: closed [foo
  106. ]
  107. close: nil closed
  108. }
  109. --- no_error_log
  110. [error]
  111. === TEST 3: http read all the headers in a single run
  112. --- config
  113. server_tokens off;
  114. location /t {
  115. set $port $TEST_NGINX_CLIENT_PORT;
  116. content_by_lua '
  117. local sock = ngx.socket.tcp()
  118. local port = ngx.var.port
  119. local ok, err = sock:connect("127.0.0.1", port)
  120. if not ok then
  121. ngx.say("failed to connect: ", err)
  122. return
  123. end
  124. ngx.say("connected: ", ok)
  125. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  126. local bytes, err = sock:send(req)
  127. if not bytes then
  128. ngx.say("failed to send request: ", err)
  129. return
  130. end
  131. ngx.say("request sent: ", bytes)
  132. local read_headers = sock:receiveuntil("\\r\\n\\r\\n")
  133. local line, err, part
  134. for i = 1, 2 do
  135. line, err, part = read_headers()
  136. if line then
  137. ngx.say("read: ", line)
  138. else
  139. ngx.say("failed to read a line: ", err, " [", part, "]")
  140. end
  141. end
  142. ok, err = sock:close()
  143. ngx.say("close: ", ok, " ", err)
  144. ';
  145. }
  146. location /foo {
  147. content_by_lua 'ngx.say("foo")';
  148. more_clear_headers Date;
  149. }
  150. --- request
  151. GET /t
  152. --- response_body eval
  153. qq{connected: 1
  154. request sent: 57
  155. read: HTTP/1.1 200 OK\r
  156. Server: nginx\r
  157. Content-Type: text/plain\r
  158. Content-Length: 4\r
  159. Connection: close
  160. failed to read a line: closed [foo
  161. ]
  162. close: nil closed
  163. }
  164. --- no_error_log
  165. [error]
  166. === TEST 4: ambiguous boundary patterns (abcabd)
  167. --- config
  168. server_tokens off;
  169. location /t {
  170. set $port $TEST_NGINX_CLIENT_PORT;
  171. content_by_lua '
  172. -- collectgarbage("collect")
  173. local sock = ngx.socket.tcp()
  174. local port = ngx.var.port
  175. local ok, err = sock:connect("127.0.0.1", port)
  176. if not ok then
  177. ngx.say("failed to connect: ", err)
  178. return
  179. end
  180. ngx.say("connected: ", ok)
  181. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  182. local bytes, err = sock:send(req)
  183. if not bytes then
  184. ngx.say("failed to send request: ", err)
  185. return
  186. end
  187. ngx.say("request sent: ", bytes)
  188. local read_headers = sock:receiveuntil("\\r\\n\\r\\n")
  189. local headers, err, part = read_headers()
  190. if not headers then
  191. ngx.say("failed to read headers: ", err, " [", part, "]")
  192. end
  193. local reader = sock:receiveuntil("abcabd")
  194. for i = 1, 2 do
  195. line, err, part = reader()
  196. if line then
  197. ngx.say("read: ", line)
  198. else
  199. ngx.say("failed to read a line: ", err, " [", part, "]")
  200. end
  201. end
  202. ok, err = sock:close()
  203. ngx.say("close: ", ok, " ", err)
  204. ';
  205. }
  206. location /foo {
  207. content_by_lua 'ngx.say("abcabcabd")';
  208. more_clear_headers Date;
  209. }
  210. --- request
  211. GET /t
  212. --- response_body eval
  213. qq{connected: 1
  214. request sent: 57
  215. read: abc
  216. failed to read a line: closed [
  217. ]
  218. close: nil closed
  219. }
  220. --- no_error_log
  221. [error]
  222. === TEST 5: ambiguous boundary patterns (aa)
  223. --- config
  224. server_tokens off;
  225. location /t {
  226. set $port $TEST_NGINX_CLIENT_PORT;
  227. content_by_lua '
  228. -- collectgarbage("collect")
  229. local sock = ngx.socket.tcp()
  230. local port = ngx.var.port
  231. local ok, err = sock:connect("127.0.0.1", port)
  232. if not ok then
  233. ngx.say("failed to connect: ", err)
  234. return
  235. end
  236. ngx.say("connected: ", ok)
  237. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  238. local bytes, err = sock:send(req)
  239. if not bytes then
  240. ngx.say("failed to send request: ", err)
  241. return
  242. end
  243. ngx.say("request sent: ", bytes)
  244. local read_headers = sock:receiveuntil("\\r\\n\\r\\n")
  245. local headers, err, part = read_headers()
  246. if not headers then
  247. ngx.say("failed to read headers: ", err, " [", part, "]")
  248. end
  249. local reader = sock:receiveuntil("aa")
  250. for i = 1, 2 do
  251. line, err, part = reader()
  252. if line then
  253. ngx.say("read: ", line)
  254. else
  255. ngx.say("failed to read a line: ", err, " [", part, "]")
  256. end
  257. end
  258. ok, err = sock:close()
  259. ngx.say("close: ", ok, " ", err)
  260. ';
  261. }
  262. location /foo {
  263. content_by_lua 'ngx.say("abcabcaad")';
  264. more_clear_headers Date;
  265. }
  266. --- request
  267. GET /t
  268. --- response_body eval
  269. qq{connected: 1
  270. request sent: 57
  271. read: abcabc
  272. failed to read a line: closed [d
  273. ]
  274. close: nil closed
  275. }
  276. --- no_error_log
  277. [error]
  278. === TEST 6: ambiguous boundary patterns (aaa)
  279. --- config
  280. server_tokens off;
  281. location /t {
  282. set $port $TEST_NGINX_CLIENT_PORT;
  283. content_by_lua '
  284. -- collectgarbage("collect")
  285. local sock = ngx.socket.tcp()
  286. local port = ngx.var.port
  287. local ok, err = sock:connect("127.0.0.1", port)
  288. if not ok then
  289. ngx.say("failed to connect: ", err)
  290. return
  291. end
  292. ngx.say("connected: ", ok)
  293. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  294. local bytes, err = sock:send(req)
  295. if not bytes then
  296. ngx.say("failed to send request: ", err)
  297. return
  298. end
  299. ngx.say("request sent: ", bytes)
  300. local read_headers = sock:receiveuntil("\\r\\n\\r\\n")
  301. local headers, err, part = read_headers()
  302. if not headers then
  303. ngx.say("failed to read headers: ", err, " [", part, "]")
  304. end
  305. local reader = sock:receiveuntil("aaa")
  306. for i = 1, 2 do
  307. line, err, part = reader()
  308. if line then
  309. ngx.say("read: ", line)
  310. else
  311. ngx.say("failed to read a line: ", err, " [", part, "]")
  312. end
  313. end
  314. ok, err = sock:close()
  315. ngx.say("close: ", ok, " ", err)
  316. ';
  317. }
  318. location /foo {
  319. echo abaabcaaaef;
  320. more_clear_headers Date;
  321. }
  322. --- request
  323. GET /t
  324. --- response_body eval
  325. qq{connected: 1
  326. request sent: 57
  327. read: abaabc
  328. failed to read a line: closed [ef
  329. ]
  330. close: nil closed
  331. }
  332. --- no_error_log
  333. [error]
  334. === TEST 7: ambiguous boundary patterns (aaaaad)
  335. --- config
  336. server_tokens off;
  337. location /t {
  338. set $port $TEST_NGINX_CLIENT_PORT;
  339. content_by_lua '
  340. -- collectgarbage("collect")
  341. local sock = ngx.socket.tcp()
  342. local port = ngx.var.port
  343. local ok, err = sock:connect("127.0.0.1", port)
  344. if not ok then
  345. ngx.say("failed to connect: ", err)
  346. return
  347. end
  348. ngx.say("connected: ", ok)
  349. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  350. local bytes, err = sock:send(req)
  351. if not bytes then
  352. ngx.say("failed to send request: ", err)
  353. return
  354. end
  355. ngx.say("request sent: ", bytes)
  356. local read_headers = sock:receiveuntil("\\r\\n\\r\\n")
  357. local headers, err, part = read_headers()
  358. if not headers then
  359. ngx.say("failed to read headers: ", err, " [", part, "]")
  360. end
  361. local reader = sock:receiveuntil("aaaaad")
  362. for i = 1, 2 do
  363. line, err, part = reader()
  364. if line then
  365. ngx.say("read: ", line)
  366. else
  367. ngx.say("failed to read a line: ", err, " [", part, "]")
  368. end
  369. end
  370. ok, err = sock:close()
  371. ngx.say("close: ", ok, " ", err)
  372. ';
  373. }
  374. location /foo {
  375. echo baaaaaaaaeaaaaaaadf;
  376. more_clear_headers Date;
  377. }
  378. --- request
  379. GET /t
  380. --- response_body eval
  381. qq{connected: 1
  382. request sent: 57
  383. read: baaaaaaaaeaa
  384. failed to read a line: closed [f
  385. ]
  386. close: nil closed
  387. }
  388. --- no_error_log
  389. [error]
  390. === TEST 8: ambiguous boundary patterns (aaaaad), small buffer, 2 bytes
  391. --- config
  392. server_tokens off;
  393. lua_socket_buffer_size 2;
  394. location /t {
  395. set $port $TEST_NGINX_CLIENT_PORT;
  396. content_by_lua '
  397. -- collectgarbage("collect")
  398. local sock = ngx.socket.tcp()
  399. local port = ngx.var.port
  400. local ok, err = sock:connect("127.0.0.1", port)
  401. if not ok then
  402. ngx.say("failed to connect: ", err)
  403. return
  404. end
  405. ngx.say("connected: ", ok)
  406. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  407. local bytes, err = sock:send(req)
  408. if not bytes then
  409. ngx.say("failed to send request: ", err)
  410. return
  411. end
  412. ngx.say("request sent: ", bytes)
  413. local read_headers = sock:receiveuntil("\\r\\n\\r\\n")
  414. local headers, err, part = read_headers()
  415. if not headers then
  416. ngx.say("failed to read headers: ", err, " [", part, "]")
  417. end
  418. local reader = sock:receiveuntil("aaaaad")
  419. for i = 1, 2 do
  420. line, err, part = reader()
  421. if line then
  422. ngx.say("read: ", line)
  423. else
  424. ngx.say("failed to read a line: ", err, " [", part, "]")
  425. end
  426. end
  427. ok, err = sock:close()
  428. ngx.say("close: ", ok, " ", err)
  429. ';
  430. }
  431. location /foo {
  432. echo baaaaaaaaeaaaaaaadf;
  433. more_clear_headers Date;
  434. }
  435. --- request
  436. GET /t
  437. --- response_body eval
  438. qq{connected: 1
  439. request sent: 57
  440. read: baaaaaaaaeaa
  441. failed to read a line: closed [f
  442. ]
  443. close: nil closed
  444. }
  445. --- no_error_log
  446. [error]
  447. === TEST 9: ambiguous boundary patterns (aaaaad), small buffer, 1 byte
  448. --- config
  449. server_tokens off;
  450. lua_socket_buffer_size 1;
  451. location /t {
  452. set $port $TEST_NGINX_CLIENT_PORT;
  453. content_by_lua '
  454. -- collectgarbage("collect")
  455. local sock = ngx.socket.tcp()
  456. local port = ngx.var.port
  457. local ok, err = sock:connect("127.0.0.1", port)
  458. if not ok then
  459. ngx.say("failed to connect: ", err)
  460. return
  461. end
  462. ngx.say("connected: ", ok)
  463. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  464. local bytes, err = sock:send(req)
  465. if not bytes then
  466. ngx.say("failed to send request: ", err)
  467. return
  468. end
  469. ngx.say("request sent: ", bytes)
  470. local read_headers = sock:receiveuntil("\\r\\n\\r\\n")
  471. local headers, err, part = read_headers()
  472. if not headers then
  473. ngx.say("failed to read headers: ", err, " [", part, "]")
  474. end
  475. local reader = sock:receiveuntil("aaaaad")
  476. for i = 1, 2 do
  477. line, err, part = reader()
  478. if line then
  479. ngx.say("read: ", line)
  480. else
  481. ngx.say("failed to read a line: ", err, " [", part, "]")
  482. end
  483. end
  484. ok, err = sock:close()
  485. ngx.say("close: ", ok, " ", err)
  486. ';
  487. }
  488. location /foo {
  489. echo baaaaaaaaeaaaaaaadf;
  490. more_clear_headers Date;
  491. }
  492. --- request
  493. GET /t
  494. --- response_body eval
  495. qq{connected: 1
  496. request sent: 57
  497. read: baaaaaaaaeaa
  498. failed to read a line: closed [f
  499. ]
  500. close: nil closed
  501. }
  502. --- no_error_log
  503. [error]
  504. === TEST 10: ambiguous boundary patterns (abcabdabcabe)
  505. --- config
  506. server_tokens off;
  507. location /t {
  508. set $port $TEST_NGINX_CLIENT_PORT;
  509. content_by_lua '
  510. -- collectgarbage("collect")
  511. local sock = ngx.socket.tcp()
  512. local port = ngx.var.port
  513. local ok, err = sock:connect("127.0.0.1", port)
  514. if not ok then
  515. ngx.say("failed to connect: ", err)
  516. return
  517. end
  518. ngx.say("connected: ", ok)
  519. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  520. local bytes, err = sock:send(req)
  521. if not bytes then
  522. ngx.say("failed to send request: ", err)
  523. return
  524. end
  525. ngx.say("request sent: ", bytes)
  526. local read_headers = sock:receiveuntil("\\r\\n\\r\\n")
  527. local headers, err, part = read_headers()
  528. if not headers then
  529. ngx.say("failed to read headers: ", err, " [", part, "]")
  530. end
  531. local reader = sock:receiveuntil("abcabdabcabe")
  532. for i = 1, 2 do
  533. line, err, part = reader()
  534. if line then
  535. ngx.say("read: ", line)
  536. else
  537. ngx.say("failed to read a line: ", err, " [", part, "]")
  538. end
  539. end
  540. ok, err = sock:close()
  541. ngx.say("close: ", ok, " ", err)
  542. ';
  543. }
  544. location /foo {
  545. echo abcabdabcabdabcabe;
  546. more_clear_headers Date;
  547. }
  548. --- request
  549. GET /t
  550. --- response_body eval
  551. qq{connected: 1
  552. request sent: 57
  553. read: abcabd
  554. failed to read a line: closed [
  555. ]
  556. close: nil closed
  557. }
  558. --- no_error_log
  559. [error]
  560. === TEST 11: ambiguous boundary patterns (abcabdabcabe 2)
  561. --- config
  562. server_tokens off;
  563. location /t {
  564. set $port $TEST_NGINX_CLIENT_PORT;
  565. content_by_lua '
  566. -- collectgarbage("collect")
  567. local sock = ngx.socket.tcp()
  568. local port = ngx.var.port
  569. local ok, err = sock:connect("127.0.0.1", port)
  570. if not ok then
  571. ngx.say("failed to connect: ", err)
  572. return
  573. end
  574. ngx.say("connected: ", ok)
  575. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  576. local bytes, err = sock:send(req)
  577. if not bytes then
  578. ngx.say("failed to send request: ", err)
  579. return
  580. end
  581. ngx.say("request sent: ", bytes)
  582. local read_headers = sock:receiveuntil("\\r\\n\\r\\n")
  583. local headers, err, part = read_headers()
  584. if not headers then
  585. ngx.say("failed to read headers: ", err, " [", part, "]")
  586. end
  587. local reader = sock:receiveuntil("abcabdabcabe")
  588. for i = 1, 2 do
  589. line, err, part = reader()
  590. if line then
  591. ngx.say("read: ", line)
  592. else
  593. ngx.say("failed to read a line: ", err, " [", part, "]")
  594. end
  595. end
  596. ok, err = sock:close()
  597. ngx.say("close: ", ok, " ", err)
  598. ';
  599. }
  600. location /foo {
  601. echo abcabdabcabcabdabcabe;
  602. more_clear_headers Date;
  603. }
  604. --- request
  605. GET /t
  606. --- response_body eval
  607. qq{connected: 1
  608. request sent: 57
  609. read: abcabdabc
  610. failed to read a line: closed [
  611. ]
  612. close: nil closed
  613. }
  614. --- no_error_log
  615. [error]
  616. === TEST 12: ambiguous boundary patterns (abcabdabcabe 3)
  617. --- config
  618. server_tokens off;
  619. location /t {
  620. set $port $TEST_NGINX_CLIENT_PORT;
  621. content_by_lua '
  622. -- collectgarbage("collect")
  623. local sock = ngx.socket.tcp()
  624. local port = ngx.var.port
  625. local ok, err = sock:connect("127.0.0.1", port)
  626. if not ok then
  627. ngx.say("failed to connect: ", err)
  628. return
  629. end
  630. ngx.say("connected: ", ok)
  631. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  632. local bytes, err = sock:send(req)
  633. if not bytes then
  634. ngx.say("failed to send request: ", err)
  635. return
  636. end
  637. ngx.say("request sent: ", bytes)
  638. local read_headers = sock:receiveuntil("\\r\\n\\r\\n")
  639. local headers, err, part = read_headers()
  640. if not headers then
  641. ngx.say("failed to read headers: ", err, " [", part, "]")
  642. end
  643. local reader = sock:receiveuntil("abcabdabcabe")
  644. for i = 1, 2 do
  645. line, err, part = reader()
  646. if line then
  647. ngx.say("read: ", line)
  648. else
  649. ngx.say("failed to read a line: ", err, " [", part, "]")
  650. end
  651. end
  652. ok, err = sock:close()
  653. ngx.say("close: ", ok, " ", err)
  654. ';
  655. }
  656. location /foo {
  657. echo abcabcabdabcabe;
  658. more_clear_headers Date;
  659. }
  660. --- request
  661. GET /t
  662. --- response_body eval
  663. qq{connected: 1
  664. request sent: 57
  665. read: abc
  666. failed to read a line: closed [
  667. ]
  668. close: nil closed
  669. }
  670. --- no_error_log
  671. [error]
  672. === TEST 13: ambiguous boundary patterns (abcabdabcabe 4)
  673. --- config
  674. server_tokens off;
  675. location /t {
  676. set $port $TEST_NGINX_CLIENT_PORT;
  677. content_by_lua '
  678. -- collectgarbage("collect")
  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. local bytes, err = sock:send(req)
  689. if not bytes then
  690. ngx.say("failed to send request: ", err)
  691. return
  692. end
  693. ngx.say("request sent: ", bytes)
  694. local read_headers = sock:receiveuntil("\\r\\n\\r\\n")
  695. local headers, err, part = read_headers()
  696. if not headers then
  697. ngx.say("failed to read headers: ", err, " [", part, "]")
  698. end
  699. local reader = sock:receiveuntil("abcabdabcabe")
  700. for i = 1, 2 do
  701. line, err, part = reader()
  702. if line then
  703. ngx.say("read: ", line)
  704. else
  705. ngx.say("failed to read a line: ", err, " [", part, "]")
  706. end
  707. end
  708. ok, err = sock:close()
  709. ngx.say("close: ", ok, " ", err)
  710. ';
  711. }
  712. location /foo {
  713. echo ababcabdabcabe;
  714. more_clear_headers Date;
  715. }
  716. --- request
  717. GET /t
  718. --- response_body eval
  719. qq{connected: 1
  720. request sent: 57
  721. read: ab
  722. failed to read a line: closed [
  723. ]
  724. close: nil closed
  725. }
  726. --- no_error_log
  727. [error]
  728. === TEST 14: ambiguous boundary patterns (--abc)
  729. --- config
  730. server_tokens off;
  731. location /t {
  732. set $port $TEST_NGINX_CLIENT_PORT;
  733. content_by_lua '
  734. -- collectgarbage("collect")
  735. local sock = ngx.socket.tcp()
  736. local port = ngx.var.port
  737. local ok, err = sock:connect("127.0.0.1", port)
  738. if not ok then
  739. ngx.say("failed to connect: ", err)
  740. return
  741. end
  742. ngx.say("connected: ", ok)
  743. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  744. local bytes, err = sock:send(req)
  745. if not bytes then
  746. ngx.say("failed to send request: ", err)
  747. return
  748. end
  749. ngx.say("request sent: ", bytes)
  750. local read_headers = sock:receiveuntil("\\r\\n\\r\\n")
  751. local headers, err, part = read_headers()
  752. if not headers then
  753. ngx.say("failed to read headers: ", err, " [", part, "]")
  754. end
  755. local reader = sock:receiveuntil("--abc")
  756. for i = 1, 2 do
  757. line, err, part = reader()
  758. if line then
  759. ngx.say("read: ", line)
  760. else
  761. ngx.say("failed to read a line: ", err, " [", part, "]")
  762. end
  763. end
  764. ok, err = sock:close()
  765. ngx.say("close: ", ok, " ", err)
  766. ';
  767. }
  768. location /foo {
  769. echo -- ----abc;
  770. more_clear_headers Date;
  771. }
  772. --- request
  773. GET /t
  774. --- response_body eval
  775. qq{connected: 1
  776. request sent: 57
  777. read: --
  778. failed to read a line: closed [
  779. ]
  780. close: nil closed
  781. }
  782. --- no_error_log
  783. [error]
  784. === TEST 15: ambiguous boundary patterns (--abc)
  785. --- config
  786. server_tokens off;
  787. location /t {
  788. set $port $TEST_NGINX_CLIENT_PORT;
  789. content_by_lua '
  790. -- collectgarbage("collect")
  791. local sock = ngx.socket.tcp()
  792. local port = ngx.var.port
  793. local ok, err = sock:connect("127.0.0.1", port)
  794. if not ok then
  795. ngx.say("failed to connect: ", err)
  796. return
  797. end
  798. ngx.say("connected: ", ok)
  799. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  800. local bytes, err = sock:send(req)
  801. if not bytes then
  802. ngx.say("failed to send request: ", err)
  803. return
  804. end
  805. ngx.say("request sent: ", bytes)
  806. local read_headers = sock:receiveuntil("\\r\\n\\r\\n")
  807. local headers, err, part = read_headers()
  808. if not headers then
  809. ngx.say("failed to read headers: ", err, " [", part, "]")
  810. end
  811. local reader = sock:receiveuntil("--abc")
  812. for i = 1, 7 do
  813. line, err, part = reader(4)
  814. if line then
  815. ngx.say("read: ", line)
  816. else
  817. ngx.say("failed to read a line: ", err, " [", part, "]")
  818. end
  819. end
  820. ok, err = sock:close()
  821. ngx.say("close: ", ok, " ", err)
  822. ';
  823. }
  824. location /foo {
  825. echo "hello, world ----abc";
  826. more_clear_headers Date;
  827. }
  828. --- request
  829. GET /t
  830. --- response_body eval
  831. qq{connected: 1
  832. request sent: 57
  833. read: hell
  834. read: o, w
  835. read: orld
  836. read: --
  837. read:
  838. failed to read a line: nil [nil]
  839. failed to read a line: closed [
  840. ]
  841. close: nil closed
  842. }
  843. --- no_error_log
  844. [error]
  845. === TEST 16: ambiguous boundary patterns (--abc), small buffer
  846. --- config
  847. server_tokens off;
  848. location /t {
  849. set $port $TEST_NGINX_CLIENT_PORT;
  850. lua_socket_buffer_size 1;
  851. content_by_lua '
  852. -- collectgarbage("collect")
  853. local sock = ngx.socket.tcp()
  854. local port = ngx.var.port
  855. local ok, err = sock:connect("127.0.0.1", port)
  856. if not ok then
  857. ngx.say("failed to connect: ", err)
  858. return
  859. end
  860. ngx.say("connected: ", ok)
  861. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  862. local bytes, err = sock:send(req)
  863. if not bytes then
  864. ngx.say("failed to send request: ", err)
  865. return
  866. end
  867. ngx.say("request sent: ", bytes)
  868. local read_headers = sock:receiveuntil("\\r\\n\\r\\n")
  869. local headers, err, part = read_headers()
  870. if not headers then
  871. ngx.say("failed to read headers: ", err, " [", part, "]")
  872. end
  873. local reader = sock:receiveuntil("--abc")
  874. for i = 1, 7 do
  875. line, err, part = reader(4)
  876. if line then
  877. ngx.say("read: ", line)
  878. else
  879. ngx.say("failed to read a line: ", err, " [", part, "]")
  880. end
  881. end
  882. ok, err = sock:close()
  883. ngx.say("close: ", ok, " ", err)
  884. ';
  885. }
  886. location /foo {
  887. echo "hello, world ----abc";
  888. more_clear_headers Date;
  889. }
  890. --- request
  891. GET /t
  892. --- response_body eval
  893. qq{connected: 1
  894. request sent: 57
  895. read: hell
  896. read: o, w
  897. read: orld
  898. read: --
  899. read:
  900. failed to read a line: nil [nil]
  901. failed to read a line: closed [
  902. ]
  903. close: nil closed
  904. }
  905. --- no_error_log
  906. [error]
  907. === TEST 17: ambiguous boundary patterns (--abc), small buffer, mixed by other reading calls
  908. --- config
  909. server_tokens off;
  910. location /t {
  911. set $port $TEST_NGINX_CLIENT_PORT;
  912. lua_socket_buffer_size 1;
  913. content_by_lua '
  914. -- collectgarbage("collect")
  915. local sock = ngx.socket.tcp()
  916. local port = ngx.var.port
  917. local ok, err = sock:connect("127.0.0.1", port)
  918. if not ok then
  919. ngx.say("failed to connect: ", err)
  920. return
  921. end
  922. ngx.say("connected: ", ok)
  923. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  924. local bytes, err = sock:send(req)
  925. if not bytes then
  926. ngx.say("failed to send request: ", err)
  927. return
  928. end
  929. ngx.say("request sent: ", bytes)
  930. local read_headers = sock:receiveuntil("\\r\\n\\r\\n")
  931. local headers, err, part = read_headers()
  932. if not headers then
  933. ngx.say("failed to read headers: ", err, " [", part, "]")
  934. end
  935. local reader = sock:receiveuntil("--abc")
  936. for i = 1, 7 do
  937. line, err, part = reader(4)
  938. if line then
  939. ngx.say("read: ", line)
  940. else
  941. ngx.say("failed to read a chunk: ", err, " [", part, "]")
  942. end
  943. local data, err, part = sock:receive(1)
  944. if not data then
  945. ngx.say("failed to read a byte: ", err, " [", part, "]")
  946. break
  947. else
  948. ngx.say("read one byte: ", data)
  949. end
  950. end
  951. ok, err = sock:close()
  952. ngx.say("close: ", ok, " ", err)
  953. ';
  954. }
  955. location /foo {
  956. echo "hello, world ----abc";
  957. more_clear_headers Date;
  958. }
  959. --- request
  960. GET /t
  961. --- response_body eval
  962. qq{connected: 1
  963. request sent: 57
  964. read: hell
  965. read one byte: o
  966. read: , wo
  967. read one byte: r
  968. read: ld -
  969. read one byte: -
  970. read:
  971. read one byte:
  972. failed to read a chunk: nil [nil]
  973. failed to read a byte: closed []
  974. close: nil closed
  975. }
  976. --- no_error_log
  977. [error]
  978. === TEST 18: ambiguous boundary patterns (abcabd), small buffer
  979. --- config
  980. server_tokens off;
  981. lua_socket_buffer_size 3;
  982. location /t {
  983. set $port $TEST_NGINX_CLIENT_PORT;
  984. content_by_lua '
  985. -- collectgarbage("collect")
  986. local sock = ngx.socket.tcp()
  987. local port = ngx.var.port
  988. local ok, err = sock:connect("127.0.0.1", port)
  989. if not ok then
  990. ngx.say("failed to connect: ", err)
  991. return
  992. end
  993. ngx.say("connected: ", ok)
  994. local req = "GET /foo HTTP/1.0\\r\\nHost: localhost\\r\\nConnection: close\\r\\n\\r\\n"
  995. local bytes, err = sock:send(req)
  996. if not bytes then
  997. ngx.say("failed to send request: ", err)
  998. return
  999. end
  1000. ngx.say("request sent: ", bytes)
  1001. local read_headers = sock:receiveuntil("\\r\\n\\r\\n")
  1002. local headers, err, part = read_headers()
  1003. if not headers then
  1004. ngx.say("failed to read headers: ", err, " [", part, "]")
  1005. end
  1006. local reader = sock:receiveuntil("abcabd")
  1007. for i = 1, 2 do
  1008. line, err, part = reader()
  1009. if line then
  1010. ngx.say("read: ", line)
  1011. else
  1012. ngx.say("failed to read a line: ", err, " [", part, "]")
  1013. end
  1014. end
  1015. ok, err = sock:close()
  1016. ngx.say("close: ", ok, " ", err)
  1017. ';
  1018. }
  1019. location /foo {
  1020. echo abcabcabd;
  1021. more_clear_headers Date;
  1022. }
  1023. --- request
  1024. GET /t
  1025. --- response_body eval
  1026. qq{connected: 1
  1027. request sent: 57
  1028. read: abc
  1029. failed to read a line: closed [
  1030. ]
  1031. close: nil closed
  1032. }
  1033. --- no_error_log
  1034. [error]
  1035. === TEST 19: long patterns
  1036. this exposed a memory leak in receiveuntil
  1037. --- config
  1038. location /t {
  1039. content_by_lua '
  1040. local sock, err = ngx.req.socket()
  1041. if not sock then
  1042. ngx.say("failed to get req socket: ", err)
  1043. return
  1044. end
  1045. local reader, err = sock:receiveuntil("------------------------------------------- abcdefghijklmnopqrstuvwxyz")
  1046. if not reader then
  1047. ngx.say("failed to get reader: ", err)
  1048. return
  1049. end
  1050. ngx.say("ok")
  1051. ';
  1052. }
  1053. --- request
  1054. GET /t
  1055. --- response_body
  1056. ok
  1057. --- no_error_log
  1058. [error]