用 Catalyst 做簡單 proxy 時,資料被 Truncate 的問題

Catalyst 是一套以 PERL 寫成的 Framework,自從去年聽了 gugod 的介紹之後開始接觸,關於更進一步的介紹可以參考他做的投影片

前兩天試著用 Catalyst 做一個簡單的 Reverse Proxy Server;基本的流程就是:當 user 送 request 過來,到另一台 server 去把檔案抓回來,並且回傳給 client 端;流程很簡單,但是不知道為什麼,在圖檔的部份時好時壞,特定的檔案會無法正確顯示。檢查之後發現,這些檔案在快要傳完時, server 就把 connection 截斷,因此就會一直重傳。

原本的寫法如下:

my $user_agent = LWP::UserAgent->new();
my $respond = $user_agent->get($url);
if ($respond->is_success()) {
$context->res->content_type($respond->content_type());
$context->res->content_length($respond->content_length());
$context->res->content_encoding($respond->content_encoding());
$context->res->output($respond->content());}
return 1;

經過一番努力交叉測試之後,發現上面粗體字的那行,必須要改成

$context->res->write($respond->content());

才行,這樣就不會有問題了,原因不明,如果有人知道為什麼的話,還請指教啊~

Update: 發現原來是我白爛。原本的寫法是沒有問題的,問題是出在原本設定了一個 default End handler,是會自動把 user 已經填過的表單填好,結果沒有檢查是不是已經有資料,一樣丟進去處理,於是就會有這個問題。正確的寫法如下:

sub end : Private
{
my ($self, $context) = @_;
$context->forward('FindBook::View::TToolkit') unless $context->res->output; $context->fillform( ) unless $context->res->output;
}

1 thought on “用 Catalyst 做簡單 proxy 時,資料被 Truncate 的問題

Comments are closed.