修复multimap导致重复http头的bug

This commit is contained in:
xiongziliang 2019-06-13 18:39:57 +08:00
parent 477606d90c
commit e365824be2
3 changed files with 28 additions and 14 deletions

View File

@ -69,17 +69,16 @@ void HttpClient::sendRequest(const string &strUrl, float fTimeOutSec) {
//服务器域名 //服务器域名
host = FindField(host.data(), NULL, ":"); host = FindField(host.data(), NULL, ":");
} }
_header.emplace(string("Host"), host); _header.emplace("Host", host);
_header.emplace(string("Tools"), "ZLMediaKit"); _header.emplace("Tools", "ZLMediaKit");
_header.emplace(string("Connection"), "keep-alive"); _header.emplace("Connection", "keep-alive");
_header.emplace(string("Accept"), "*/*"); _header.emplace("Accept", "*/*");
_header.emplace(string("Accept-Language"), "zh-CN,zh;q=0.8"); _header.emplace("Accept-Language", "zh-CN,zh;q=0.8");
_header.emplace(string("User-Agent"), _header.emplace("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36");
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36");
if (_body && _body->remainSize()) { if (_body && _body->remainSize()) {
_header.emplace(string("Content-Length"), to_string(_body->remainSize())); _header.emplace("Content-Length", to_string(_body->remainSize()));
_header.emplace(string("Content-Type"), "application/x-www-form-urlencoded; charset=UTF-8"); _header.emplace("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
} }
bool bChanged = (_lastHost != host + ":" + to_string(port)) || (_isHttps != isHttps); bool bChanged = (_lastHost != host + ":" + to_string(port)) || (_isHttps != isHttps);
@ -94,7 +93,7 @@ void HttpClient::sendRequest(const string &strUrl, float fTimeOutSec) {
} }
if(!printer.empty()){ if(!printer.empty()){
printer.pop_back(); printer.pop_back();
_header.emplace(string("Cookie"), printer); _header.emplace("Cookie", printer);
} }

View File

@ -125,15 +125,30 @@ struct StrCaseCompare {
class StrCaseMap : public multimap<string, string, StrCaseCompare>{ class StrCaseMap : public multimap<string, string, StrCaseCompare>{
public: public:
typedef multimap<string, string, StrCaseCompare> Super ;
StrCaseMap() = default; StrCaseMap() = default;
~StrCaseMap() = default; ~StrCaseMap() = default;
string &operator[](const string &key){ string &operator[](const string &key){
auto it = find(key); auto it = find(key);
if(it == end()){ if(it == end()){
it = emplace(key,""); it = Super::emplace(key,"");
} }
return it->second; return it->second;
} }
template <class K,class V>
void emplace(K &&k , V &&v) {
auto it = find(k);
if(it != end()){
return;
}
Super::emplace(std::forward<K>(k),std::forward<V>(v));
}
template <class K,class V>
void emplace_force(K &&k , V &&v) {
Super::emplace(std::forward<K>(k),std::forward<V>(v));
}
}; };
class Parser { class Parser {
@ -167,7 +182,7 @@ public:
auto field = FindField(line.data(), NULL, ": "); auto field = FindField(line.data(), NULL, ": ");
auto value = FindField(line.data(), ": ", NULL); auto value = FindField(line.data(), ": ", NULL);
if (field.size() != 0) { if (field.size() != 0) {
_mapHeaders.emplace(field,value); _mapHeaders.emplace_force(field,value);
} }
} }
start = start + line.size() + 2; start = start + line.size() + 2;
@ -247,7 +262,7 @@ public:
for (string &key_val : arg_vec) { for (string &key_val : arg_vec) {
auto key = FindField(key_val.data(), NULL, key_delim); auto key = FindField(key_val.data(), NULL, key_delim);
auto val = FindField(key_val.data(), key_delim, NULL); auto val = FindField(key_val.data(), key_delim, NULL);
ret.emplace(key,val); ret.emplace_force(key,val);
} }
return ret; return ret;
} }