author | Michael Krelin <hacker@klever.net> | 2020-10-07 22:52:19 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2020-10-07 22:52:19 (UTC) |
commit | c561689bf162fb22997bd88f4392f222f151c950 (patch) (unidiff) | |
tree | ce4656e92c379f7089f4bb72a4b10d781b61211e /src/util.cc | |
parent | 3a4530372bc95d728dbddbac788f2c1f2d03a030 (diff) | |
download | kingate-master.zip kingate-master.tar.gz kingate-master.tar.bz2 |
-rw-r--r-- | src/util.cc | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/src/util.cc b/src/util.cc index 48e486a..76e684f 100644 --- a/src/util.cc +++ b/src/util.cc | |||
@@ -1,64 +1,65 @@ | |||
1 | #include <cstring> | ||
1 | #include "kingate/util.h" | 2 | #include "kingate/util.h" |
2 | #include "kingate/exception.h" | 3 | #include "kingate/exception.h" |
3 | 4 | ||
4 | namespace kingate { | 5 | namespace kingate { |
5 | 6 | ||
6 | static const char *safeChars = | 7 | static const char *safeChars = |
7 | "ABCDEFGHIJKLMNOPQRSTUVWXYZ" | 8 | "ABCDEFGHIJKLMNOPQRSTUVWXYZ" |
8 | "abcdefghijklmnopqrstuvwxyz" | 9 | "abcdefghijklmnopqrstuvwxyz" |
9 | "0123456789" | 10 | "0123456789" |
10 | "_-" ; | 11 | "_-" ; |
11 | 12 | ||
12 | string url_encode(const string& str) { | 13 | string url_encode(const string& str) { |
13 | string rv = str; | 14 | string rv = str; |
14 | string::size_type screwed = 0; | 15 | string::size_type screwed = 0; |
15 | for(;;) { | 16 | for(;;) { |
16 | screwed = rv.find_first_not_of(safeChars,screwed); | 17 | screwed = rv.find_first_not_of(safeChars,screwed); |
17 | if(screwed == string::npos) | 18 | if(screwed == string::npos) |
18 | break; | 19 | break; |
19 | while(screwed<rv.length() && !strchr(safeChars,rv.at(screwed))) { | 20 | while(screwed<rv.length() && !strchr(safeChars,rv.at(screwed))) { |
20 | char danger = rv.at(screwed); | 21 | char danger = rv.at(screwed); |
21 | if(danger==' ') { | 22 | if(danger==' ') { |
22 | rv.replace(screwed++,1,1,'+'); | 23 | rv.replace(screwed++,1,1,'+'); |
23 | }else{ | 24 | }else{ |
24 | static char tmp[4] = {'%',0,0,0}; | 25 | static char tmp[4] = {'%',0,0,0}; |
25 | snprintf(&tmp[1],3,"%02X",0xFF&(int)danger); | 26 | snprintf(&tmp[1],3,"%02X",0xFF&(int)danger); |
26 | rv.replace(screwed,1,tmp,3); | 27 | rv.replace(screwed,1,tmp,3); |
27 | screwed+=3; | 28 | screwed+=3; |
28 | } | 29 | } |
29 | } | 30 | } |
30 | } | 31 | } |
31 | return rv; | 32 | return rv; |
32 | } | 33 | } |
33 | string url_decode(const string& str) { | 34 | string url_decode(const string& str) { |
34 | string rv = str; | 35 | string rv = str; |
35 | string::size_type unscrewed = 0; | 36 | string::size_type unscrewed = 0; |
36 | for(;;) { | 37 | for(;;) { |
37 | unscrewed = rv.find_first_of("%+",unscrewed); | 38 | unscrewed = rv.find_first_of("%+",unscrewed); |
38 | if(unscrewed == string::npos) | 39 | if(unscrewed == string::npos) |
39 | break; | 40 | break; |
40 | if(rv.at(unscrewed)=='+') { | 41 | if(rv.at(unscrewed)=='+') { |
41 | rv.replace(unscrewed++,1,1,' '); | 42 | rv.replace(unscrewed++,1,1,' '); |
42 | }else{ | 43 | }else{ |
43 | if((rv.length()-unscrewed)<3) | 44 | if((rv.length()-unscrewed)<3) |
44 | throw exception(CODEPOINT,"incorrectly escaped string"); | 45 | throw exception(CODEPOINT,"incorrectly escaped string"); |
45 | // XXX: ensure it's hex? | 46 | // XXX: ensure it's hex? |
46 | int danger = strtol(rv.substr(unscrewed+1,2).c_str(),NULL,16); | 47 | int danger = strtol(rv.substr(unscrewed+1,2).c_str(),NULL,16); |
47 | rv.replace(unscrewed,3,1,danger); | 48 | rv.replace(unscrewed,3,1,danger); |
48 | unscrewed++; | 49 | unscrewed++; |
49 | } | 50 | } |
50 | } | 51 | } |
51 | return rv; | 52 | return rv; |
52 | } | 53 | } |
53 | 54 | ||
54 | /* | 55 | /* |
55 | * RFC 2616: | 56 | * RFC 2616: |
56 | * | 57 | * |
57 | * separators = "(" | ")" | "<" | ">" | "@" | 58 | * separators = "(" | ")" | "<" | ">" | "@" |
58 | * | "," | ";" | ":" | "\" | <"> | 59 | * | "," | ";" | ":" | "\" | <"> |
59 | * | "/" | "[" | "]" | "?" | "=" | 60 | * | "/" | "[" | "]" | "?" | "=" |
60 | * | "{" | "}" | SP | HT | 61 | * | "{" | "}" | SP | HT |
61 | */ | 62 | */ |
62 | 63 | ||
63 | /* | 64 | /* |
64 | * RFC 2616: | 65 | * RFC 2616: |