2014-02-13 2 views
0

Я взял над собой код perl и попросил добавить заголовок keep-alive в сообщение LWP, которое происходит.Добавление заголовков в сообщение LWP в Perl

Google сообщает мне, как это сделать для определенных настроек, но я не вижу, как это сделать для того, как этот код был написан. Вся информация, которую я могу найти, работает на основе создания объекта LWP, затем создает POST и параметры, а затем добавляет заголовки, а затем фактически POSTING запрос, однако в коде, с которым мне приходится иметь дело, создание POST, добавление заголовков и отправки все в одной строке:

my $ua = LWP::UserAgent->new; 
my $response = $ua->post($URL, ['parm1'=>'val1']); 

Как/где я могу добавить заголовки в этой установке, или мне нужно переписать, как в примерах, которые я нашел?

+0

Я бы предложил переписать. Таким образом, он будет более ремонтопригодным, и вы можете добавить любой уровень контроля, который вы хотите. – abiessu

+0

Если я могу этого избежать, я бы предпочел - код был стабильным на некоторое время и в течение следующих шести месяцев будет полностью заменен новой системой - мне просто попросили добавить этот заголовок, чтобы ускорить работу в промежуточные и не хотят рисковать новыми проблемами, переписывая, если это возможно! –

ответ

2

На странице LWP::UserAgent рассказывается, как это сделать. Вы должны установить обработчик request_prepare на объект агента пользователя. Это передаст вам в запрос объект, прежде чем он опубликует.

На самом деле, все, что вы положили в список пар ключ-значение до ключа 'Content' с последующей структурой, которую вы хотите отправить, будет переводить в заголовки, в HTTP::Request::Common::POST

$ua->post($URL, keep_alive => 1, Content => ['parm1'=>'val1']); 

Или без тега контента , если вы поставите структуру первой, вы можете поместить пары заголовка ключа-значение после того, как:

$ua->post($URL, ['parm1'=>'val1'], keep_alive => 1); 
+0

Это неправильно. добавление keep_alive => 1 делает только заголовок Keep-Alive: 1, который не имеет ничего общего с постоянными соединениями, где он должен делать «Connection: keep-alive». Просто сделайте tcpdump, и вы увидите, что каждый HTTP-запрос выполняет свое собственное TCP-соединение, вопреки тому, что нужно делать. –

1

ли они на самом деле просили вас, чтобы добавить только заголовок Keep-Alive, или же они просят вас поддержать поддерживать, например, несколько HTTP-запросов в одном TCP-соединении. В последнем случае вы должны использовать (в соответствии с документацией LWP :: UserAgent):

my $ua = LWP::UserAgent->new(keep_alive => 10); 
$ua->get('http://foo.bar/page1'); 
$ua->get('http://foo.bar/page2'); # reuses connection from previous request 

В этом случае он будет держать не более 10 открытых соединений одновременно. Если вы только делаете запросы на одном и том же сайте, вы также можете установить его в 1, чтобы он повторно использовал одно и то же TCP-соединение для всех запросов.

Заголовок Keep-Alive не имеет значения, то, что keep_alive => 1 в пользовательском агенте, устанавливает кеш подключений и добавляет заголовок «Connection: keep-alive» (с поддержкой HTTP/1.1 keep-alive является имплицитом , поэтому нет необходимости добавлять заголовок для запросов HTTP/1.1).

+0

Они попросили меня добавить заголовок keep-alive. Я понятия не имею, хотят ли они поддерживать поддержку, но, следуя совету @Axeman, кажется, что это быстрее. Я спрошу их, если они на самом деле означают это :) –

+0

Нет, @Axeman ошибается. Просто сделайте tcpdump, и вы увидите, что он не повторно использует TCP-соединение для нескольких запросов. –

+0

ok, @Axeman на самом деле не так. Его код добавляет заголовок Keep-Alive, который вы просили, но это, вероятно, не та задача, которую они вам дали (например, повторное использование соединений с keep-alive). Все, что он делает, это добавить заголовок, который никто не использует. –

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