Я пытаюсь подключиться к веб-службе с помощью IO :: Socket :: INET (да, я знаю, что для этого есть много лучших модулей, но я не знаю, t имейте их и не могу добавить их, поэтому, пожалуйста, не предлагайте это), но я убираю время (я думаю, это то, что он делает), ожидая ответа.IO :: Тайм-аут сокета при получении ответа
Вот основная суть моего кода (я ранее заселить содержание со всеми соответствующими заголовками, и установить его, и т.д.):
$httpSock->print($content);
my @lines = $httpSock->getlines();
foreach my $line (@lines) {
print $line;
}
Оказывается, что мой запрос был сделан сразу, то его ждет около 2 минут, прежде чем отплевывать ответ. Если я изменить код, чтобы использовать сокеты recv
вместо getlines()
, аля:
$httpSock->recv($data, 1024);
Я получаю ответ сразу (хотя только первые 1024 символов). Я здесь что-то не так? Я использую достаточно позднюю версию IO :: Socket, которую autoflush
должен быть включен, но включение его явно не имеет никакого значения. Я мог бы, вероятно, просто продолжать чтение из сокета, пока не получил весь ответ, но это определенно беспорядочно, чем использование getlines()
или <$httpSock>
.
Заранее спасибо.
Да, это очень близко к тому, что у меня есть. Дальнейшее исследование заставляет меня поверить, что это вопрос EOF. Если я использую 'getline()' (в цикле), он захватывает все, кроме последней строки. Если я использую 'recv()', он получит все данные, кроме последнего бита. Это вообще помогает? – Morinar
Я также выполняю POST, а не HEAD или GET. Не уверен, что это имеет значение ... – Morinar
Ваш пример также работает для меня, однако, если вы меняете HTTP/1.0 на HTTP/1.1 (это то, что я использую), ваш пример зависает так же, как и мой. В чем разница между HTML/1.0 и HTML/1.1? – Morinar