用套接字隐藏GET变量

时间:2014-05-18 19:57:54

标签: perl http

我有一个脚本,我向页面发送GET请求。我试图弄清楚如何压制输出,这是代码本身:

use  IO::Socket;
my $domain = 'yahoo.com';

$socket=IO::Socket::INET->new(
                                Proto => 'tcp',
                                PeerAddr => $domain,
                                PeerPort => '80',
                                ) or return $!;
print $socket "GET /index.php HTTP/1.0\r\n";
print $socket "Host: ", $domain, "\r\n";
print $socket "Connection: close", "\r\n";
print $socket "User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)", "\r\n";
print $socket "Accept: text/html, application/xhtml+xml, */*", "\r\n\r\n";

print while <$socket>;

这是输出。

HTTP/1.0 200 OK
Server: nginx/1.4.7
Content-Type: text/html
X-Powered-By: PHP/5.4.27-1~dotdeb.0
Set-Cookie: PHPSESSID=k2bviiurukqdju1l26j4fat0q0; path=/
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Date: Sun, 18 May 2014 19:53:20 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
X-Page-Speed: 119_1_jt
X-XSS-Protection: 1; mode=block
Alternate-Protocol: 80:quic

Apache works!

如您所见,它显示了顶部的完整页面标题,我只想要页面输出。 我怎么能抑制服务器头的输出?并保留页面数据。

3 个答案:

答案 0 :(得分:2)

如果您只是尝试发出网络请求,那么使用http库几乎总是更好。

但是,对于这种特殊情况,以下内容也应该足够了。它只打印第一行后只有\r\n的所有内容,因为这是用于将标题与http协议中的内容分开的分隔符。

# The following line has been replaced with the loop
# print while <$socket>; 

$seennl = 0;
while (<$socket>) {
    if ($seennl) {
        print;
    }
    elsif ($_ eq "\r\n"){
        $seennl=1;
    }
}

答案 1 :(得分:1)

HTTP standard指定标题和内容由空行分隔。因此,您可以放弃所有内容,直到第一个空行:

my $print = 0;
while (<$socket>) {
    chomp;
    if ($print) {
        print $_, "\n";
    }
    elsif ($_ eq '') {
        $print = 1;
    }
}

如果你使用像LWP::UserAgent这样的模块,它会更容易,你会更好地处理特殊情况:

use LWA::UserAgent;
use HTTP::Request;
my $req = HTTP::Request->new( GET => 'http://yahoo.com/index.php' );
my $ua  = LWP::UserAgent->new;
my $res = $ua->request($req);
if ($res->is_success) {
    print $res->content, "\n";
}

答案 2 :(得分:0)

我肯定会建议您使用较重的模块,例如LWPMojo::UserAgent,而不是重新创建滚轮。在Mojocast Episode 5中,对后者有一段有用的8分钟视频介绍。

但是,因为HTTP的规范是用空行分隔标题,所以你可以在段落模式下进行初始读取以跳过标题:

# Skip Header
{
    local $/ = "";
    <$socket>;
}

print while (<$socket>);