annotate t/delay_body.t @ 1:7c2d64d9c656

Working delay body and tests. Depends on rb->filter_need_buffering and rb->buffered, as well as corresponding changes in the request body reading code to work. Might not be the best solution, as current body reading code relies on rb->buffered to be properly set at various stages. Notably, rb->buffered must be cleared when calling the next filter, since the save body filter relies on it. Possible future improvements: implement last buffer checking in the save body filter instead of checking for (rb->rest == 0 && !rb->buffered). The code uses its own event to implement delay timer. To remove the timer in case of abnormal request termination a cleanup handler is added. While in theory it is possible to use a timer on c->read instead, this implies additional changes to the request body reading code. Custom event was chosen to reduce complexity of changes needed.
author Maxim Dounin <mdounin@mdounin.ru>
date Fri, 20 Aug 2021 22:35:05 +0300
parents a386f95c5ae9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1 #!/usr/bin/perl
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3 # (C) Maxim Dounin
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
5 # Tests for delay body filter module.
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
6
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
7 ###############################################################################
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
8
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
9 use warnings;
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
10 use strict;
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
11
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
12 use Test::More;
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
13 use Test::Nginx;
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
14
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
15 use Socket qw/ CRLF /;
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
16
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
17 ###############################################################################
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
18
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
19 select STDERR; $| = 1;
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
20 select STDOUT; $| = 1;
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
21
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
22 my $t = Test::Nginx->new()->has(qw/http proxy rewrite/)
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
23 ->write_file_expand('nginx.conf', <<'EOF');
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
24
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
25 %%TEST_GLOBALS%%
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
26
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
27 daemon off;
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
28
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
29 events {
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
30 }
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
31
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
32 http {
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
33 %%TEST_GLOBALS_HTTP%%
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
34
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
35 server {
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
36 listen 127.0.0.1:8080;
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
37 server_name localhost;
1
7c2d64d9c656 Working delay body and tests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
38
0
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
39 location / {
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
40 delay_body 1s;
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
41 add_header X-Time $request_time;
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
42 proxy_pass http://127.0.0.1:8080/empty;
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
43 }
1
7c2d64d9c656 Working delay body and tests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
44
7c2d64d9c656 Working delay body and tests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
45 location /no {
7c2d64d9c656 Working delay body and tests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
46 delay_body 0s;
7c2d64d9c656 Working delay body and tests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
47 add_header X-Time $request_time;
7c2d64d9c656 Working delay body and tests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
48 proxy_pass http://127.0.0.1:8080/empty;
7c2d64d9c656 Working delay body and tests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
49 }
7c2d64d9c656 Working delay body and tests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
50
0
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
51 location /empty {
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
52 return 200 "test response body\n";
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
53 }
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
54 }
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
55 }
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
56
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
57 EOF
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
58
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
59 $t->try_run('no delay_body')->plan(4);
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
60
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
61 ###############################################################################
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
62
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
63 like(get_body('/', '123456'), qr/200 OK.*X-Time: 1/ms, 'delay');
1
7c2d64d9c656 Working delay body and tests.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
64 like(get_body('/no', '123456'), qr/200 OK.*X-Time: 0/ms, 'no delay');
0
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
65
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
66 # pipelining
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
67
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
68 like(get_body('/', '123456', '12345X'),
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
69 qr/200 OK.*X-Time: 1.*200 OK.*X-Time: 1/ms,
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
70 'pipelining delay');
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
71
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
72 # pipelining with chunked
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
73
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
74 like(get_chunked('/', '123456', '12345X'),
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
75 qr/200 OK.*X-Time: 1.*200 OK.*X-Time: 1/ms,
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
76 'pipelining chunked delay');
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
77
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
78 ###############################################################################
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
79
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
80 sub get_body {
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
81 my $uri = shift;
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
82 my $last = pop;
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
83 return http( join '', (map {
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
84 my $body = $_;
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
85 "GET $uri HTTP/1.1" . CRLF
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
86 . "Host: localhost" . CRLF
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
87 . "Content-Length: " . (length $body) . CRLF . CRLF
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
88 . $body
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
89 } @_),
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
90 "GET $uri HTTP/1.1" . CRLF
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
91 . "Host: localhost" . CRLF
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
92 . "Connection: close" . CRLF
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
93 . "Content-Length: " . (length $last) . CRLF . CRLF
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
94 . $last
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
95 );
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
96 }
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
97
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
98 sub get_chunked {
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
99 my $uri = shift;
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
100 my $last = pop;
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
101 return http( join '', (map {
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
102 my $body = $_;
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
103 "GET $uri HTTP/1.1" . CRLF
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
104 . "Host: localhost" . CRLF
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
105 . "Transfer-Encoding: chunked" . CRLF . CRLF
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
106 . sprintf("%x", length $body) . CRLF
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
107 . $body . CRLF
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
108 . "0" . CRLF . CRLF
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
109 } @_),
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
110 "GET $uri HTTP/1.1" . CRLF
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
111 . "Host: localhost" . CRLF
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
112 . "Connection: close" . CRLF
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
113 . "Transfer-Encoding: chunked" . CRLF . CRLF
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
114 . sprintf("%x", length $last) . CRLF
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
115 . $last . CRLF
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
116 . "0" . CRLF . CRLF
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
117 );
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
118 }
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
119
a386f95c5ae9 Initial module skeleton.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
120 ###############################################################################