Простой Perl Proxy - PullRequest
       13

Простой Perl Proxy

1 голос
/ 22 октября 2011

Мы храним большое количество файлов на Amazon S3, которые мы хотим, чтобы посетители веб-сайта могли иметь доступ через AJAX, но мы не хотим, чтобы фактические местоположения файлов были открыты для посетителей.

Чтобы выполнить это, я надеюсь сделать AJAX-запрос к очень простому Perl-скрипту, который просто выступил бы в качестве прокси и вернул файл в браузер. У меня уже есть настройка скрипта для проверки подлинности входа пользователя в систему и выполнения запроса к базе данных, чтобы определить правильный URL-адрес для доступа к файлу на S3, но я не уверен, что лучший способ вернуть файл браузеру vistor в самый эффективный способ.

Буду очень признателен за любые предложения о наилучшем способе достижения этой цели. Спасибо!

Ответы [ 2 ]

2 голосов
/ 24 октября 2011

Лучший способ - использовать системный вызов sendfile .Если вы открываете и считываете файл с диска вручную, а затем снова записываете его по блокам в конец «приемника» вашей веб-инфраструктуры, то вы очень расточительны, потому что данные должны проходить через ОЗУ, возможно, включая буферизацию.

То, что вы описываете в своем вопросе, является очень распространенным паттерном, поэтому уже существует множество решений, основанных на идее простого задания специального HTTP-заголовка , а затем позволяющего веб-стеку ниже вашего приложения справляться с ним.эффективно.

Используйте промежуточное программное обеспечение XSendfile в Plack, чтобы установить соответствующий заголовок.Следующая минимальная программа будет использовать DTRT и по возможности использовать системный вызов.

use IO::File::WithPath qw();
use Plack::Builder qw(builder enable);
builder {
    enable 'Plack::Middleware::XSendfile';
    sub {
        return [200, [], IO::File::WithPath->new('/usr/src/linux/COPYING')];
    }
};
1 голос
/ 23 октября 2011

Хорошо.Есть пример, как реализовать это, используя Mojolicious framework.Я полагаю, вы запускаете этот скрипт как демон.Скрипт перехватывает все запросы к /json_dir/.*, этот запрос к API Stackoverflow и возвращает ответ.Вы можете запустить этот скрипт как ./example.pl daemon, а затем попробовать http://127.0.0.1:3000/json_dir/perl

В ответ вы сможете найти свой собственный вопрос под названием «Простой Perl Proxy».Этот код может использоваться в качестве автономного демона, который прослушивает определенный порт, и в качестве сценария CGI (в первую очередь предпочтительно).

#!/usr/bin/env perl
use Mojolicious::Lite;

get '/json_dir/(.filename)' => sub {
    my $self = shift;

    my $filename = $self->stash('filename');
    my $url = "http://api.stackoverflow.com/1.1/questions?tagged=" . $filename;

    $self->ua->get(
        $url => sub {
            my ($client, $tx) = @_;
            json_response($self, $tx);
        }
    );

    $self->render_later;
};

sub json_response {
    my ($self, $tx) = @_;
    if (my $res = $tx->success) {
        $self->tx->res($res);
    }
    else {
        $self->render_not_found;
    }
    $self->rendered;
}

app->start;

__DATA__

@@ not_found.html.ep
<!doctype html><html>
  <head><title>Not Found</title></head>
  <body>File not found</body>
</html>
...