ZLMediaKit/src/Http/HttpClient.h

203 lines
5.0 KiB
C++
Raw Normal View History

2017-10-09 22:11:01 +08:00
/*
2020-04-04 20:30:09 +08:00
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
2017-09-27 16:20:30 +08:00
*
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
2017-09-27 16:20:30 +08:00
*
2020-04-04 20:30:09 +08:00
* Use of this source code is governed by MIT license that can be found in the
* LICENSE file in the root of the source tree. All contributing project authors
* may be found in the AUTHORS file in the root of the source tree.
2017-09-27 16:20:30 +08:00
*/
2017-05-05 18:02:54 +08:00
#ifndef Http_HttpClient_h
#define Http_HttpClient_h
#include <stdio.h>
2017-05-05 18:02:54 +08:00
#include <string.h>
#include <functional>
#include <memory>
#include "Util/util.h"
2019-06-28 16:48:02 +08:00
#include "Util/mini.h"
2017-05-05 18:02:54 +08:00
#include "Network/TcpClient.h"
2019-06-28 16:48:02 +08:00
#include "Common/Parser.h"
2018-09-23 21:10:17 +08:00
#include "HttpRequestSplitter.h"
#include "HttpCookie.h"
#include "HttpChunkedSplitter.h"
2019-05-20 16:26:04 +08:00
#include "strCoding.h"
#include "HttpBody.h"
2021-09-30 16:10:09 +08:00
2017-05-05 18:02:54 +08:00
using namespace std;
2018-10-24 17:17:55 +08:00
using namespace toolkit;
2017-05-05 18:02:54 +08:00
2018-10-24 17:17:55 +08:00
namespace mediakit {
2017-05-05 18:02:54 +08:00
2021-09-30 16:10:09 +08:00
class HttpArgs : public map<string, variant, StrCaseCompare> {
2017-05-05 18:02:54 +08:00
public:
2021-09-30 16:10:09 +08:00
HttpArgs() = default;
~HttpArgs() = default;
2017-05-05 18:02:54 +08:00
string make() const {
string ret;
2021-09-30 16:10:09 +08:00
for (auto &pr : *this) {
2017-05-05 18:02:54 +08:00
ret.append(pr.first);
ret.append("=");
2019-05-27 12:13:27 +08:00
ret.append(strCoding::UrlEncode(pr.second));
2017-05-05 18:02:54 +08:00
ret.append("&");
}
2021-09-30 16:10:09 +08:00
if (ret.size()) {
2017-05-05 18:02:54 +08:00
ret.pop_back();
}
return ret;
}
};
2021-09-30 16:10:09 +08:00
class HttpClient : public TcpClient, public HttpRequestSplitter {
2017-05-05 18:02:54 +08:00
public:
2021-09-30 16:10:09 +08:00
using HttpHeader = StrCaseMap;
using Ptr = std::shared_ptr<HttpClient>;
2019-01-03 15:05:52 +08:00
2021-09-30 16:10:09 +08:00
HttpClient() = default;
~HttpClient() override = default;
/**
* http[s]
* @param url url
* @param timeout_sec
2021-09-30 16:10:09 +08:00
*/
2022-01-04 15:32:59 +08:00
virtual void sendRequest(const string &url, float timeout_sec, float recv_timeout_sec = 3);
2021-09-30 16:10:09 +08:00
/**
*
*/
virtual void clear();
/**
* http方法
* @param method GET/POST等
*/
void setMethod(string method);
/**
* http头
* @param header
*/
void setHeader(HttpHeader header);
HttpClient &addHeader(string key, string val, bool force = false);
/**
* http content
* @param body http content
*/
void setBody(string body);
/**
* http content
* @param body http content
*/
void setBody(HttpBody::Ptr body);
/**
*
*/
const Parser &response() const;
/**
* url
*/
const string &getUrl() const;
2019-07-01 18:35:26 +08:00
/**
*
*/
bool waitResponse() const;
2017-05-05 18:02:54 +08:00
protected:
2018-09-23 21:10:17 +08:00
/**
* http回复头
* @param status :200 OK
* @param headers http头
* @return content的长度-1:content>=0:content
* http头中带有Content-Length字段时
2018-09-23 21:10:17 +08:00
*/
2021-09-30 16:10:09 +08:00
virtual ssize_t onResponseHeader(const string &status, const HttpHeader &headers) {
//无Content-Length字段时默认后面全是content
return -1;
2021-01-19 16:05:38 +08:00
}
2018-09-23 21:10:17 +08:00
/**
* http conten数据
* @param buf
* @param size
* @param recvedSize (),totalSize时将触发onResponseCompleted回调
* @param totalSize
*/
2021-01-19 16:05:38 +08:00
virtual void onResponseBody(const char *buf, size_t size, size_t recvedSize, size_t totalSize) {
DebugL << size << " " << recvedSize << " " << totalSize;
}
2018-09-23 21:10:17 +08:00
/**
2018-11-13 17:59:12 +08:00
* http回复完毕,
2018-09-23 21:10:17 +08:00
*/
2021-09-30 16:10:09 +08:00
virtual void onResponseCompleted() {
2020-03-20 11:51:24 +08:00
DebugL;
2017-05-05 18:02:54 +08:00
}
2018-09-23 21:10:17 +08:00
/**
* http链接断开回调
* @param ex
*/
2021-09-30 16:10:09 +08:00
virtual void onDisconnect(const SockException &ex) {}
2018-09-23 21:10:17 +08:00
2019-07-01 20:55:31 +08:00
/**
*
* @param url url
* @param temporary
* @return
*/
2021-09-30 16:10:09 +08:00
virtual bool onRedirectUrl(const string &url, bool temporary) { return true; };
2019-07-01 20:55:31 +08:00
2021-09-30 16:10:09 +08:00
//// HttpRequestSplitter override ////
ssize_t onRecvHeader(const char *data, size_t len) override;
void onRecvContent(const char *data, size_t len) override;
protected:
2021-09-30 16:10:09 +08:00
//// TcpClient override ////
void onConnect(const SockException &ex) override;
void onRecv(const Buffer::Ptr &pBuf) override;
void onErr(const SockException &ex) override;
void onFlush() override;
void onManager() override;
2018-09-23 21:10:17 +08:00
private:
void onResponseCompleted_l();
void onConnect_l(const SockException &ex);
2021-09-30 16:10:09 +08:00
void checkCookie(HttpHeader &headers);
void clearResponse();
protected:
bool _is_https;
private:
bool _complete = false;
2019-07-01 18:35:26 +08:00
string _url;
2017-05-05 18:02:54 +08:00
HttpHeader _header;
HttpBody::Ptr _body;
2017-05-05 18:02:54 +08:00
string _method;
string _path;
string _last_host;
Ticker _recv_timeout_ticker;
Ticker _total_timeout_ticker;
float _timeout_second = 0;
2022-01-09 15:12:23 +08:00
float _recv_timeout_second = 0;
2017-05-05 18:02:54 +08:00
//recv
size_t _recved_body_size;
ssize_t _total_body_size;
2017-05-05 18:02:54 +08:00
Parser _parser;
std::shared_ptr<HttpChunkedSplitter> _chunked_splitter;
2017-05-05 18:02:54 +08:00
};
2018-10-24 17:17:55 +08:00
} /* namespace mediakit */
2017-05-05 18:02:54 +08:00
#endif /* Http_HttpClient_h */