Crypt::SSLeayでproxyエラーになるときの対策

[client] => [Apache mod_proxy] => [server]

っていう環境で時々つながらない事があるってので数日間悩んでいたんだけど、

Crypt::SSLeayのrtにでてた。


#33954: CONNECT is not robust to fragmentation of HTTP headers


これに対応するパッチがこれ

--- Crypt-SSLeay-0.57/lib/Net/SSL.pm.orig       2008-08-13 12:13:33.000000000 +0900
+++ Crypt-SSLeay-0.57/lib/Net/SSL.pm    2008-08-13 12:13:58.000000000 +0900
@@ -361,8 +361,11 @@
 
     $connect_string .= $CRLF;
     $self->SUPER::send($connect_string);
-    my $header;
-    my $n = $self->SUPER::sysread($header, 8192);
+    my $header='';
+    while ( $header !~ /$CRLF$CRLF/ ) {
+      my $n = $self->SUPER::sysread($header, 8192, length($header));
+    }
+
     my $conn_ok = ($header =~ /HTTP\/\d+\.\d+\s+200\s+/is) ? 1 : 0;
 
     if (not $conn_ok) {

これで解決するといいなと思うんだけど、確認までに時間かかる


もうひとつ問題があって、接続に失敗したときに、SSLのバージョンを変更して再接続をしようとするんだけど、

その時の引数が変。


1回目は

CONNECT example.com HTTP/1.0

なんだけど、2回目がproxyのIPアドレスでCONNECTしようとしてしまう。

CONNECT 192.168.1.1 HTTP/1.0

これはもちろん、エラーになる

原因はNet::SSLの136行目あたりの

            my %args = (%$new_arg, %$arg);

これのnew_argとargが逆なんじゃないかと思うんですが、

みなさまどう思いますでしょうか。

created by blog.nomadscafe.jp

コメント

コメントはありません

コメントを投稿

コメントを投稿するにはログインが必要です