Skip to content

Commit 39f3cf6

Browse files
committed
Merge branch 'development' of https://git01.codeplex.com/forks/kreuzerkrieg/casablancatimeout into timeout_pull_request
2 parents c489b06 + ff228c0 commit 39f3cf6

File tree

6 files changed

+56
-22
lines changed

6 files changed

+56
-22
lines changed

Release/include/cpprest/http_client.h

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -193,17 +193,27 @@ class http_client_config
193193
/// <returns>The timeout (in seconds) used for each send and receive operation on the client.</returns>
194194
utility::seconds timeout() const
195195
{
196-
return m_timeout;
197-
}
198-
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-
}
196+
return std::chrono::duration_cast<utility::seconds>(m_timeout);
197+
}
198+
199+
/// <summary>
200+
/// Get the timeout
201+
/// </summary>
202+
/// <returns>The timeout (in whatever duration) used for each send and receive operation on the client.</returns>
203+
template <class T>
204+
T timeout() const
205+
{
206+
return std::chrono::duration_cast<T>(m_timeout);
207+
}
208+
/// <summary>
209+
/// Set the timeout
210+
/// </summary>
211+
/// <param name="timeout">The timeout (duration from microseconds range and up) used for each send and receive operation on the client.</param>
212+
template <class T>
213+
void set_timeout(const T &timeout)
214+
{
215+
m_timeout = std::chrono::duration_cast<std::chrono::microseconds>(timeout);
216+
}
207217

208218
/// <summary>
209219
/// Get the client chunk size.
@@ -317,7 +327,7 @@ class http_client_config
317327
// Whether or not to guarantee ordering, i.e. only using one underlying TCP connection.
318328
bool m_guarantee_order;
319329

320-
utility::seconds m_timeout;
330+
std::chrono::microseconds m_timeout;
321331
size_t m_chunksize;
322332

323333
#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: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,13 @@ TEST_FIXTURE(uri_address, get_client_config)
172172

173173
const http_client_config& config2 = client.client_config();
174174
VERIFY_ARE_EQUAL(config2.timeout().count(), timeout.count());
175+
std::chrono::milliseconds milli_timeout = config2.timeout();
176+
VERIFY_ARE_EQUAL(milli_timeout.count(),
177+
std::chrono::duration_cast<std::chrono::milliseconds>(timeout).count());
178+
auto micro_timeout = config.timeout<std::chrono::microseconds>();
179+
VERIFY_ARE_EQUAL(micro_timeout.count(),
180+
std::chrono::duration_cast<std::chrono::microseconds>(timeout).count());
181+
175182
VERIFY_ARE_EQUAL(config2.chunksize(), 1024);
176183
}
177184

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,19 @@ TEST_FIXTURE(uri_address, request_timeout)
139139
#endif
140140
}
141141

142+
#ifdef _WIN32 // winhttp client
143+
TEST_FIXTURE(uri_address, winhttp_request_timeout)
144+
{
145+
test_http_server::scoped_server scoped(m_uri);
146+
http_client_config config;
147+
config.set_timeout(std::chrono::microseconds(500));
148+
149+
http_client client(m_uri, config);
150+
auto responseTask = client.request(methods::GET);
151+
VERIFY_THROWS_HTTP_ERROR_CODE(responseTask.get(), std::errc::timed_out);
152+
}
153+
#endif
154+
142155
TEST_FIXTURE(uri_address, invalid_method)
143156
{
144157
web::http::uri uri(U("http://www.bing.com/"));

0 commit comments

Comments
 (0)