2010-11-25 4 views
4

У меня проблема с HTTP :: Response Объект Perl с удаленного сервера, который иногда возвращает ответ HTTP с дублированными заголовками Content-Length.Обнаружение дублированного заголовка в HTTP :: Response

Когда это происходит, если значение содержимого длина «43215», когда я прочитал значение заголовка с:

print ($response->header('Content-length')); 

результат является:

4321543215 

Как я могу определить, если заголовок дублируется и доступ к реальному значению?

ответ

11

Из тонкого руководства HTTP::Headers:

Многозначное поле будет возвращено в виде отдельных значений в контексте списка и будет конкатенации с «» в качестве разделителя в скалярном контексте.

и это контекст списка:

print ($response->header('Content-length')) 

Так, $response->header() возвращается как Content-length заголовки в виде списка и результат, по существу:

print join('', 43215, 43215) 

Вы можете использовать либо Kork-х $response->content_length() поднимите или зацепите все заголовки Content-length в массив и используйте первый в качестве длины:

my @lengths = $response->header('Content-length'); 
my $length = $lengths[0]; 

Если вы в конечном итоге получаете несколько заголовков Content-length, и они разные, а кто-то очень смущен.

1

Вы не можете обнаружить это, по крайней мере, не надежно. Разумеется, вы можете разделить значение заголовка посередине и попытаться выяснить, совпадает ли левое значение с правилом, но когда вы получили такие размеры, как 4444, вы не знаете, дублируется ли оно или нет. Единственный шанс исправить это - это зафиксировать его на восходящем сервере, который отправляет вам дублированные заголовки.

Вы могли бы, возможно, попытаться получить доступ к длине содержимого через свойство content_length:

$response->content_length 

Может быть, это известно из дублированных заголовков, но я не пробовал.

+0

Спасибо, он работает как шарм – ajgarlag 2010-11-25 19:50:58

+0

Прохладный, рад, что он сработал :) – 2010-11-25 19:53:55