Perl对HTTP客户端的顺序请求 - 响应

时间:2015-02-19 17:22:28

标签: perl sockets io

人们! 目前我需要维护一些脚本动物园。现在我需要从类似HTTP的服务器执行顺序请求 - 响应操作。原始脚本是一个请求响应任务,所以没有任何问题。但现在我需要发出3个不同的请求,解析响应并将它们存储到PostgreSQL中。但是,例如,我们认为我们将解决谷歌问题。

$socket = IO::Socket::INET->new(PeerAddr => "google.com:80", KeepAlive => 1);

$socket->write("GET / HTTP/1.1" . $EOL);
$socket->write("Connection: keep-alive" . $EOL);
$socket->write($EOL);
$socket->flush();

while($sockbuff = $socket->getline)
{
  print ("$sockbuff");
  $recvbuff = $recvbuff.$sockbuff;
}

print("- REQUEST 1 -\n");

$socket->write("GET / HTTP/1.1" . $EOL);

while($sockbuff = $socket->getline)
{
  print ("$sockbuff");
  $recvbuff = $recvbuff.$sockbuff;
}

但是,由于Connection:keep-alive指定,进程永远不会从第一个while(读)循环中退出,因此永远不会发送第二个请求,并且会等到线程被外部终止(我需要轮询大约350个这样的服务器,因此,整个过程是线程化的)。 另一方面,如果我强制套接字以非阻塞模式运行,我只得到第一行。 任何人都可以建议我如何在Perl中进行顺序写 - 读操作时记住,这是类似HTTP的协议。

2 个答案:

答案 0 :(得分:0)

根据评论,我建议您这样做很难。 Perl附带了一个名为LWP::UserAgent的可爱图书馆 - 它可以让您进行网络搜索。

使用LWP::UserAgent,您的代码如下所示:

#!/usr/bin/perl

use strict;
use warnings;
use LWP::UserAgent;

my $agent = LWP::UserAgent->new( keep_alive => 1 );
my $response = $agent->get('http://www.google.com');

if ( $response->is_success ) {
    print $response ->content();
}
else {
    print "Failed: ", $response->status_line(), "\n";
}

你可以非常简单地扩展到多个网址我确定:)。

答案 1 :(得分:0)

  

任何人都可以建议我如何在Perl中进行顺序写 - 读操作,记住这是类似HTTP的协议。

使用LWP :: UserAgent,Mojo :: UserAgent或类似模块。

如果你真的想自己做:

  • 阅读标准,例如RFC 2616(或更新的RFC7230..7235)。
  • 了解如何定义身体的长度。请留意Content-LengthTransfer-Encoding: chunked
  • 读取正文直到响应中定义的结尾,直到连接结束或直到停止为止。然后发送下一个请求,但请注意Connection标题中的任何信息,表明该连接将被关闭。
  

但是,例如,我们认为我们将解决谷歌问题。

更难,因为你必须在这里处理HTTPS,所以IO :: Socket :: INET不会帮助你。在这种情况下,您需要IO :: Socket :: SSL。