[HttpClientImpl] Remove the related request from the buffer if it's not sent after the timeout (#818)

This commit is contained in:
An Tao 2021-04-24 21:05:13 +08:00 committed by GitHub
parent b067771fa4
commit 87d8123276
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 27 additions and 15 deletions

View File

@ -1,6 +1,6 @@
/**
* HttpTypes.h
* An Tao
* @file HttpTypes.h
* @author An Tao
*
* Copyright 2018, An Tao. All rights reserved.
* https://github.com/an-tao/drogon
@ -138,7 +138,7 @@ enum HttpMethod
enum class ReqResult
{
Ok,
Ok = 0,
BadResponse,
NetworkFailure,
BadServerAddress,
@ -149,7 +149,7 @@ enum class ReqResult
enum class WebSocketMessageType
{
Text,
Text = 0,
Binary,
Ping,
Pong,

View File

@ -64,7 +64,7 @@ void HttpClientImpl::createTcpClient()
thisPtr->requestsBuffer_.front().first);
thisPtr->pipeliningCallbacks_.push(
std::move(thisPtr->requestsBuffer_.front()));
thisPtr->requestsBuffer_.pop();
thisPtr->requestsBuffer_.pop_front();
}
}
else
@ -276,12 +276,23 @@ void HttpClientImpl::sendRequestInLoop(const HttpRequestPtr &req,
auto timeoutFlag = std::make_shared<bool>(false);
auto callbackPtr =
std::make_shared<drogon::HttpReqCallback>(std::move(callback));
loop_->runAfter(timeout, [timeoutFlag, callbackPtr] {
auto thisPtr = shared_from_this();
loop_->runAfter(timeout, [timeoutFlag, callbackPtr, req, thisPtr] {
if (*timeoutFlag)
{
return;
}
*timeoutFlag = true;
for (auto iter = thisPtr->requestsBuffer_.begin();
iter != thisPtr->requestsBuffer_.end();
++iter)
{
if (iter->first == req)
{
thisPtr->requestsBuffer_.erase(iter);
break;
}
}
(*callbackPtr)(ReqResult::Timeout, nullptr);
});
sendRequestInLoop(req,
@ -346,7 +357,7 @@ void HttpClientImpl::sendRequestInLoop(const drogon::HttpRequestPtr &req,
if (!tcpClientPtr_)
{
requestsBuffer_.push(
requestsBuffer_.push_back(
{req,
[thisPtr = shared_from_this(),
callback = std::move(callback)](ReqResult result,
@ -406,7 +417,7 @@ void HttpClientImpl::sendRequestInLoop(const drogon::HttpRequestPtr &req,
(thisPtr->requestsBuffer_).front();
reqAndCb.second(ReqResult::BadServerAddress,
nullptr);
(thisPtr->requestsBuffer_).pop();
(thisPtr->requestsBuffer_).pop_front();
}
return;
}
@ -422,7 +433,7 @@ void HttpClientImpl::sendRequestInLoop(const drogon::HttpRequestPtr &req,
}
else
{
requestsBuffer_.pop();
requestsBuffer_.pop_front();
callback(ReqResult::BadServerAddress, nullptr);
assert(requestsBuffer_.empty());
return;
@ -449,7 +460,7 @@ void HttpClientImpl::sendRequestInLoop(const drogon::HttpRequestPtr &req,
}
else
{
requestsBuffer_.push(
requestsBuffer_.push_back(
{req,
[thisPtr, callback = std::move(callback)](
ReqResult result, const HttpResponsePtr &response) {
@ -459,7 +470,7 @@ void HttpClientImpl::sendRequestInLoop(const drogon::HttpRequestPtr &req,
}
else
{
requestsBuffer_.push(
requestsBuffer_.push_back(
{req,
[thisPtr, callback = std::move(callback)](
ReqResult result, const HttpResponsePtr &response) {
@ -520,7 +531,7 @@ void HttpClientImpl::handleResponse(
auto &reqAndCallback = requestsBuffer_.front();
sendReq(connPtr, reqAndCallback.first);
pipeliningCallbacks_.push(std::move(reqAndCallback));
requestsBuffer_.pop();
requestsBuffer_.pop_front();
}
else
{
@ -620,7 +631,7 @@ void HttpClientImpl::onError(ReqResult result)
while (!requestsBuffer_.empty())
{
auto cb = std::move(requestsBuffer_.front().second);
requestsBuffer_.pop();
requestsBuffer_.pop_front();
cb(result, nullptr);
}
tcpClientPtr_.reset();

View File

@ -22,6 +22,7 @@
#include <trantor/net/Resolver.h>
#include <mutex>
#include <queue>
#include <list>
#include <vector>
namespace drogon
@ -102,7 +103,7 @@ class HttpClientImpl final : public HttpClient,
const trantor::TcpConnectionPtr &connPtr);
void createTcpClient();
std::queue<std::pair<HttpRequestPtr, HttpReqCallback>> pipeliningCallbacks_;
std::queue<std::pair<HttpRequestPtr, HttpReqCallback>> requestsBuffer_;
std::list<std::pair<HttpRequestPtr, HttpReqCallback>> requestsBuffer_;
void onRecvMessage(const trantor::TcpConnectionPtr &, trantor::MsgBuffer *);
void onError(ReqResult result);
std::string domain_;

@ -1 +1 @@
Subproject commit a3cb939ef237b83b5bd8d9c87f1dec6899c54054
Subproject commit 5103ec795ed352713679922882ee7f5a4f93a938