Unverified Commit 5cf1bb19 authored by Dennis Jenkins's avatar Dennis Jenkins Committed by GitHub

Merge pull request #394 from knowledge4igor/fix_client_send_request_problem

Fix client send request problem (caused by connect and pop from queue order)
parents 981c3320 3c915ef9
...@@ -90,6 +90,11 @@ struct Connection : public std::enable_shared_from_this<Connection> { ...@@ -90,6 +90,11 @@ struct Connection : public std::enable_shared_from_this<Connection> {
std::chrono::milliseconds timeout, std::chrono::milliseconds timeout,
OnDone onDone); OnDone onDone);
Async::Promise<Response> asyncPerform(
const Http::Request& request,
std::chrono::milliseconds timeout,
OnDone onDone);
void performImpl( void performImpl(
const Http::Request& request, const Http::Request& request,
std::chrono::milliseconds timeout, std::chrono::milliseconds timeout,
......
...@@ -477,17 +477,23 @@ Connection::perform( ...@@ -477,17 +477,23 @@ Connection::perform(
std::chrono::milliseconds timeout, std::chrono::milliseconds timeout,
Connection::OnDone onDone) { Connection::OnDone onDone) {
return Async::Promise<Response>([=](Async::Resolver& resolve, Async::Rejection& reject) { return Async::Promise<Response>([=](Async::Resolver& resolve, Async::Rejection& reject) {
if (!isConnected()) { performImpl(request, timeout, std::move(resolve), std::move(reject), std::move(onDone));
requestsQueue.push( });
RequestData( }
std::move(resolve),
std::move(reject), Async::Promise<Response>
request, Connection::asyncPerform(
timeout, const Http::Request& request,
std::move(onDone))); std::chrono::milliseconds timeout,
} else { Connection::OnDone onDone) {
performImpl(request, timeout, std::move(resolve), std::move(reject), std::move(onDone)); return Async::Promise<Response>([=](Async::Resolver& resolve, Async::Rejection& reject) {
} requestsQueue.push(
RequestData(
std::move(resolve),
std::move(reject),
request,
timeout,
std::move(onDone)));
}); });
} }
...@@ -796,7 +802,12 @@ Client::doRequest( ...@@ -796,7 +802,12 @@ Client::doRequest(
} }
if (!conn->isConnected()) { if (!conn->isConnected()) {
auto res = conn->asyncPerform(request, timeout, [=]() {
pool.releaseConnection(conn);
processRequestQueue();
});
conn->connect(helpers::httpAddr(s.first)); conn->connect(helpers::httpAddr(s.first));
return res;
} }
return conn->perform(request, timeout, [=]() { return conn->perform(request, timeout, [=]() {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment