Skip to content
This repository has been archived by the owner on Oct 15, 2022. It is now read-only.

Commit

Permalink
Merge pull request #243 from duckduckgo/caine/rewrite-upstream-timeouts
Browse files Browse the repository at this point in the history
NGiNX generated.conf: Add upstream timeout ability.
  • Loading branch information
moollaza committed Mar 30, 2017
2 parents 824ab70 + ed8424d commit 26c4131
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 1 deletion.
6 changes: 5 additions & 1 deletion lib/DDG/Meta/ZeroClickInfoSpice.pm
Expand Up @@ -28,6 +28,7 @@ sub zeroclickinfospice_attributes {qw(
ttl
error_fallback
alt_to
upstream_timeouts
)}

my %applied;
Expand All @@ -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);
Expand All @@ -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,
);
Expand Down Expand Up @@ -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},
);
}

Expand Down
13 changes: 13 additions & 0 deletions lib/DDG/Rewrite.pm
Expand Up @@ -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 ) = @_;

Expand All @@ -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} ) {
Expand Down
21 changes: 21 additions & 0 deletions t/55-rewrite.t
Expand Up @@ -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 for upstream timeouts.');

done_testing;

0 comments on commit 26c4131

Please sign in to comment.