From f233d8e7c3973bb8839d8d4c39df64775857ab44 Mon Sep 17 00:00:00 2001 From: Caine Tighe Date: Wed, 29 Mar 2017 19:44:04 -0400 Subject: [PATCH 1/2] NGiNX generated.conf: Add upstream timeout ability. --- lib/DDG/Meta/ZeroClickInfoSpice.pm | 6 +++++- lib/DDG/Rewrite.pm | 13 +++++++++++++ t/55-rewrite.t | 21 +++++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/lib/DDG/Meta/ZeroClickInfoSpice.pm b/lib/DDG/Meta/ZeroClickInfoSpice.pm index bdab5723..582037fe 100644 --- a/lib/DDG/Meta/ZeroClickInfoSpice.pm +++ b/lib/DDG/Meta/ZeroClickInfoSpice.pm @@ -28,6 +28,7 @@ sub zeroclickinfospice_attributes {qw( ttl error_fallback alt_to + upstream_timeouts )} my %applied; @@ -47,6 +48,7 @@ sub apply_keywords { wrap_jsonp_callback => 0, wrap_string_callback => 0, accept_header => 0, + upstream_timeouts => +{}, ); my $stash = Package::Stash->new($target); @@ -60,6 +62,7 @@ sub apply_keywords { delete $params{'accept_header'}; delete $params{'proxy_cache_valid'}; delete $params{'proxy_ssl_session_reuse'}; + delete $params{'upstream_timeouts'}; return DDG::ZeroClickInfo::Spice->new( %params, ); @@ -240,7 +243,8 @@ sub create_rewrite { wrap_jsonp_callback => $params->{wrap_jsonp_callback}, wrap_string_callback => $params->{wrap_string_callback}, headers => $params->{headers}, - error_fallback => $params->{error_fallback} + error_fallback => $params->{error_fallback}, + upstream_timeouts => $params->{upstream_timeouts}, ); } diff --git a/lib/DDG/Rewrite.pm b/lib/DDG/Rewrite.pm index 602e1f70..dffffac0 100644 --- a/lib/DDG/Rewrite.pm +++ b/lib/DDG/Rewrite.pm @@ -124,6 +124,12 @@ has error_fallback => ( default => sub { 0 }, ); +has upstream_timeouts => ( + is => 'lazy', + predicate => 'has_upstream_timeouts', + default => sub { +{} }, +); + sub _build_nginx_conf { my ( $self ) = @_; @@ -147,6 +153,13 @@ sub _build_nginx_conf { my $cfg = "location ^~ ".$self->path." {\n"; + my $timeouts = $self->has_upstream_timeouts && $self->upstream_timeouts; + if (ref $timeouts eq 'HASH' && keys %$timeouts) { + $cfg .= "\tproxy_connect_timeout $timeouts->{connect};\n" if $timeouts->{connect}; + $cfg .= "\tproxy_send_timeout $timeouts->{send};\n" if $timeouts->{send}; + $cfg .= "\tproxy_read_timeout $timeouts->{read};\n" if $timeouts->{read}; + } + if ( $self->headers ) { if ( ref $self->headers eq 'HASH' ) { for my $header ( sort keys %{$self->headers} ) { diff --git a/t/55-rewrite.t b/t/55-rewrite.t index 77434488..ac226991 100644 --- a/t/55-rewrite.t +++ b/t/55-rewrite.t @@ -216,4 +216,25 @@ my $upstream_rewrite = DDG::Rewrite->new( like($upstream_rewrite->nginx_conf, qr/set \$spice_name_upstream http:\/\/some\.api:80;/,'Checking upstream rewrite'); +my $upstream_timeouts_rewrite = DDG::Rewrite->new( + path => '/js/spice/spice_name/', + to => 'https://some.api/$1', + upstream_timeouts => +{ connect => '10ms', send => '20ms', read => '30ms' }, +); + +isa_ok($upstream_timeouts_rewrite,'DDG::Rewrite'); + +is($upstream_timeouts_rewrite->missing_envs ? 1 : 0,0,'Checking now not missing ENV'); +is($upstream_timeouts_rewrite->nginx_conf,'location ^~ /js/spice/spice_name/ { + proxy_connect_timeout 10ms; + proxy_send_timeout 20ms; + proxy_read_timeout 30ms; + set $spice_name_upstream https://some.api:443; + rewrite ^/js/spice/spice_name/(.*) /$1 break; + proxy_pass $spice_name_upstream; + proxy_ssl_server_name on; + expires 1s; +} +','Checking generated nginx.conf'); + done_testing; From ed8424d0d46ca0e5de747f48488d0ff52779315b Mon Sep 17 00:00:00 2001 From: Caine Tighe Date: Wed, 29 Mar 2017 19:51:40 -0400 Subject: [PATCH 2/2] t/55-rewrite.t: Add better comment. --- t/55-rewrite.t | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/t/55-rewrite.t b/t/55-rewrite.t index ac226991..d09fa8b9 100644 --- a/t/55-rewrite.t +++ b/t/55-rewrite.t @@ -235,6 +235,6 @@ is($upstream_timeouts_rewrite->nginx_conf,'location ^~ /js/spice/spice_name/ { proxy_ssl_server_name on; expires 1s; } -','Checking generated nginx.conf'); +','Checking generated nginx.conf for upstream timeouts.'); done_testing;