annotate t/auth-request.t @ 10:2b95417a1715

Auth request: fix body handling again. Setting r->discard_body is wrong way to go as it causes lingering timer to be armed on subrequest finalization. Create fake body instead. This also allows to protect real body file from being closed in case it was already read. Though it doesn't matter now as we set r->header_only and relevant code in ngx_http_upstream_send_response() isn't reached.
author Maxim Dounin <mdounin@mdounin.ru>
date Wed, 24 Mar 2010 07:23:22 +0300
parents 70f3d876b569
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
1 #!/usr/bin/perl
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
2
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
3 # (C) Maxim Dounin
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
4
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
5 # Tests for auth request module.
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
6
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
7 ###############################################################################
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
8
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
9 use warnings;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
10 use strict;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
11
4
35f0ee7a3c28 Auth request: fix SIGSEGV on POST.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
12 use Socket qw/ CRLF /;
35f0ee7a3c28 Auth request: fix SIGSEGV on POST.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
13
0
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
14 use Test::More;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
15 use Test::Nginx;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
16
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
17 ###############################################################################
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
18
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
19 select STDERR; $| = 1;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
20 select STDOUT; $| = 1;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
21
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
22 my $t = Test::Nginx->new()->has(qw/http rewrite proxy fastcgi auth_basic/)
10
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
23 ->plan(18);
0
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
24
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
25 $t->write_file_expand('nginx.conf', <<'EOF');
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
26
6
70f3d876b569 Auth request: use test globals.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
27 %%TEST_GLOBALS%%
70f3d876b569 Auth request: use test globals.
Maxim Dounin <mdounin@mdounin.ru>
parents: 4
diff changeset
28
0
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
29 master_process off;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
30 daemon off;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
31
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
32 events {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
33 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
34
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
35 http {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
36 %%TEST_GLOBALS_HTTP%%
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
37
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
38 server {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
39 listen 127.0.0.1:8080;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
40 server_name localhost;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
41
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
42 location / {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
43 return 444;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
44 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
45
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
46 location /open {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
47 auth_request /auth-open;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
48 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
49 location = /auth-open {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
50 return 204;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
51 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
52
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
53 location /open-static {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
54 auth_request /auth-open-static;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
55 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
56 location = /auth-open-static {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
57 # nothing, use static file
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
58 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
59
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
60 location /unauthorized {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
61 auth_request /auth-unauthorized;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
62 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
63 location = /auth-unauthorized {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
64 return 401;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
65 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
66
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
67 location /forbidden {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
68 auth_request /auth-forbidden;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
69 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
70 location = /auth-forbidden {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
71 return 403;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
72 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
73
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
74 location /error {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
75 auth_request /auth-error;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
76 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
77 location = /auth-error {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
78 return 404;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
79 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
80
1
dfc5ae42367a Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
81 location /off {
dfc5ae42367a Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
82 auth_request off;
dfc5ae42367a Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
83 }
dfc5ae42367a Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
84
0
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
85 location /proxy {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
86 auth_request /auth-proxy;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
87 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
88 location = /auth-proxy {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
89 proxy_pass http://127.0.0.1:8080/auth-basic;
4
35f0ee7a3c28 Auth request: fix SIGSEGV on POST.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
90 proxy_pass_request_body off;
35f0ee7a3c28 Auth request: fix SIGSEGV on POST.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
91 proxy_set_header Content-Length "";
0
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
92 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
93 location = /auth-basic {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
94 auth_basic "restricted";
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
95 auth_basic_user_file %%TESTDIR%%/htpasswd;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
96 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
97
10
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
98 location = /proxy-double {
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
99 proxy_pass http://127.0.0.1:8080/auth-error;
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
100 proxy_intercept_errors on;
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
101 error_page 404 = /proxy-double-fallback;
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
102 client_body_buffer_size 4k;
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
103 }
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
104 location = /proxy-double-fallback {
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
105 auth_request /auth-proxy-double;
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
106 proxy_pass http://127.0.0.1:8080/auth-open;
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
107 }
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
108 location = /auth-proxy-double {
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
109 proxy_pass http://127.0.0.1:8080/auth-open;
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
110 proxy_pass_request_body off;
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
111 proxy_set_header Content-Length "";
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
112 }
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
113
0
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
114 location /fastcgi {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
115 auth_request /auth-fastcgi;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
116 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
117 location = /auth-fastcgi {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
118 fastcgi_pass 127.0.0.1:8081;
4
35f0ee7a3c28 Auth request: fix SIGSEGV on POST.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
119 fastcgi_pass_request_body off;
0
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
120 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
121 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
122 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
123
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
124 EOF
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
125
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
126 $t->write_file('htpasswd', 'user:zz1T8N4tWvmbE' . "\n");
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
127 $t->write_file('auth-basic', 'INVISIBLE');
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
128 $t->write_file('auth-open-static', 'INVISIBLE');
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
129 $t->run();
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
130
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
131 ###############################################################################
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
132
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
133 pass('runs');
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
134
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
135 like(http_get('/open'), qr/ 404 /, 'auth open');
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
136 like(http_get('/unauthorized'), qr/ 401 /, 'auth unauthorized');
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
137 like(http_get('/forbidden'), qr/ 403 /, 'auth forbidden');
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
138 like(http_get('/error'), qr/ 500 /, 'auth error');
1
dfc5ae42367a Auth request: support switching off.
Maxim Dounin <mdounin@mdounin.ru>
parents: 0
diff changeset
139 like(http_get('/off'), qr/ 404 /, 'auth off');
0
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
140
4
35f0ee7a3c28 Auth request: fix SIGSEGV on POST.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
141 like(http_post('/open'), qr/ 404 /, 'auth post open');
35f0ee7a3c28 Auth request: fix SIGSEGV on POST.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
142 like(http_post('/unauthorized'), qr/ 401 /, 'auth post unauthorized');
35f0ee7a3c28 Auth request: fix SIGSEGV on POST.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
143
0
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
144 like(http_get('/open-static'), qr/ 404 /, 'auth open static');
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
145 unlike(http_get('/open-static'), qr/INVISIBLE/, 'auth static no content');
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
146
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
147 like(http_get('/proxy'), qr/ 401 /, 'proxy auth unauthorized');
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
148 like(http_get('/proxy'), qr/WWW-Authenticate: Basic realm="restricted"/,
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
149 'proxy auth has www-authenticate');
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
150 like(http_get_auth('/proxy'), qr/ 404 /, 'proxy auth pass');
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
151 unlike(http_get_auth('/proxy'), qr/INVISIBLE/, 'proxy auth no content');
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
152
4
35f0ee7a3c28 Auth request: fix SIGSEGV on POST.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
153 like(http_post('/proxy'), qr/ 401 /, 'proxy auth post');
35f0ee7a3c28 Auth request: fix SIGSEGV on POST.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
154
10
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
155 # Consider the following scenario:
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
156 #
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
157 # 1. proxy_pass reads request body, then goes to fallback via error_page
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
158 # 2. auth request uses proxy_pass, and upstream module closes request body file
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
159 # in ngx_http_upstream_send_response()
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
160 # 3. oops: fallback has no body
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
161 #
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
162 # To prevent this we always allocate fake request body for auth request.
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
163 #
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
164 # Note that this doesn't happen when using header_only as relevant code
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
165 # in ngx_http_upstream_send_response() isn't reached. It may be reached
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
166 # with proxy_cache or proxy_store, but they will shutdown client connection
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
167 # in case of header_only and hence do not work for us at all.
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
168
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
169 like(http_post_big('/proxy-double'), qr/ 204 /, 'proxy auth with body read');
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
170
0
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
171 SKIP: {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
172 eval { require FCGI; };
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
173 skip 'FCGI not installed', 2 if $@;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
174
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
175 $t->run_daemon(\&fastcgi_daemon);
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
176 $t->waitforsocket('127.0.0.1:8081');
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
177
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
178 like(http_get('/fastcgi'), qr/ 404 /, 'fastcgi auth open');
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
179 unlike(http_get('/fastcgi'), qr/INVISIBLE/, 'fastcgi auth no content');
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
180 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
181
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
182 ###############################################################################
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
183
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
184 sub http_get_auth {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
185 my ($url, %extra) = @_;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
186 return http(<<EOF, %extra);
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
187 GET $url HTTP/1.0
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
188 Host: localhost
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
189 Authorization: Basic dXNlcjpzZWNyZXQ=
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
190
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
191 EOF
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
192 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
193
4
35f0ee7a3c28 Auth request: fix SIGSEGV on POST.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
194 sub http_post {
35f0ee7a3c28 Auth request: fix SIGSEGV on POST.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
195 my ($url, %extra) = @_;
35f0ee7a3c28 Auth request: fix SIGSEGV on POST.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
196
35f0ee7a3c28 Auth request: fix SIGSEGV on POST.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
197 my $p = "POST $url HTTP/1.0" . CRLF .
35f0ee7a3c28 Auth request: fix SIGSEGV on POST.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
198 "Host: localhost" . CRLF .
35f0ee7a3c28 Auth request: fix SIGSEGV on POST.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
199 "Content-Length: 10" . CRLF .
35f0ee7a3c28 Auth request: fix SIGSEGV on POST.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
200 CRLF .
35f0ee7a3c28 Auth request: fix SIGSEGV on POST.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
201 "1234567890";
35f0ee7a3c28 Auth request: fix SIGSEGV on POST.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
202
35f0ee7a3c28 Auth request: fix SIGSEGV on POST.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
203 return http($p, %extra);
35f0ee7a3c28 Auth request: fix SIGSEGV on POST.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
204 }
35f0ee7a3c28 Auth request: fix SIGSEGV on POST.
Maxim Dounin <mdounin@mdounin.ru>
parents: 1
diff changeset
205
10
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
206 sub http_post_big {
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
207 my ($url, %extra) = @_;
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
208
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
209 my $p = "POST $url HTTP/1.0" . CRLF .
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
210 "Host: localhost" . CRLF .
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
211 "Content-Length: 10240" . CRLF .
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
212 CRLF .
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
213 ("1234567890" x 1024);
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
214
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
215 return http($p, %extra);
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
216 }
2b95417a1715 Auth request: fix body handling again.
Maxim Dounin <mdounin@mdounin.ru>
parents: 6
diff changeset
217
0
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
218 ###############################################################################
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
219
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
220 sub fastcgi_daemon {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
221 my $socket = FCGI::OpenSocket('127.0.0.1:8081', 5);
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
222 my $request = FCGI::Request(\*STDIN, \*STDOUT, \*STDERR, \%ENV,
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
223 $socket);
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
224
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
225 while ($request->Accept() >= 0) {
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
226 print <<EOF;
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
227 Content-Type: text/html
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
228
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
229 INVISIBLE
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
230 EOF
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
231 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
232
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
233 FCGI::CloseSocket($socket);
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
234 }
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
235
436da5355bd5 Auth request module.
Maxim Dounin <mdounin@mdounin.ru>
parents:
diff changeset
236 ###############################################################################