forked from scylladb/seastar
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjson_path.cc
105 lines (90 loc) · 2.99 KB
/
json_path.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/*
* This file is open source software, licensed to you under the terms
* of the Apache License, Version 2.0 (the "License"). See the NOTICE file
* distributed with this work for additional information regarding copyright
* ownership. You may not use this file except in compliance with the License.
*
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/*
* Copyright 2015 Cloudius Systems
*/
#ifdef SEASTAR_MODULE
module;
#include <vector>
module seastar;
#else
#include <seastar/http/json_path.hh>
#endif
namespace seastar {
namespace httpd {
using namespace std;
void path_description::set(routes& _routes, handler_base* handler) const {
for (auto& i : mandatory_queryparams) {
handler->mandatory(i);
}
if (params.size() == 0)
_routes.put(operations.method, path, handler);
else {
match_rule* rule = new match_rule(handler);
rule->add_str(path);
for (auto&& i : params) {
if (i.type == url_component_type::FIXED_STRING) {
rule->add_str(i.name);
} else {
rule->add_param(i.name, i.type == url_component_type::PARAM_UNTIL_END_OF_PATH);
}
}
_cookie = _routes.add_cookie(rule, operations.method);
}
}
void path_description::set(routes& _routes,
const json_request_function& f) const {
set(_routes, new function_handler(f));
}
void path_description::set(routes& _routes, const future_json_function& f) const {
set(_routes, new function_handler(f));
}
void path_description::unset(routes& _routes) const {
if (params.size() == 0) {
_routes.drop(operations.method, path);
} else {
auto rule = _routes.del_cookie(_cookie, operations.method);
delete rule;
}
}
path_description::path_description(const sstring& path, operation_type method,
const sstring& nickname,
const std::vector<std::pair<sstring, bool>>& path_parameters,
const std::vector<sstring>& mandatory_params)
: path(path), operations(method, nickname) {
for (auto man : mandatory_params) {
pushmandatory_param(man);
}
for (auto param : path_parameters) {
pushparam(param.first, param.second);
}
}
path_description::path_description(const sstring& path, operation_type method,
const sstring& nickname,
const std::initializer_list<path_part>& path_parameters,
const std::vector<sstring>& mandatory_params)
: path(path), operations(method, nickname) {
for (auto man : mandatory_params) {
pushmandatory_param(man);
}
for (auto param : path_parameters) {
params.push_back(param);
}
}
}
}