2

JSON をペイロードとして使用して、単純な Web サービスの特定の要求に対して単純な http プロキシを実装しようとしています。

これに関する情報はいくつかありますが、ドキュメントには完全な例はありません。Google の検索結果で見つけたブログ投稿のコードをいくつか試しましたが、何も機能しませんでした。ここが私の居場所です。

リクエストは、次のようなハンドル メソッドを使用してハンドラー オブジェクトに渡されます。

sub handle
{
    my $self = shift;
    my $app = shift;

    my $tx = $app->tx;
    my $req = $app->req->clone;
    $log->info("upstream host is " . $self->{upstream_host});
    $log->info("upstream port is " . $self->{upstream_port});
    $req->url->scheme("http")
            ->host($self->{upstream_host})
            ->port($self->{upstream_port});

    $log->info("req: " . $req->to_string);
    $log->info("req host:port " . $req->url->host . ":" . $req->url->port);

    my $ua = Mojo::UserAgent->new;
    my $tx = Mojo::Transaction::HTTP->new(req => $req);

    $log->info("response: " . $tx->res->to_string());

    $app->render(data => $tx->res->body);
}

ログの内容はすべて正しいように見えますが、応答オブジェクトは 404 エラーであり、実際のトラフィックは localhost:3334 でリッスンしている他のサービスに到達していません。

2013-07-02 12:28:26.929793500 [2013 年 7 月 2 日火曜日 12:28:26] [情報] req ホスト: ポート 127.0.0.1:3334 2013-07-02 12:28:26.930225500 [7 月 2 日火曜日 12:28 :26 2013] [情報] 応答: HTTP/1.1 404 が見つかりません

これのノンブロッキングバージョンを試してみましたが、実際にはリクエストが送信されなかったので、単純化しようとしました。

ここでどこが間違っているのかわかりません。リクエストを複製して別のサービスに渡し、そのレスポンスを元のクライアントに返そうとしています。

ありがとう、マイク

4

1 に答える 1

2

わかりました、奇妙です。これは機能します。

sub handle
{
    my $self = shift;
    my $app = shift;

    my $tx = $app->tx;
    my $req = $app->req->clone;
    $log->debug("upstream host is " . $self->{upstream_host});
    $log->debug("upstream port is " . $self->{upstream_port});
    $req->url->scheme("http")
            ->host($self->{upstream_host})
            ->port($self->{upstream_port});

    $log->debug("req: " . $req->to_string);
    $log->debug("req host:port " . $req->url->host . ":" . $req->url->port);

    my $ua = Mojo::UserAgent->new;
    my $tx = $ua->start(Mojo::Transaction::HTTP->new(req => $req));

    $app->render(data => $tx->res->body);
}

私はそれが私がすでに行っていたこととどのように大きく異なるかを見ようとしています...

さて、これはブロッキング リクエストです。ノンブロッキングで動作するかどうか見てみましょう。

于 2013-07-03T10:45:02.413 に答える