Net-SSLeay-1.20 > Net::SSLeay::Handle

名前

Net::SSLeay::Handle - SSL (HTTPS)ソケットを標準のファイルハンドルとして 扱わせるPerlモジュール

概要

  use Net::SSLeay::Handle qw/shutdown/;
  my ($host, $port) = ("localhost", 443);

  tie(*SSL, "Net::SSLeay::Handle", $host, $port);

  print SSL "GET / HTTP/1.0\r\n";
  shutdown(\*SSL, 1);
  print while (<SSL>);
  close SSL;                                                       
  

説明

Net::SSLeay::HandleはHTTPS webページを"昔ながらの"ファイルハンドルを 使って以下のように、リクエストしたり、受け取ることを可能にします:

    print SSL "GET / HTTP/1.0\r\n";

そして

    print while (<SSL>);

shutdownルーチンをエクスポートすると、あなたのプログラムに追加する 必要がある特別なコードは、以下のようなtie関数だけになります:

    my $socket;
    if ($scheme eq "https") {
        tie(*S2, "Net::SSLeay::Handle", host, $port);
        $socket = \*S2;
    else {
        $socket = Net::SSLeay::Handle->make_socket(host, $port);
    }
    print $socket $request_headers;
    ... 

既存のソケットを利用する

このモジュールを作った動機の一つは、ソケットを作るコードが重複する ことを避けることでした(そのほとんどはエラーの取り扱いになります)。 上記の$hostと$portが渡されるところでtie()を呼び出すことは、 便宜上、テストのために提供されています。正しいホストとポートに 接続されたソケットS1を既に持っているのであれば、以下のように することができます:

    my $socket \*S1;
    if ($scheme eq "https") {
        tie(*S2, "Net::SSLeay::Handle", $socket);
        $socket = \*S2;
    }
    my $last_sel = select($socket); $| = 1; select($last_sel);
    print $socket $request_headers;
    ... 

注意: 私が知る限り、tie()関数ではグロブの取り扱いには注意しなければ なりません。最初のパラメータはグロブ(*SOMETHING)でなければなりません。 そして最後のパラメータはグロブへのリファレンス(\*SOMETHING_ELSE)あるいは (上記の例のように)グロブへのリファレンスが代入されたスカラーでなければ なりません。

また2つのグロブは違うものでなければなりません。私が同じグロブを使おうと したときには、コアダンプになりました。

エクスポート(EXPORT)

デフォルトでは何もありません。

shutodown()関数をエクスポートすることができます。

SSLソケットをシャットダウンするためには、shutdown()をエスクポートするか、 完全に修飾されたNet::SSLeay::Handle::shutdown()関数を使うことを提案します。 SSLと非SSLソケットを区別し、正しいことを行うのに十分スマートです。

使用例

  use Net::SSLeay::Handle qw/shutdown/;
  my ($host, $port) = ("localhost", 443);

  tie(*SSL, "Net::SSLeay::Handle", $host, $port);

  print SSL "GET / HTTP/1.0\r\n";
  shutdown(\*SSL, 1);
  print while (<SSL>);
  close SSL; 

やるべきこと(TODO)

よりよいエラーの取り扱い、コールバックルーチン?

注意

ファイルハンドルを使おうとすることは少しトリッキーです(少なくとも私にとっては)。

tie()への最初のパラメータはグロブ(*SOMETHING)で、最後のパラメータは グロブへのリファレンス(\*SOMETHING_ELSE)か、グロブへのリファレンスが 代入されたスカラー($s = \*SOMETHING_ELSE)でなければなりません。 また2つのグロブは違うものでなければなりません。私が同じグロブを使おうと したときには、コアダンプになりました。

ファイルヘッド1によりキーが付けられたハッシュのハッシュを作ることにより、 このモジュールにより作成されたグロブに属性を関連付けることができました (上記の*SSLのように)。

古いperlのサポートは100%ではないかもしれません。障害時には5.6.0以上を お試しください。

変更点

Net-SSLeay-Handle-0.50/Changesファイルをご覧ください。

既知のバグ

Perlバージョンv5.6以前で、このモジュールにあなた用のソケットを作る よう命令すると、少しメモリリークを起こします。Perlをアップグレードするか、 あなた自身でソケットを作成してください。そのリークは、これらの古い バージョンのPerlに同時に1つ以上のハンドルにアクセスさせるために 作られます。

作者

Jim Bowlin jbowlin@linklint.org

参考資料

Net::SSLeay, perl(1), http://openssl.org/