Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions lib/context_dev/internal/transport/base_client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -335,17 +335,17 @@ def initialize(
private def retry_delay(headers, retry_count:)
# Non-standard extension
span = Float(headers["retry-after-ms"], exception: false)&.then { _1 / 1000 }
return span if span
return [span, 0.0].max if span

retry_header = headers["retry-after"]
return span if (span = Float(retry_header, exception: false))
return [span, 0.0].max if (span = Float(retry_header, exception: false))

span = retry_header&.then do
Time.httpdate(_1) - Time.now
rescue ArgumentError
nil
end
return span if span
return [span, 0.0].max if span

scale = retry_count**2
jitter = 1 - (0.25 * rand)
Expand Down
21 changes: 21 additions & 0 deletions test/context_dev/client_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,27 @@ def test_client_retry_after_date
assert_in_delta(10, Thread.current.thread_variable_get(:mock_sleep).last, 1.0)
end

def test_client_retry_after_past_date
time_now = Time.now

stub_request(:post, "http://localhost/web/scrape").to_return_json(
status: 500,
headers: {"retry-after" => (time_now - 60).httpdate},
body: {}
)

context_dev = ContextDev::Client.new(base_url: "http://localhost", api_key: "My API Key", max_retries: 1)

Thread.current.thread_variable_set(:time_now, time_now)
assert_raises(ContextDev::Errors::InternalServerError) do
context_dev.web.scrape(formats: {}, url: "https://example.com")
end
Thread.current.thread_variable_set(:time_now, nil)

assert_requested(:any, /./, times: 2)
assert_equal([0.0], Thread.current.thread_variable_get(:mock_sleep))
end

def test_client_retry_after_ms
stub_request(:post, "http://localhost/web/scrape").to_return_json(
status: 500,
Expand Down