Skip to content

Commit 118243b

Browse files
committed
change http client timeout to support microseconds
1 parent 9651b67 commit 118243b

File tree

5 files changed

+27
-21
lines changed

5 files changed

+27
-21
lines changed

Release/include/cpprest/http_client.h

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -191,19 +191,20 @@ class http_client_config
191191
/// Get the timeout
192192
/// </summary>
193193
/// <returns>The timeout (in seconds) used for each send and receive operation on the client.</returns>
194-
utility::seconds timeout() const
194+
const auto& timeout() const
195195
{
196196
return m_timeout;
197197
}
198198

199-
/// <summary>
200-
/// Set the timeout
201-
/// </summary>
202-
/// <param name="timeout">The timeout (in seconds) used for each send and receive operation on the client.</param>
203-
void set_timeout(const utility::seconds &timeout)
204-
{
205-
m_timeout = timeout;
206-
}
199+
/// <summary>
200+
/// Set the timeout
201+
/// </summary>
202+
/// <param name="timeout">The timeout (duration from microseconds range and up) used for each send and receive operation on the client.</param>
203+
template <class T>
204+
void set_timeout(const T &timeout)
205+
{
206+
m_timeout = std::chrono::duration_cast<std::chrono::microseconds>(timeout);
207+
}
207208

208209
/// <summary>
209210
/// Get the client chunk size.
@@ -317,7 +318,7 @@ class http_client_config
317318
// Whether or not to guarantee ordering, i.e. only using one underlying TCP connection.
318319
bool m_guarantee_order;
319320

320-
utility::seconds m_timeout;
321+
std::chrono::microseconds m_timeout;
321322
size_t m_chunksize;
322323

323324
#if !defined(__cplusplus_winrt)

Release/src/http/client/http_client_asio.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ class asio_context : public request_context, public std::enable_shared_from_this
329329
: request_context(client, request)
330330
, m_content_length(0)
331331
, m_needChunked(false)
332-
, m_timer(static_cast<int>(client->client_config().timeout().count()))
332+
, m_timer(client->client_config().timeout())
333333
, m_connection(connection)
334334
#if defined(__APPLE__) || (defined(ANDROID) || defined(__ANDROID__))
335335
, m_openssl_failed(false)
@@ -1059,8 +1059,8 @@ class asio_context : public request_context, public std::enable_shared_from_this
10591059
{
10601060
public:
10611061

1062-
timeout_timer(int seconds) :
1063-
m_duration(boost::posix_time::milliseconds(seconds * 1000)),
1062+
timeout_timer(const std::chrono::microseconds& timeout) :
1063+
m_duration(timeout),
10641064
m_state(created),
10651065
m_timer(crossplat::threadpool::shared_instance().service())
10661066
{}
@@ -1131,10 +1131,10 @@ class asio_context : public request_context, public std::enable_shared_from_this
11311131
timedout
11321132
};
11331133

1134-
boost::posix_time::milliseconds m_duration;
1134+
std::chrono::microseconds m_duration;
11351135
timer_state m_state;
11361136
std::weak_ptr<asio_context> m_ctx;
1137-
boost::asio::deadline_timer m_timer;
1137+
boost::asio::steady_timer m_timer;
11381138
};
11391139

11401140
uint64_t m_content_length;

Release/src/http/client/http_client_winhttp.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -395,8 +395,10 @@ class winhttp_client : public _http_client_communicator
395395
}
396396

397397
// Set timeouts.
398-
const auto timeout = config.timeout();
399-
const int milliseconds = 1000 * static_cast<int>(timeout.count());
398+
int milliseconds = static_cast<int>(
399+
std::chrono::duration_cast<std::chrono::milliseconds>(config.timeout()).count()
400+
);
401+
milliseconds = std::max<decltype(milliseconds)>(milliseconds, 1);
400402
if(!WinHttpSetTimeouts(m_hSession,
401403
milliseconds,
402404
milliseconds,

Release/src/http/client/http_client_winrt.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -463,9 +463,11 @@ class winrt_client : public _http_client_communicator
463463
}
464464

465465
// Set timeout.
466-
const auto timeout = config.timeout();
467-
const int secs = static_cast<int>(timeout.count());
468-
hr = winrt_context->m_hRequest->SetProperty(XHR_PROP_TIMEOUT, secs * 1000);
466+
ULONGLONG timeout = static_cast<ULONGLONG>(
467+
std::chrono::duration_cast<std::chrono::milliseconds>(config.timeout()).count()
468+
);
469+
timeout = std::max<decltype(timeout)>(timeout, std::numeric_limits<decltype(timeout)>::min() + 1);
470+
hr = winrt_context->m_hRequest->SetProperty(XHR_PROP_TIMEOUT, timeout);
469471
if (FAILED(hr))
470472
{
471473
request->report_error(hr, L"Failure to set HTTP request properties");

Release/tests/functional/http/client/client_construction.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,8 @@ TEST_FIXTURE(uri_address, get_client_config)
171171
http_client client(m_uri, config);
172172

173173
const http_client_config& config2 = client.client_config();
174-
VERIFY_ARE_EQUAL(config2.timeout().count(), timeout.count());
174+
VERIFY_ARE_EQUAL(std::chrono::duration_cast<decltype(timeout)>(config2.timeout()).count(),
175+
timeout.count());
175176
VERIFY_ARE_EQUAL(config2.chunksize(), 1024);
176177
}
177178

0 commit comments

Comments
 (0)