namespace Msp {
namespace Http {
-Header::Header(const Message &msg, const string &n):
+Header::Header(const Message &msg, const string &n, Style s):
name(n),
+ style(s),
raw_value(msg.get_header(name))
{
parse();
}
-Header::Header(const string &n, const string &rv):
+Header::Header(const string &n, const string &rv, Style s):
name(n),
+ style(s),
raw_value(rv)
{
parse();
}
+Header::Style Header::get_default_style(const string &name)
+{
+ if(!strcasecmp(name, "content-disposition"))
+ return VALUE_WITH_ATTRIBUTES;
+ else if(!strcasecmp(name, "content-type"))
+ return VALUE_WITH_ATTRIBUTES;
+ else if(!strcasecmp(name, "cookie"))
+ return KEY_VALUE_LIST;
+ else if(!strcasecmp(name, "set-cookie"))
+ return VALUE_WITH_ATTRIBUTES;
+ else
+ return SINGLE_VALUE;
+}
+
void Header::parse()
{
+ if(style==DEFAULT)
+ style = get_default_style(name);
+
+ if(style==SINGLE_VALUE)
+ {
+ Value value;
+ value.value = strip(raw_value);
+ values.push_back(value);
+ return;
+ }
+
+ char value_sep = (style==VALUE_WITH_ATTRIBUTES ? 0 : ',');
+
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");
+ if(style==KEY_VALUE_LIST)
+ value.value = name;
+ else
+ {
+ for(; (i!=raw_value.end() && *i!=';' && *i!=value_sep); ++i) ;
+ value.value = strip(string(start, i));
+ if(value.value.empty())
+ throw invalid_argument("Header::parse");
+ }
- while(i!=raw_value.end() && *i!=',')
+ while(i!=raw_value.end() && (*i!=',' || style==KEY_VALUE_LIST) && style!=LIST)
{
- start = ++i;
- for(; (i!=raw_value.end() && *i!=';' && *i!=',' && *i!='='); ++i) ;
+ if(*i==';' || *i==',')
+ ++i;
+
+ start = i;
+ for(; (i!=raw_value.end() && *i!=';' && *i!=value_sep && *i!='='); ++i) ;
string pname = strip(string(start, i));
if(pname.empty())
throw invalid_argument("Header::parse");
if(i!=raw_value.end() && *i=='=')
{
for(++i; (i!=raw_value.end() && isspace(*i)); ++i) ;
- if(i==raw_value.end() || *i==';' || *i==',')
+ if(i==raw_value.end() || *i==';' || *i==value_sep)
throw invalid_argument("Header::parse");
if(*i=='"')
pvalue = string(start, i);
- for(++i; (i!=raw_value.end() && *i!=';' && *i!=','); ++i)
+ for(++i; (i!=raw_value.end() && *i!=';' && *i!=value_sep); ++i)
if(!isspace(*i))
throw invalid_argument("Header::parse");
}
else
{
start = i;
- for(; (i!=raw_value.end() && *i!=';' && *i!=','); ++i) ;
+ for(; (i!=raw_value.end() && *i!=';' && *i!=value_sep); ++i) ;
pvalue = strip(string(start, i));
}
}
}
values.push_back(value);
+
+ if(i!=raw_value.end() && (*i==';' || *i==','))
+ ++i;
}
}