有没有办法在从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>
答案 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不符合标准。
您可以使用以下代码执行此操作:
<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";