PageRenderTime 57ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/tests/test-nginx/cases/lua-tests/066-socket-receiveuntil.t

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