X-Git-Url: http://git.tdb.fi/?p=libs%2Fnet.git;a=blobdiff_plain;f=source%2Fhttp%2Fheader.cpp;fp=source%2Fhttp%2Fheader.cpp;h=02c82ca08001c10f898102afd1595a980ee3c8b8;hp=0000000000000000000000000000000000000000;hb=451c140747bef1829d55d20a33dd3543b9ab8c98;hpb=afb8690a16f16890c322bdaf752574e4428a9c02 diff --git a/source/http/header.cpp b/source/http/header.cpp new file mode 100644 index 0000000..02c82ca --- /dev/null +++ b/source/http/header.cpp @@ -0,0 +1,82 @@ +#include +#include +#include "header.h" +#include "message.h" + +using namespace std; + +namespace Msp { +namespace Http { + +Header::Header(const Message &msg, const string &n): + name(n), + raw_value(msg.get_header(name)) +{ + parse(); +} + +Header::Header(const string &n, const string &rv): + name(n), + raw_value(rv) +{ + parse(); +} + +void Header::parse() +{ + string::const_iterator i = raw_value.begin(); + while(i!=raw_value.end()) + { + Value value; + + string::const_iterator start = i; + for(; (i!=raw_value.end() && *i!=';' && *i!=','); ++i) ; + value.value = strip(string(start, i)); + if(value.value.empty()) + throw invalid_argument("Header::parse"); + + while(i!=raw_value.end() && *i!=',') + { + start = ++i; + for(; (i!=raw_value.end() && *i!=';' && *i!=',' && *i!='='); ++i) ; + string pname = strip(string(start, i)); + if(pname.empty()) + throw invalid_argument("Header::parse"); + + string pvalue; + if(i!=raw_value.end() && *i=='=') + { + for(++i; (i!=raw_value.end() && isspace(*i)); ++i) ; + if(i==raw_value.end() || *i==';' || *i==',') + throw invalid_argument("Header::parse"); + + if(*i=='"') + { + start = ++i; + for(; (i!=raw_value.end() && *i!='"'); ++i) ; + if(i==raw_value.end()) + throw invalid_argument("Header::parse"); + + pvalue = string(start, i); + + for(++i; (i!=raw_value.end() && *i!=';' && *i!=','); ++i) + if(!isspace(*i)) + throw invalid_argument("Header::parse"); + } + else + { + start = i; + for(; (i!=raw_value.end() && *i!=';' && *i!=','); ++i) ; + pvalue = strip(string(start, i)); + } + } + + value.parameters[pname] = pvalue; + } + + values.push_back(value); + } +} + +} // namespace Http +} // namespace Msp