Guest User

Untitled

a guest
Apr 26th, 2018
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.85 KB | None | 0 0
  1. package Plack::App::Proxy;
  2.  
  3. use parent 'Plack::Component';
  4. use Plack::Util::Accessor qw/host/;
  5. use AnyEvent::HTTP;
  6. use LWP::UserAgent;
  7. use lib;
  8.  
  9. sub call {
  10. my ($self, $env) = @_;
  11. $self->setup($env) unless $self->{proxy};
  12. return $self->{proxy}->($env);
  13. }
  14.  
  15. sub setup {
  16. my ($self, $env) = @_;
  17. if ($env->{"psgi.streaming"}) {
  18. $self->{proxy} = sub {$self->async(@_)};
  19. }
  20. else {
  21. $self->{proxy} = sub {$self->block(@_)};
  22. $self->{ua} = LWP::UserAgent->new;
  23. }
  24. }
  25.  
  26. sub async {
  27. my ($self, $env) = @_;
  28. return sub {
  29. my $respond = shift;
  30. http_request($env->{REQUEST_METHOD} => $self->host . $env->{PATH_INFO},
  31. want_body_handle => 1,
  32. on_body => sub {
  33. my ($handle, $headers) = @_;
  34. if (!$handle or $headers->{Status} =~ /^59\d+/) {
  35. $respond->([500, [], ["server error"]]);
  36. }
  37. else {
  38. my $writer = $respond->([200, [_res_headers($headers)]]);
  39. $handle->on_eof(sub {
  40. undef $handle;
  41. $writer->close;
  42. });
  43. $handle->on_error(sub{});
  44. $handle->on_read(sub {
  45. my $data = $_[0]->rbuf;
  46. $writer->write($data) if $data;
  47. });
  48. }
  49. },
  50. );
  51. }
  52. }
  53.  
  54. sub block {
  55. my ($self, $env) = @_;
  56. my $ua = $self->{ua};
  57. my $req = HTTP::Request->new(
  58. $env->{REQUEST_METHOD} => $self->host . $env->{PATH_INFO}
  59. );
  60. my $res = $ua->request($req);
  61. return [$res->code, [_res_headers($res)], [$res->content]];
  62. }
  63.  
  64. sub _res_headers {
  65. my $headers = shift;
  66. my @valid_headers = qw/Content-Length Content-Type ETag
  67. Last-Modified Cache-Control Expires/;
  68. if (ref $headers eq "HASH") {
  69. map {$_ => $headers->{lc $_}}
  70. grep {$headers->{lc $_}} @valid_headers;
  71. }
  72. elsif (ref $headers eq "HTTP::Response") {
  73. map {$_ => $headers->header($_)}
  74. grep {$headers->header($_)} @valid_headers;
  75. }
  76. }
  77.  
  78. 1;
Add Comment
Please, Sign In to add comment