HTTP::Parser: Content length fix, made ::GetHeader and ::hasHeader case-insensitive, preferring identical case if it is present.
This commit is contained in:
parent
4ed5dd21e3
commit
c1c35c75f9
1 changed files with 20 additions and 14 deletions
|
@ -8,6 +8,7 @@
|
|||
#include "timing.h"
|
||||
#include "url.h"
|
||||
#include "util.h"
|
||||
#include <strings.h>
|
||||
#include <iomanip>
|
||||
|
||||
/// This constructor creates an empty HTTP::Parser, ready for use for either reading or writing.
|
||||
|
@ -412,17 +413,28 @@ std::string HTTP::Parser::getUrl(){
|
|||
|
||||
/// Returns header i, if set.
|
||||
const std::string &HTTP::Parser::GetHeader(const std::string &i) const{
|
||||
if (headers.count(i)){
|
||||
return headers.at(i);
|
||||
}else{
|
||||
if (headers.count(i)){return headers.at(i);}
|
||||
for (std::map<std::string, std::string>::const_iterator it = headers.begin(); it != headers.end(); ++it){
|
||||
if (it->first.length() != i.length()){continue;}
|
||||
if (strncasecmp(it->first.c_str(), i.c_str(), i.length()) == 0){
|
||||
return it->second;
|
||||
}
|
||||
}
|
||||
//Return empty string if not found
|
||||
static const std::string empty;
|
||||
return empty;
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns header i, if set.
|
||||
bool HTTP::Parser::hasHeader(const std::string &i) const{
|
||||
return headers.count(i);
|
||||
if (headers.count(i)){return true;}
|
||||
for (std::map<std::string, std::string>::const_iterator it = headers.begin(); it != headers.end(); ++it){
|
||||
if (it->first.length() != i.length()){continue;}
|
||||
if (strncasecmp(it->first.c_str(), i.c_str(), i.length()) == 0){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/// Returns POST variable i, if set.
|
||||
|
@ -594,12 +606,6 @@ bool HTTP::Parser::parse(std::string &HTTPbuffer, Util::DataCallback &cb){
|
|||
body.reserve(length);
|
||||
}
|
||||
}
|
||||
if (GetHeader("Content-length") != ""){
|
||||
length = atoi(GetHeader("Content-length").c_str());
|
||||
if (!bodyCallback && (&cb == &Util::defaultDataCallback) && body.capacity() < length){
|
||||
body.reserve(length);
|
||||
}
|
||||
}
|
||||
if (GetHeader("Transfer-Encoding") == "chunked"){
|
||||
getChunks = true;
|
||||
doingChunk = 0;
|
||||
|
@ -713,8 +719,8 @@ bool HTTP::Parser::parse(std::string &HTTPbuffer, Util::DataCallback &cb){
|
|||
if (shouldAppend){body.append(HTTPbuffer, 0, toappend);}
|
||||
HTTPbuffer.erase(0, toappend);
|
||||
|
||||
// return false when callbacks are used.
|
||||
return shouldAppend;
|
||||
// return true if there is no body, otherwise we only stop when the connection is dropped
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue