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 "timing.h"
|
||||||
#include "url.h"
|
#include "url.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
#include <strings.h>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
|
|
||||||
/// This constructor creates an empty HTTP::Parser, ready for use for either reading or writing.
|
/// 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.
|
/// Returns header i, if set.
|
||||||
const std::string &HTTP::Parser::GetHeader(const std::string &i) const{
|
const std::string &HTTP::Parser::GetHeader(const std::string &i) const{
|
||||||
if (headers.count(i)){
|
if (headers.count(i)){return headers.at(i);}
|
||||||
return headers.at(i);
|
for (std::map<std::string, std::string>::const_iterator it = headers.begin(); it != headers.end(); ++it){
|
||||||
}else{
|
if (it->first.length() != i.length()){continue;}
|
||||||
static const std::string empty;
|
if (strncasecmp(it->first.c_str(), i.c_str(), i.length()) == 0){
|
||||||
return empty;
|
return it->second;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
//Return empty string if not found
|
||||||
|
static const std::string empty;
|
||||||
|
return empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns header i, if set.
|
/// Returns header i, if set.
|
||||||
bool HTTP::Parser::hasHeader(const std::string &i) const{
|
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.
|
/// Returns POST variable i, if set.
|
||||||
|
@ -594,12 +606,6 @@ bool HTTP::Parser::parse(std::string &HTTPbuffer, Util::DataCallback &cb){
|
||||||
body.reserve(length);
|
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"){
|
if (GetHeader("Transfer-Encoding") == "chunked"){
|
||||||
getChunks = true;
|
getChunks = true;
|
||||||
doingChunk = 0;
|
doingChunk = 0;
|
||||||
|
@ -713,8 +719,8 @@ bool HTTP::Parser::parse(std::string &HTTPbuffer, Util::DataCallback &cb){
|
||||||
if (shouldAppend){body.append(HTTPbuffer, 0, toappend);}
|
if (shouldAppend){body.append(HTTPbuffer, 0, toappend);}
|
||||||
HTTPbuffer.erase(0, toappend);
|
HTTPbuffer.erase(0, toappend);
|
||||||
|
|
||||||
// return false when callbacks are used.
|
// return true if there is no body, otherwise we only stop when the connection is dropped
|
||||||
return shouldAppend;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue