Diffstat (limited to 'test/kingate_openid_message.h') (more/less context) (ignore whitespace changes)
-rw-r--r-- | test/kingate_openid_message.h | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/test/kingate_openid_message.h b/test/kingate_openid_message.h new file mode 100644 index 0000000..b3a2c9d --- a/dev/null +++ b/test/kingate_openid_message.h | |||
@@ -0,0 +1,108 @@ | |||
1 | template<typename IT> | ||
2 | class join_iterator : public iterator< | ||
3 | input_iterator_tag,typename IT::value_type, | ||
4 | void,typename IT::pointer,typename IT::reference> { | ||
5 | public: | ||
6 | typedef pair<IT,IT> range_t; | ||
7 | typedef list<range_t> ranges_t; | ||
8 | ranges_t ranges; | ||
9 | |||
10 | join_iterator() { } | ||
11 | |||
12 | bool cleanup() { | ||
13 | bool rv = false; | ||
14 | while(!(ranges.empty() || ranges.front().first!=ranges.front().second)) { | ||
15 | ranges.pop_front(); rv = true; | ||
16 | } | ||
17 | return rv; | ||
18 | } | ||
19 | |||
20 | join_iterator<IT>& add_range(const IT& b,const IT& e) { | ||
21 | ranges.push_back(typename ranges_t::value_type(b,e)); | ||
22 | cleanup(); | ||
23 | return *this; | ||
24 | } | ||
25 | |||
26 | bool operator==(const join_iterator<IT>& x) const { | ||
27 | return ranges==x.ranges; } | ||
28 | bool operator!=(const join_iterator<IT>& x) const { | ||
29 | return ranges!=x.ranges; } | ||
30 | |||
31 | typename IT::reference operator*() const { | ||
32 | assert(!ranges.empty()); | ||
33 | assert(ranges.front().first!=ranges.front().second); | ||
34 | return *ranges.front().first; } | ||
35 | typename IT::pointer operator->() const { | ||
36 | assert(!ranges.empty()); | ||
37 | assert(ranges.front().first!=ranges.front().second); | ||
38 | return ranges.front().first.operator->(); } | ||
39 | |||
40 | join_iterator<IT>& operator++() { | ||
41 | cleanup(); | ||
42 | if(ranges.empty()) return *this; | ||
43 | do { | ||
44 | ++ranges.front().first; | ||
45 | }while(cleanup() && !ranges.empty()); | ||
46 | return *this; | ||
47 | } | ||
48 | join_iterator<IT> operator++(int) { | ||
49 | join_iterator<IT> rv(*this); | ||
50 | ++(*this); return rv; } | ||
51 | }; | ||
52 | |||
53 | template<typename IT> | ||
54 | class cut_prefix_filterator : public opkele::util::basic_filterator<IT> { | ||
55 | public: | ||
56 | string pfx; | ||
57 | mutable string tmp; | ||
58 | |||
59 | cut_prefix_filterator() { } | ||
60 | cut_prefix_filterator(const IT& bi,const IT&ei,const string& pfx) | ||
61 | : opkele::util::basic_filterator<IT>(bi,ei), pfx(pfx) { | ||
62 | this->prepare(); | ||
63 | } | ||
64 | |||
65 | bool is_interesting() const { | ||
66 | return pfx.length()==0 || !strncmp(this->it->c_str(),pfx.c_str(),pfx.length()); | ||
67 | } | ||
68 | |||
69 | typename IT::reference operator*() const { | ||
70 | assert(!this->empty); | ||
71 | tmp = *this->it; tmp.erase(0,pfx.length()); | ||
72 | return tmp; } | ||
73 | typename IT::pointer operator->() const { | ||
74 | assert(!this->empty); | ||
75 | return &this->operator*(); } | ||
76 | }; | ||
77 | |||
78 | class kingate_openid_message_t : public opkele::basic_openid_message { | ||
79 | typedef join_iterator<kingate::cgi_gateway::params_t::const_iterator> jitterator; | ||
80 | typedef opkele::util::map_keys_iterator< | ||
81 | jitterator, | ||
82 | fields_iterator::value_type, | ||
83 | fields_iterator::reference, | ||
84 | fields_iterator::pointer> keys_iterator; | ||
85 | typedef cut_prefix_filterator<keys_iterator> pfilterator; | ||
86 | public: | ||
87 | const kingate::cgi_gateway& gw; | ||
88 | |||
89 | kingate_openid_message_t(const kingate::cgi_gateway& g) : gw(g) { } | ||
90 | |||
91 | bool has_field(const string& n) const { | ||
92 | return gw.has_param("openid."+n); } | ||
93 | const string& get_field(const string& n) const { | ||
94 | return gw.get_param("openid."+n); } | ||
95 | |||
96 | fields_iterator fields_begin() const { | ||
97 | return | ||
98 | pfilterator( keys_iterator( | ||
99 | jitterator() | ||
100 | .add_range( gw.get.begin(), gw.get.end() ) | ||
101 | .add_range( gw.post.begin(), gw.post.end() ), | ||
102 | jitterator() | ||
103 | ), keys_iterator(), "openid." ); | ||
104 | } | ||
105 | fields_iterator fields_end() const { | ||
106 | return pfilterator(); | ||
107 | } | ||
108 | }; | ||