mirror of
https://github.com/drogonframework/drogon.git
synced 2025-09-22 00:00:33 -04:00
[HttpClientImpl] Remove the related request from the buffer if it's not sent after the timeout (#818)
This commit is contained in:
parent
b067771fa4
commit
87d8123276
@ -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,
|
||||
|
@ -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();
|
||||
|
@ -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_;
|
||||
|
2
trantor
2
trantor
@ -1 +1 @@
|
||||
Subproject commit a3cb939ef237b83b5bd8d9c87f1dec6899c54054
|
||||
Subproject commit 5103ec795ed352713679922882ee7f5a4f93a938
|
Loading…
x
Reference in New Issue
Block a user