perlで外部ドメインへリクエストを投げようとしたところ、
下記エラーが発生しています。
perl
1# Create a user agent object 2 use LWP::UserAgent; 3 $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0; 4 my $ua = LWP::UserAgent->new( 5 ssl_opts => { 6 verify_hostname => 0, 7 protocols_allowed => [ 'http', 'https' ] , 8 SSL_verify_mode => IO::Socket::SSL::SSL_VERIFY_NONE, 9 10 }, 11 ); 12 $ua->agent("MyApp/0.1 "); 13 14 # Create a request 15 my $req = HTTP::Request->new(POST => 'http://search.cpan.org/search'); 16 $req->content_type('application/x-www-form-urlencoded'); 17 $req->content('query=libwww-perl&mode=dist'); 18 19 # Pass request to the user agent and get a response back 20 my $res = $ua->request($req); 21 22 # Check the outcome of the response 23 if ($res->is_success) { 24 info_log("result:".$res->content); 25 } 26 else { 27 info_log("result:".$res->status_line); 28 }
エラー内容
[INFO] result:500 Can't connect to search.cpan.org:80 (Bad hostname) [INFO] $VAR1 = bless( { '_content' => 'Can\'t connect to search.cpan.org:80 (Bad hostname) LWP::Protocol::http::Socket: Bad hostname \'search.cpan.org\' at /data/powercms/mt/extlib/LWP/Protocol/http.pm line 51, <FH> line 2. ', '_rc' => 500, '_headers' => bless( { 'client-warning' => 'Internal response', 'client-date' => 'Fri, 21 Jun 2019 00:28:43 GMT', 'content-type' => 'text/plain' }, 'HTTP::Headers' ), '_msg' => 'Can\'t connect to search.cpan.org:80 (Bad hostname)', '_request' => bless( { '_content' => 'query=libwww-perl&mode=dist', '_uri' => bless( do{(my $o = 'http://search.cpan.org/search')}, 'URI::http' ), '_headers' => bless( { 'user-agent' => 'MyApp/0.1 libwww-perl/6.05', 'content-type' => 'application/x-www-form-urlencoded' }, 'HTTP::Headers' ), '_method' => 'POST' }, 'HTTP::Request' ) }, 'HTTP::Response' );
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
でホスト名の検証は無効にできると思ったのですが。。
PERL_LWP_SSL_VERIFY_HOSTNAME は証明書に関連することで、
今回のエラーは...どうなんでしょう。接続できていないようなメッセージにも見えます。
プロキシ環境であったりしませんか?
他のホストへの接続は可能ですか?
手元で検証したところ(info_logという関数はなかったのでそこを削りましたが)うまく動いたように思います。(301 Moved Permanentlyが返ってくる)
他のホストへの接続もいろいろ試したのですが駄目でした…。
プロキシ環境ではありません。
ブラウザ上でperlを実行できるサイトにて動作確認したところ動きました。
自分の環境の何が邪魔しているのかわかれば良いのですが。。
> 他のホストへの接続もいろいろ試したのですが駄目
curlコマンドなどが使えて、そちらではOKでしょうか?
/data/powercms/ とあるので、推測ですが、tetsunosukeさんのコメントされている通りなにかプロキシ環境下か特殊なサイト(ホスティングされたところなど)でしょうか?
(完全自前の環境でなく、ホスティングやクラウドサービスの環境下なら、なにかドキュメントがあるのかもしれないかな?と思いました)
なるほど・・・。ブラウザ等ではもちろん接続できるんですよね。
そうなるとPerlのプログラムからのみアクセスできない、ということですか・・・。ちょっと思い当たる点がないですね。
同じようなこと言ってる人もいますが...
http://www.justskins.com/forums/bad-hostname-error-from-34320.html
suama さんの記載のように、動作させている環境から他の方法での接続ができるかどうか?については確認したいですね。
引き続き調査中ですが、
curlを使用するとhttpにはアクセスできるのですが
httpsのサイトにリクエストを投げると
「curl: (6) Could not resolve host: www~」と返されました。
suamaさんの言う通り、powercmsを使用しているためそちらのドキュメントも確認してみます。
curlやwgetのようなツールからも、httpsだけがうまくいかないと、サーバ?の問題な気もしますね。
curl -I -v --ipv4 https://search.cpan.org/ など、-vオプション(詳細)とか、--ipv4 とかで、もう少し詳細な情報が出るかもしれませんね。
(CPANのサイトだけでこうなるのか、他httpsなサイトは大丈夫かどうかも、一旦curlで念の為確認するといいかもしれません)
httpsサイトは他もダメでした。
curl -I -v --ipv4 https://search.cpan.org/ を実行すると
* Could not resolve host: search.cpan.org Name or service not known
* Closing connection 0
という結果が返されました
度々すみません。
どうやら「etc/resolv.conf」に「nameserver 8.8.8.8」を追記すれば良いみたいです。
現状、書き込み権限がないため後日試してみます。
上記試しましたが結局名前解決できないようです…
セットアップなどの際にはhttpsのサイトに接続するのはよくあるので、なにかプロキシを通しているのかなとは思いますが、ちょっとここまでで。
コマンドで env と入力した際に、環境変数にPROXY といった値のものが出ないでしょうか?
たとえば、OSの情報とか、クラウド上の環境(サーバ)なのか、お手元にあるPCからなのか、といったものがあるといいかも。
よくよく確認してみるとプロキシを通していました。
LWPにてプロキシを設定するソースを下記URLサイトと同じようにを追加したのですが、結果は変わらずでした。。
https://ragtarou.hatenadiary.org/entry/20070302/1172800749
proxyがやはり必要なのですね。curlでの実行のは、コマンドライン引数でプロキシを渡すか、環境変数で渡せば大丈夫でしたでしょうか。
Perlのコードに関しても、基本は環境変数を見に行ったりするとは思います。
環境がないので何ともためせませんが、こちらも参考になるでしょうか。
https://qiita.com/debug-ito/items/4b3fec645f15af9b4929
ありがとうございます。
貼って頂いた記事も試したのですが、
「名前またはサービスが不明です」というエラーが発生しています。
DNSの名前解決の問題かなと思っています。
プロキシサーバーに対するpingは通りますが、nslookupはタイムアウトします。
ネットワーク周りはほぼ知識がないのでざっくりとしか説明できません…。
curlでの実行でプロキシを設定した場合は大丈夫でしょうか?
とにかくこちらが前提になるので、こちらが大丈夫ならあとは設定次第かなと思います。
セットアップ時にはなんらかのhttpsのサイトからのリソースのダウンロードがあるはずなので、接続できなことはないと思いますが...。
あとはサーバ管理者様、インフラ周りの担当(サポート)の方に伺うといいかと思います。
このくらいで精一杯ですみません。
送信成功しました!
suamaさんの言う通り、プロキシの設定を細かく見ていたところ、
ソース内にプロキシ認証のユーザー名とパスワードを書くことで送信できました。
(力業ですが…)
つたない説明に対して明確な回答を頂きありがとうございました!!
よかったですね!こちらこそ回答側に書かずに失礼しました。

回答1件
あなたの回答
tips
プレビュー