Предел времени в Rust
Долгое ожидание ответа лучше ограничивать настройкой клиента. Если сервер или сеть не уложились в срок, отправка возвращает ошибку, а не объект ответа с кодом.
Срок задают при сборке клиента через строитель и длительность из стандартной библиотеки. Готовый клиент хранит предел для каждого запроса, пока его не заменят новым значением.
Соберем клиент с пределом в две секунды:
use std::time::Duration;
#[tokio::main]
async fn main() {
let client = match reqwest::Client::builder()
.timeout(Duration::from_secs(2))
.build()
{
Ok(c) => c,
Err(e) => {
println!("{}", e);
return;
}
};
let url = "https://example.com";
match client.get(url).send().await {
Ok(resp) => {
let code = resp.status().as_u16();
match resp.text().await {
Ok(body) => println!("{} {}", code, body.len()),
Err(e) => println!("{}", e),
}
}
Err(e) => println!("{}", e),
}
}
При доступном хосте ответ часто успевает прийти за две секунды. Если срок короче задержки, сработает ветка с текстом ошибки отправки, а не число из ответа сервера.
Очень короткий предел на том же адресе:
use std::time::Duration;
#[tokio::main]
async fn main() {
let client = match reqwest::Client::builder()
.timeout(Duration::from_millis(1))
.build()
{
Ok(c) => c,
Err(e) => {
println!("{}", e);
return;
}
};
let url = "https://example.com";
match client.get(url).send().await {
Ok(resp) => println!("{}", resp.status().as_u16()),
Err(e) => println!("stopped {}", e),
}
}
Дан адрес:
https://example.com
Соберите клиент с пределом три секунды, выполните запрос, выведите числовой код ответа или текст ошибки ожидания.
Скажите, где появится ошибка по времени: при сборке клиента или при отправке запроса, если сервер отвечает дольше заданного предела.
Дан адрес:
https://example.com
Запишите функцию с исходом сбоя библиотеки, которая создает клиент с пределом пять секунд и возвращает длину тела ответа. Разберите исход в главной функции.