libs/http/src/server/route_abnf.hpp

100.0% Lines (5/5) 100.0% Functions (2/2) -% Branches (0/0)
libs/http/src/server/route_abnf.hpp
Line Hits Source Code
1 //
2 // Copyright (c) 2025 Vinnie Falco (vinnie dot falco at gmail dot com)
3 //
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 //
7 // Official repository: https://github.com/cppalliance/http
8 //
9
10 #ifndef BOOST_HTTP_SERVER_ROUTE_ABNF_HPP
11 #define BOOST_HTTP_SERVER_ROUTE_ABNF_HPP
12
13 #include <boost/http/detail/config.hpp>
14 #include <boost/core/detail/string_view.hpp>
15 #include <boost/system/result.hpp>
16 #include <string>
17 #include <vector>
18
19 namespace boost {
20 namespace http {
21 namespace detail {
22
23 //------------------------------------------------
24
25 /** Type of route pattern token
26 */
27 enum class route_token_type
28 {
29 text, // literal text
30 param, // :name parameter
31 wildcard, // *name wildcard
32 group // {...} optional group
33 };
34
35 //------------------------------------------------
36
37 /** A token in a parsed route pattern
38 */
39 struct route_token
40 {
41 route_token_type type;
42 std::string value; // text content or param name
43 std::vector<route_token> children; // group contents
44
45 7 route_token() = default;
46
47 185 route_token(
48 route_token_type t,
49 std::string v)
50 185 : type(t)
51 185 , value(std::move(v))
52 {
53 185 }
54 };
55
56 //------------------------------------------------
57
58 /** Result of parsing a route pattern
59 */
60 struct route_pattern
61 {
62 std::vector<route_token> tokens;
63 std::string original;
64 };
65
66 //------------------------------------------------
67
68 /** Parse a route pattern string
69
70 Parses a path-to-regexp style route pattern into tokens.
71
72 @par Grammar
73 @code
74 path = *token
75 token = text / param / wildcard / group
76 text = 1*(char / escaped-char)
77 param = ":" name
78 wildcard = "*" name
79 group = "{" *token "}"
80 name = identifier / quoted-name
81 @endcode
82
83 @param pattern The route pattern string to parse
84
85 @return A result containing the parsed route pattern, or
86 an error if parsing failed
87 */
88 system::result<route_pattern>
89 parse_route_pattern(core::string_view pattern);
90
91 //------------------------------------------------
92
93 /** Options for route matching
94 */
95 struct match_options
96 {
97 bool case_sensitive; ///< Text comparison mode
98 bool strict; ///< Trailing slash matters
99 bool end; ///< true = full match, false = prefix match
100 };
101
102 //------------------------------------------------
103
104 /** Result of matching a path against a pattern
105 */
106 struct match_params
107 {
108 std::vector<std::pair<std::string, std::string>> params; ///< Captured parameters
109 std::size_t matched_length; ///< Characters consumed from path
110 };
111
112 //------------------------------------------------
113
114 /** Match a decoded path against a route pattern
115
116 Attempts to match the given path against the pattern,
117 extracting any captured parameters.
118
119 @param path The decoded path to match (not URL-encoded)
120 @param pattern The parsed route pattern
121 @param opts Matching options
122
123 @return The captured parameters and match length if successful,
124 or an error if the path doesn't match
125 */
126 system::result<match_params>
127 match_route(
128 core::string_view path,
129 route_pattern const& pattern,
130 match_options const& opts);
131
132 } // detail
133 } // http
134 } // boost
135
136 #endif
137