changeset 887:5debefd670bc

Tests: proxy_next_upstream non_idempotent tests.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 28 Mar 2016 19:47:38 +0300
parents af2cd0ba6ca7
children 4ab795ab2e62
files proxy_non_idempotent.t
diffstat 1 files changed, 125 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/proxy_non_idempotent.t
@@ -0,0 +1,125 @@
+#!/usr/bin/perl
+
+# (C) Maxim Dounin
+# (C) Nginx, Inc.
+
+# Tests for proxy_next_upstream non_idempotent.
+
+###############################################################################
+
+use warnings;
+use strict;
+
+use Test::More;
+
+BEGIN { use FindBin; chdir($FindBin::Bin); }
+
+use lib 'lib';
+use Test::Nginx;
+
+###############################################################################
+
+select STDERR; $| = 1;
+select STDOUT; $| = 1;
+
+my $t = Test::Nginx->new()->has(qw/http proxy rewrite upstream_keepalive/);
+
+$t->write_file_expand('nginx.conf', <<'EOF');
+
+%%TEST_GLOBALS%%
+
+daemon off;
+
+events {
+}
+
+http {
+    %%TEST_GLOBALS_HTTP%%
+
+    upstream u {
+        server 127.0.0.1:8081 max_fails=0;
+        server 127.0.0.1:8081 max_fails=0;
+    }
+
+    upstream uk {
+        server 127.0.0.1:8081 max_fails=0;
+        server 127.0.0.1:8081 max_fails=0;
+        keepalive 10;
+    }
+
+    server {
+        listen       127.0.0.1:8080;
+        server_name  localhost;
+
+        add_header X-IP $upstream_addr always;
+
+        location / {
+            proxy_pass http://u;
+            proxy_next_upstream error timeout;
+        }
+
+        location /non {
+            proxy_pass http://u;
+            proxy_next_upstream error timeout non_idempotent;
+        }
+
+        location /keepalive {
+            proxy_pass http://uk;
+            proxy_next_upstream error timeout;
+            proxy_http_version 1.1;
+            proxy_set_header Connection "";
+        }
+    }
+
+    server {
+        listen       127.0.0.1:8081;
+        server_name  localhost;
+
+        location / {
+            return 444;
+        }
+
+        location /keepalive/establish {
+            return 204;
+        }
+    }
+}
+
+EOF
+
+$t->try_run('no proxy_next_upstream non_idempotent')->plan(6);
+
+###############################################################################
+
+# non-idempotent requests should not be retried by default
+# if a request has been sent to a backend
+
+like(http_get('/'), qr/X-IP: (\S+), \1\x0d?$/m, 'get');
+like(http_post('/'), qr/X-IP: (\S+)\x0d?$/m, 'post');
+
+# with "proxy_next_upstream non_idempotent" there is no
+# difference between idempotent and non-idempotent requests,
+# non-idempotent requests are retried as usual
+
+like(http_get('/non'), qr/X-IP: (\S+), \1\x0d?$/m, 'get non_idempotent');
+like(http_post('/non'), qr/X-IP: (\S+), \1\x0d?$/m, 'post non_idempotent');
+
+# cached connections follow the same rules
+
+like(http_get('/keepalive/establish'), qr/204 No Content/m, 'keepalive');
+like(http_post('/keepalive/drop'), qr/X-IP: (\S+)\x0d?$/m, 'keepalive post');
+
+###############################################################################
+
+sub http_post {
+	my ($uri, %extra) = @_;
+	my $cl = $extra{cl} || 0;
+
+	http(<<"EOF");
+POST $uri HTTP/1.0
+Content-Length: $cl
+
+EOF
+}
+
+###############################################################################