LWP::useragent keep_alive не работает

Я использую приведенный ниже код для публикации данных JSON с помощью LWP::useragent. Я хочу оставить свой сеанс открытым и отправить два запроса, но кажется, что он не работает на Linux-машине (два запроса POST отправляются в двух сеансах вместо одного).

Какие-либо предложения? заранее спасибо

#!/usr/bin/perl

use warnings;
use LWP::UserAgent;
use HTTP::Request::Common;

open (JSON, "json3.txt") or die "$!";
$raw_string1 = do{ local $/ = undef; <JSON>; 
};



my $req = HTTP::Request->new(POST => 'http://www.example.com');


$hdr1 = 'User-Agent';
$val1 = 'Java/1.7.0_45';

$hdr2 = 'Connection';
$val2 = 'keep-alive';

$hdr3 = 'Accept';
$val3 = 'application/json, application/*+json';

$hdr4 = 'Host';
$val4 = 'example.com';

$hdr5 = 'Content-Type';
$val5 = 'application/json;charset=UTF-8';


$req -> header($hdr3 => $val3);
$req -> header($hdr5 => $val5);
$req -> header($hdr1 => $val1);
$req -> header($hdr4 => $val4);
$req -> header($hdr2 => $val2);



$req->content_type("application/json");

$req->content("$raw_string1");

my $ua = LWP::UserAgent->new(keep_alive => 1);
$res = $ua->request($req);
print $res->content;
$res = $ua->request($req);
print $res->content; 

person user2896215    schedule 23.07.2015    source источник
comment
Когда вы используете опцию keep_alive, тогда настраивается только LWP::ConnCache, который получает/устанавливает количество соединений, которые будут кэшироваться. Какую ошибку/ответ вы получаете при запуске этого скрипта?   -  person sandeep    schedule 23.07.2015


Ответы (2)


Keep-Alive просто рекомендует серверу не закрывать TCP-соединение после запроса, потому что их будет больше запросов. Серверу не нужно следовать этой рекомендации, и на самом деле многие серверы этого не делают, чтобы поддерживать низкое количество открытых TCP-соединений, которые все используют ресурсы в системе.

Кроме того, вам не нужно явно устанавливать заголовок Connection и Host.

Я попробовал следующий упрощенный пример, и перехват пакетов показывает, что поддержка активности работает, если сервер ее поддерживает (LWP 6.05). Поддержка означает, что сервер поддерживает соединение открытым и не устанавливает заголовок «Соединение: закрыть» и либо использует HTTP/1.1, либо использует HTTP/1.0 вместе с заголовком «Соединение: поддержание активности».

my $req = HTTP::Request->new(POST => 'http://www.example.com/');
$req->content_type("application/json");
$req->content("foo");

my $ua = LWP::UserAgent->new(keep_alive => 1);
$res = $ua->request($req);
print $res->content;
$res = $ua->request($req);
print $res->content;
person Steffen Ullrich    schedule 23.07.2015
comment
Я проверил захваты пакетов. это не внутренний сервер, который закрывает соединение, а клиент. - person user2896215; 23.07.2015
comment
Я попробовал упрощенный пример, и он работает. Вы уверены, что сервер не отвечает Connection: close или выдает ответ HTTP/1.0 (который неявно определяет Connection: close)? - person Steffen Ullrich; 23.07.2015
comment
это решено ... это было не из-за того, что внутренний сервер закрыл соединение. я думаю, что использовал старый Perl (5.10) со старой версией Fedora. Я запустил новый экземпляр CentOs, и он работает над ним. Спасибо! - person user2896215; 24.07.2015

это решено ... это было не из-за того, что внутренний сервер закрыл соединение. я думаю, что использовал старый Perl (5.10) со старой версией Fedora. Я запустил новый экземпляр CentOs, и он работает над ним. Спасибо

person user2896215    schedule 24.07.2015