///|
/// Plan one response, taking uncombined Retry-After values. Zero fields means
/// no server minimum; multiple fields or unsupported syntax stop the retry.
/// now_seconds is wall time; elapsed_ms is monotonic elapsed time.
pub fn decide_response(
settings : Settings,
http_method~ : String,
status~ : Int,
retry_index~ : Int,
elapsed_ms~ : Int64,
body_replayable~ : Bool,
retry_after_values~ : Array[String],
now_seconds~ : Int64,
replay_safe? : Bool = false,
sample_ppm? : Int = 1000000,
) -> Decision {
// Preserve input, status, replay and attempt failures before parsing headers.
let baseline = decide(
settings,
http_method~,
status~,
retry_index~,
elapsed_ms~,
body_replayable~,
replay_safe~,
sample_ppm~,
)
match baseline {
Stop(_) => return baseline
Wait(_) => ()
}
let server_delay_ms = match retry_after_values {
[] => 0L
[value] =>
match retry_after_delay(value, now_seconds) {
Some(delay) => delay
None => return Stop(InvalidRetryAfter)
}
_ => return Stop(InvalidRetryAfter)
}
decide(
settings,
http_method~,
status~,
retry_index~,
elapsed_ms~,
body_replayable~,
replay_safe~,
sample_ppm~,
server_delay_ms~,
)
}