Skip to content

Commit 489d21b

Browse files
committed
Yield an error when polling times out
1 parent dc82c26 commit 489d21b

File tree

2 files changed

+13
-6
lines changed

2 files changed

+13
-6
lines changed

src/order.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -164,13 +164,14 @@ impl Order {
164164

165165
/// Poll the order with the given [`RetryPolicy`]
166166
///
167-
/// Yields the [`OrderStatus`] immediately if `Ready` or `Invalid`, or after `tries` attempts.
167+
/// Yields the [`OrderStatus`] immediately if `Ready` or `Invalid`, or yields an
168+
/// [`Error::Timeout`] if the [`RetryPolicy::timeout`] has been reached.
168169
pub async fn poll(&mut self, retries: &RetryPolicy) -> Result<OrderStatus, Error> {
169170
let mut retrying = retries.state();
170171
self.retry_after = None;
171172
loop {
172-
if let ControlFlow::Break(()) = retrying.wait(self.retry_after.take()).await {
173-
return Ok(self.state.status);
173+
if let ControlFlow::Break(err) = retrying.wait(self.retry_after.take()).await {
174+
return Err(err);
174175
}
175176

176177
let state = self.refresh().await?;
@@ -564,13 +565,13 @@ struct RetryState {
564565
}
565566

566567
impl RetryState {
567-
async fn wait(&mut self, after: Option<SystemTime>) -> ControlFlow<(), ()> {
568+
async fn wait(&mut self, after: Option<SystemTime>) -> ControlFlow<Error, ()> {
568569
if let Some(after) = after {
569570
let now = SystemTime::now();
570571
if let Ok(delay) = after.duration_since(now) {
571572
let next = Instant::now() + delay;
572573
if next > self.deadline {
573-
return ControlFlow::Break(());
574+
return ControlFlow::Break(Error::Timeout(Some(next)));
574575
} else {
575576
sleep(delay).await;
576577
return ControlFlow::Continue(());
@@ -581,7 +582,7 @@ impl RetryState {
581582
sleep(self.delay).await;
582583
self.delay = self.delay.mul_f32(self.backoff);
583584
match Instant::now() + self.delay > self.deadline {
584-
true => ControlFlow::Break(()),
585+
true => ControlFlow::Break(Error::Timeout(None)),
585586
false => ControlFlow::Continue(()),
586587
}
587588
}

src/types.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use std::borrow::Cow;
22
use std::collections::HashMap;
33
use std::fmt::{self, Write};
44
use std::net::IpAddr;
5+
use std::time::Instant;
56

67
use base64::prelude::{BASE64_URL_SAFE_NO_PAD, Engine};
78
use bytes::Bytes;
@@ -51,6 +52,11 @@ pub enum Error {
5152
/// Failed to (de)serialize a JSON object
5253
#[error("failed to (de)serialize JSON: {0}")]
5354
Json(#[from] serde_json::Error),
55+
/// Timed out while waiting for the server to update [`OrderStatus`]
56+
///
57+
/// If `Some`, the nested `Instant` indicates when the server suggests to poll next.
58+
#[error("timed out waiting for an order update")]
59+
Timeout(Option<Instant>),
5460
/// ACME server does not support a requested feature
5561
#[error("ACME server does not support: {0}")]
5662
Unsupported(&'static str),

0 commit comments

Comments
 (0)