簡體   English   中英

從curl輸出替換HTTP響應標頭狀態

[英]Replace HTTP response header status from curl output

從curl命令獲得響應后,是否可以用HTTP/1.1 500狀態替換HTTP/1.1 200狀態?

如果響應的主體包含字符串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>

您已經四個小時沒有回答評論了,所以這是一個瘋狂的猜測

這是你的程序

#!/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'也沒有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;

您不應該使用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";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM