从curl输出替换HTTP响应头状态

时间:2017-01-16 14:21:27

标签: regex perl perl-module perl-data-structures mod-perl

有没有办法在从curl命令获得响应后将HTTP/1.1 200状态替换为HTTP/1.1 500状态?

如果回复正文包含字符串Error retrieving data,则状态通常为HTTP/1.1 200。我需要将其更改为HTTP/1.1 500(内部服务器错误)

例如

#!/usr/bin/perl

my $curlvalue = `curl -vk http://myserver.com/test.html`;
$search_string = "Error retrieving data";

if ( $curlvalue =~ m/$search_string/isg ) {
  print $curlvalue;
  print "AFTER OUTPUT\n";
  $value =~ s/HTTP\/1.1 200/HTTP\/1.1 500/g;
}

print $curlvalue;

输出

perl test.pl**

** About to connect() to myserver.com (#0)
*   Trying 111.111.111.11... connected
* Connected to myserver.comt (11.111.111.11) port 80 (#0)
> GET /iis/mybroker/test.html HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1     Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: myserver.com
> Accept: */*
> 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                             Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:02 --:--:--     0   
< HTTP/1.1 200 OK
< Date: Mon, 16 Jan 2017 13:47:10 GMT
< Server: Apache
< X-Frame-Options: SAMEORIGIN
< Transfer-Encoding: chunked
< Content-Type: text/html; charset=ISO-8859-1
< 
{ [data not shown]
105   315    0   315    0     0    155      0 --:--:--  0:00:02 --:--:--   155*      Connection #0 to host myserver.com left intact
* Closing connection #0
<HTML>
<HEAD>
<TITLE>Error retrieving data (1000)</TITLE>
</HEAD>
<BODY>
<H1>Error retrieving data (1000)</H1>
</BODY>
</HTML>*

输出消息后未显示HTTP标头详细信息

<HTML>
<HEAD>
<TITLE>Error retrieving data (1000)</TITLE>
</HEAD>
<BODY>
<H1>Error retrieving data (1000)</H1>
</BODY>
</HTML>

2 个答案:

答案 0 :(得分:0)

你现在还没有回答4个小时的评论,所以这是一个疯狂的猜测

这是你的程序

#!/usr/bin/perl

my $curlvalue = `curl -vk http://myserver.com/test.html`;

$search_string = "Error retrieving data";

if ( $curlvalue =~ m/$search_string/isg ) {
  print $curlvalue;
  print "AFTER OUTPUT\n";
  $value =~ s/HTTP\/1.1 200/HTTP\/1.1 500/g;
}

print $curlvalue;

顶部既没有use strict也没有use warnings 'all',这对于任何Perl程序都是必不可少的,特别是如果你正在寻求帮助。

我的猜测是,您希望curl的完整输出,并且您正在尝试编写过滤器,这将修改特定的报告状态案例。是吗?

如果是,那么问题是你的替换线

$value =~ s/HTTP\/1.1 200/HTTP\/1.1 500/g;

由于没有$value变量,此行无效。你可能想要$curlvalue,我会使用不同的分隔符来避免所有这些转义

也不需要/g修饰符,也不需要其他各种内容,所以我认为你的代码应该是这样的

#!/usr/bin/perl

use strict;
use warnings 'all';

my $curlvalue = `curl -v http://myserver.com/test.html`;

my $search = "Error retrieving data";

if ( $curlvalue =~ /$search/i ) {

    print "BEFORE CHANGES\n";
    print $curlvalue;

    $curlvalue =~ s|HTTP/1.1 200|HTTP/1.1 500|;
}

print "AFTER CHANGES\n";
print $curlvalue;

答案 1 :(得分:-1)

你不应该使用cURL;有基于LWP的Perl模块。

在您的示例中,您尝试匹配字符串,然后在字符串匹配时将状态代码从200替换为500。 HTML不应该与正则表达式匹配。相反,你应该使用一个DOM解析器,它也可以轻松处理嵌套标签。

根据RFC,HTTP 200仅用于成功请求,因此API不符合标准。

您可以使用以下代码执行此操作:

template.html

<HTML>
<HEAD>
<TITLE>Error retrieving data (1000)</TITLE>
</HEAD>
<BODY>
<H1>Error retrieving data (1000)</H1>
</BODY>
</HTML>

Perl代码

use strict;
use warnings;

use Mojo::UserAgent;

use feature 'say';

my $ua = Mojo::UserAgent->new;
my $response = $ua->get("http://myserver.com/iis/mybroker/test.html")->res->dom->at('h1')->text;
say $response eq "Error retrieving data (1000)" ? "Status code should be 500" : "Status code 200 is correct";