]> git.tdb.fi Git - libs/net.git/blob - source/http/header.cpp
Implement an asynchronous name resolver class
[libs/net.git] / source / http / header.cpp
1 #include <stdexcept>
2 #include <msp/strings/utils.h>
3 #include "header.h"
4 #include "message.h"
5
6 using namespace std;
7
8 namespace Msp {
9 namespace Http {
10
11 Header::Header(const Message &msg, const string &n):
12         name(n),
13         raw_value(msg.get_header(name))
14 {
15         parse();
16 }
17
18 Header::Header(const string &n, const string &rv):
19         name(n),
20         raw_value(rv)
21 {
22         parse();
23 }
24
25 void Header::parse()
26 {
27         string::const_iterator i = raw_value.begin();
28         while(i!=raw_value.end())
29         {
30                 Value value;
31
32                 string::const_iterator start = i;
33                 for(; (i!=raw_value.end() && *i!=';' && *i!=','); ++i) ;
34                 value.value = strip(string(start, i));
35                 if(value.value.empty())
36                         throw invalid_argument("Header::parse");
37
38                 while(i!=raw_value.end() && *i!=',')
39                 {
40                         start = ++i;
41                         for(; (i!=raw_value.end() && *i!=';' && *i!=',' && *i!='='); ++i) ;
42                         string pname = strip(string(start, i));
43                         if(pname.empty())
44                                 throw invalid_argument("Header::parse");
45
46                         string pvalue;
47                         if(i!=raw_value.end() && *i=='=')
48                         {
49                                 for(++i; (i!=raw_value.end() && isspace(*i)); ++i) ;
50                                 if(i==raw_value.end() || *i==';' || *i==',')
51                                         throw invalid_argument("Header::parse");
52
53                                 if(*i=='"')
54                                 {
55                                         start = ++i;
56                                         for(; (i!=raw_value.end() && *i!='"'); ++i) ;
57                                         if(i==raw_value.end())
58                                                 throw invalid_argument("Header::parse");
59
60                                         pvalue = string(start, i);
61
62                                         for(++i; (i!=raw_value.end() && *i!=';' && *i!=','); ++i)
63                                                 if(!isspace(*i))
64                                                         throw invalid_argument("Header::parse");
65                                 }
66                                 else
67                                 {
68                                         start = i;
69                                         for(; (i!=raw_value.end() && *i!=';' && *i!=','); ++i) ;
70                                         pvalue = strip(string(start, i));
71                                 }
72                         }
73
74                         value.parameters[pname] = pvalue;
75                 }
76
77                 values.push_back(value);
78         }
79 }
80
81 } // namespace Http
82 } // namespace Msp