2016-04-28 9 views
2

Я хочу, чтобы прочитать заголовки в HTTP или HTTPS запроса на мой PERL скрипт:Извлечение заголовки из HTTP запроса В Perl

#!/usr/bin/perl 
use LWP::UserAgent; 
my $ua = new LWP::UserAgent; 
my $url = "http://example.com/"; 
my $req = $ua->get("$url"); 

Я хочу извлечь заголовки данных из верхних Запроса таких как:

HTTP/1.1 200 OK 
Access-Control-Allow-Headers: accept, origin, content-type, content-length 
Access-Control-Allow-Methods: GET,PUT,POST,DELETE,OPTIONS 
Access-Control-Allow-Origin: * 
Content-Encoding: gzip 
Content-Type: application/javascript 
Date: Thu, 28 Apr 2016 01:43:01 GMT 
Etag: "779429019" 
Cookie: username=usrname; [email protected]$W0RD; 
X-Powered-By: adzerk bifrost/ 
x-served-by: engine-i-536776c8 

ответ

2

Обратите внимание, что ваш $req фактически ответ объект, а не запрос

Чтобы изучить все поля заголовка, вы ищете $resp->headers_as_string

Чтобы получить вывод, что вы показываете , вы бы это сделали

#!/usr/bin/perl 

use LWP::UserAgent; 

my $ua = new LWP::UserAgent; 
my $url = 'http://example.com/'; 

my $resp = $ua->get($url); 

print $resp->protocol, ' ', $resp->status_line, "\n"; 
print $resp->headers_as_string, "\n"; 
1

Если я что-то не понял, я не вижу вашей проблемы. Вы уже используете LWP::UserAgent, в котором говорится, что ->get возвращает объект HTTP::Respnse, по которому вы можете позвонить ->header, чтобы получить поля заголовков, как задокументировано here.

use v5.12; 
use warnings; 

use LWP::UserAgent; 
my $ua = new LWP::UserAgent; 
my $url = "http://github.com/"; 
my $res = $ua->get("$url"); 

say "Headers returned: ", join(", ", $res->header_field_names); 
say "With values:" ; 
say " $_: ", $res->header($_) for $res->header_field_names ; 

# Outputs 

# Headers returned: Content-Type, Client-Date, Client-Warning 
# With values: 
# Content-Type: text/plain 
# Client-Date: Thu, 28 Apr 2016 02:31:26 GMT 
# Client-Warning: Internal response 
0
#!/usr/bin/perl -l 
use strict; 
use warnings; 

use LWP::UserAgent; 

my $ua = new LWP::UserAgent; 
my $result = $ua->get("http://example.com/"); 
print $result; 
print "HTTP code: ".$result->code; 

$result не будет отвечать на обычный текст, но HTTP::Response object. Выход выше сценария:

HTTP::Response=HASH(0x23dbfc8) 
HTTP code: 200 

Этот объект имеет методы (как ->code, чтобы получить код состояния HTTP). В документации говорится (укороченный):

$ r-> заголовок ($ поле)

Это используется для получения значения заголовка и наследуется от HTTP::Headers через HTTP::Message. См. HTTP::Headers для получения дополнительной информации и другие аналогичные методы, которые могут использоваться для доступа к заголовкам.

HTTP::Headers сам имеет метод header_field_names:

$ h-> header_field_names

Возвращает список различных имен полей, присутствующих в заголовке . Имена полей имеют случай, предложенный спецификацией HTTP, и имена возвращаются в рекомендуемом порядке «Хорошая практика».

В скалярном контексте возвращают число различных имен полей.

Ваш сценарий может легко получить запрашиваемую информацию:

for my $header_name ($result->header_field_names) { 
    print $header_name.": ".$result->header($header_name); 
} 

который выводит:

Cache-Control: max-age=604800 
Connection: close 
Date: Thu, 28 Apr 2016 05:40:52 GMT 
ETag: "359670651+ident" 
Server: ECS (iad/182A) 
Vary: Accept-Encoding 
Content-Length: 1270 
Content-Type: text/html 
Expires: Thu, 05 May 2016 05:40:52 GMT 
Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT 
Client-Date: Thu, 28 Apr 2016 05:40:52 GMT 
Client-Peer: 2606:2800:220:1:248:1893:25c8:1946:80 
Client-Response-Num: 1 
Title: Example Domain 
X-Cache: HIT 
X-Ec-Custom-Error: 1 
X-Meta-Charset: utf-8 
X-Meta-Viewport: width=device-width, initial-scale=1 

$result->header($header_name) также полезно, чтобы получить одно значение заголовка для известного имени заголовка.Скажем, из хотят иметь ETag ответа:

print $result->header('ETag'); 

HTTP::Headers также имеет метод ->as_string, но он переписывается ->as_string методом из HTTP::Response. Но HTTP::Message имеет два решения:

$ MESS-> заголовки

Возвращает встроенный HTTP :: Headers объекта.

Вы могли ходить, хотя объекты, чтобы получить HTTP заголовки, как одну строку, делая

print $result->headers->as_string; 

, который выводит:

Cache-Control: max-age=604800 
Connection: close 
Date: Thu, 28 Apr 2016 05:47:54 GMT 
ETag: "359670651+ident" 
Server: ECS (iad/182A) 
Vary: Accept-Encoding 
Content-Length: 1270 
Content-Type: text/html 
Expires: Thu, 05 May 2016 05:47:54 GMT 
Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT 
Client-Date: Thu, 28 Apr 2016 05:47:54 GMT 
Client-Peer: 2606:2800:220:1:248:1893:25c8:1946:80 
Client-Response-Num: 1 
Title: Example Domain 
X-Cache: HIT 
X-Ec-Custom-Error: 1 
X-Meta-Charset: utf-8 
X-Meta-Viewport: width=device-width, initial-scale=1 

Второе решение:

$ бардак -> headers_as_string $ mess-> headers_as_string ($ eol)

Вызвать метод as_string() для заголовков сообщения.

Попробуйте

print $result->headers_as_string; 

и вы получите точно такой же результат, как и раньше.

Смежные вопросы