Streaming in any form was the main problem that I had w/Dancer 1. While moving to Dancer 2 was partially influenced by that, it was also because Dancer 2 has nicer routing and other features.
The current code looks like:
sub proxy_request {
my $self;
$self = shift if ( ( _whoami() )[1] ne (caller)[1] );
my ( $proxy_route, $file_name ) = @_;
unless ($proxy_route) {
Tranquillus::Util->return_error('BAD_QUERY');
}
my $cb = sub {
my $respond = $Dancer2::Core::Route::RESPONDER;
require LWP;
my $ua = LWP::UserAgent->new;
my $writer;
my %m;
$ua->get(
$proxy_route,
':content_cb' => sub {
my ( $data, $response, $protocol ) = @_;
if ( not $writer ) {
my $h = $response->headers;
my @ary =
( 'Cache-Control', 'Content-Length', 'Content-
+Type', 'Last-Modified', 'Content-Disposition' );
foreach my $key (@ary) {
if ( $h->header($key) ) {
$m{$key} = $h->header($key);
}
}
unless ( exists $m{'Content-Length'} ) {
# RFC 7230
# http://tools.ietf.org/html/rfc7230#section-4
$m{'Transfer-Encoding'} = 'chunked';
}
if ($file_name) {
$m{'Content-Disposition'} ||= 'attachment; fil
+ename="' . $file_name . '"';
}
$writer = $respond->( [ $response->code, [%m] ] );
}
# Ensure that we have a valid writer...
if ($writer) {
$writer->write($data);
}
},
);
# Cleanup.
# Ensure that we have a valid writer...
if ($writer) {
if ( exists $m{'Transfer-Encoding'} ) {
$writer->write(undef);
$writer->write("\r\n");
}
$writer->close;
}
};
my $response = Dancer2::Core::Response::Delayed->new(
# error_cb => sub { $weak_self->logger_engine->log(
+ warning => @_ ) },
cb => $cb,
request => $Dancer2::Core::Route::REQUEST,
response => $Dancer2::Core::Route::RESPONSE,
);
return $response;
}
... and can be found at: https://github.com/gsiems/tranquillus/blob/master/lib/Tranquillus/Proxy.pm
Update: fixed the github link.
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.