HTTP: 重写http相关超时管理机制

This commit is contained in:
ziyue
2022-01-19 22:50:44 +08:00
parent 03a8d3a6ac
commit ee6ad66a6d
12 changed files with 155 additions and 97 deletions

View File

@@ -61,9 +61,8 @@ public:
/**
* 发送http[s]请求
* @param url 请求url
* @param timeout_sec 超时时间
*/
virtual void sendRequest(const string &url, float timeout_sec, float recv_timeout_sec = 3);
virtual void sendRequest(const string &url);
/**
* 重置对象
@@ -111,6 +110,30 @@ public:
*/
bool waitResponse() const;
/**
* 判断是否为https
*/
bool isHttps() const;
/**
* 设置从发起连接到接收header完毕的延时默认10秒
* 此参数必须大于0
*/
void setHeaderTimeout(size_t timeout_ms);
/**
* 设置接收body数据超时时间, 默认5秒
* 此参数可以用于处理超大body回复的超时问题
* 此参数可以等于0
*/
void setBodyTimeout(size_t timeout_ms);
/**
* 设置整个链接超时超时时间, 默认0
* 该值设置不为0后HeaderTimeout和BodyTimeout无效
*/
void setCompleteTimeout(size_t timeout_ms);
protected:
/**
* 收到http回复头
@@ -174,28 +197,34 @@ private:
void checkCookie(HttpHeader &headers);
void clearResponse();
protected:
bool _is_https;
private:
//for http response
bool _complete = false;
string _url;
HttpHeader _header;
HttpHeader _user_set_header;
HttpBody::Ptr _body;
string _method;
string _path;
string _last_host;
Ticker _recv_timeout_ticker;
Ticker _total_timeout_ticker;
float _timeout_second = 0;
float _recv_timeout_second = 0;
//recv
bool _header_recved = false;
size_t _recved_body_size;
ssize_t _total_body_size;
Parser _parser;
std::shared_ptr<HttpChunkedSplitter> _chunked_splitter;
//for request args
bool _is_https;
string _url;
HttpHeader _user_set_header;
HttpBody::Ptr _body;
string _method;
string _last_host;
//for this request
string _path;
HttpHeader _header;
//for timeout
size_t _wait_header_ms = 10 * 1000;
size_t _wait_body_ms = 10 * 1000;
size_t _wait_complete_ms = 0;
Ticker _wait_header;
Ticker _wait_body;
Ticker _wait_complete;
};
} /* namespace mediakit */