Мне было любопытно. После небольшого количества экспериментов и просмотра источников Savon кажется, что ошибки транспортного уровня не обрабатываются и не переводятся в собственные типы исключений Savon, а выдаются «как есть», поэтому, если вам нужно обработать их, вы должны обработать выданные исключения базовой клиентской библиотекой HTTP.
Важно отметить, что Savon поддерживает несколько HTTP-клиентов на уровне абстракции httpi . По умолчанию он просто выбирает один из доступных, но если вам нужно обработать его исключения, вам не следует полагаться на автоматический выбор, а явно указать, какой HTTPI-адаптер следует использовать (например, HTTPI.adapter = :net_http
).
Приведенный ниже код можно использовать для проверки сценария тайм-аута с HTTPI-адаптером по вашему выбору.
Код для экспериментов
Сервер (написан на PHP, потому что не существует современных рабочих решений для написания такого простого и простого SOAP-сервера, как этот, без тонны шаблонного кода в Ruby ):
<?php
// simple SOAP server - run with 'php -S localhost:12312 name_of_this_file.php'
class SleepySoapServer
{
public function hello()
{
sleep(3600); // take an hour's nap before responding
return 'Hello, world!';
}
}
$options = array('uri' => 'http://localhost:12312/');
$server = new SoapServer(null, $options);
$server->setClass(SleepySoapServer::class);
$server->handle();
Клиент (с использованием Savon 2):
require 'savon'
HTTPI.adapter = :net_http # request Net::HTTP client from the standard library
uri = 'http://localhost:12312'
client = Savon.client do
endpoint uri
namespace uri
end
response = client.call :Hello
p response.body