-
Notifications
You must be signed in to change notification settings - Fork 0
/
FlowEscape.h
81 lines (77 loc) · 2.26 KB
/
FlowEscape.h
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
#include <string>
#include <map>
#include "FlowParser.h"
class FlowEscape {
public:
static inline void UrlDecode(std::string &url) {
size_t pos = 0;
FlowParser::goTo(url, "%", pos);
while (pos != std::string::npos) {
auto itr = _decodeUrlMap.find(url.substr(pos, 3));
if (itr != _decodeUrlMap.end()) {
url.replace(pos, 3, itr->second);
}
FlowParser::goTo(url, "%", ++pos);
}
}
static inline void UrlEncode(std::string &url) {
size_t pos = 0;
FlowParser::goToOne(url, encodeString, pos);
while (pos != std::string::npos) {
auto itr = _encodeUrlMap.find(url.substr(pos, 1));
if (itr != _encodeUrlMap.end()) {
url.replace(pos, 1, itr->second);
}
FlowParser::goToOne(url, encodeString, ++pos);
}
}
private:
static inline const std::string encodeString = " !%+,;<=>?@[\\]^`{|}~";
static inline const std::unordered_map<std::string, std::string> _decodeUrlMap = {
{"%20", " "},
{"%22", "!"},
{"%25", "%"},
{"%2B", "+"},
{"%2C", ","},
{"%2F", "/"},
{"%3A", ":"},
{"%3B", ";"},
{"%3C", "<"},
{"%3D", "="},
{"%3E", ">"},
{"%3F", "?"},
{"%40", "@"},
{"%5B", "["},
{"%5C", "\\"},
{"%5D", "]"},
{"%5E", "^"},
{"%60", "`"},
{"%7B", "{"},
{"%7C", "|"},
{"%7D", "}"},
{"%7E", "~"},
{"%7F", ""}
};
static inline const std::unordered_map<std::string, std::string> _encodeUrlMap = {
{" ", "%20"},
{"!", "%22"},
{"%", "%25"},
{"+", "%2B"},
{",", "%2C"},
{";", "%3B"},
{"<", "%3C"},
{"=", "%3D"},
{">", "%3E"},
{"?", "%3F"},
{"@", "%40"},
{"[", "%5B"},
{"\\", "%5C"},
{"]", "%5D"},
{"^", "%5E"},
{"`", "%60"},
{"{", "%7B"},
{"|", "%7C"},
{"}", "%7D"},
{"~", "%7E"},
};
};