-rw-r--r-- | src/util.cc | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/util.cc b/src/util.cc new file mode 100644 index 0000000..2e2d305 --- a/dev/null +++ b/src/util.cc @@ -0,0 +1,53 @@ +#include "kingate/util.h" +#include "kingate/exception.h" + +namespace kingate { + + static const char *safeChars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789" + "_-" ; + + string url_escape(const string& str) { + string rv = str; + string::size_type screwed = 0; + for(;;) { + screwed = rv.find_first_not_of(safeChars,screwed); + if(screwed == string::npos) + break; + while(screwed<rv.length() && !strchr(safeChars,rv.at(screwed))) { + char danger = rv.at(screwed); + if(danger==' ') { + rv.replace(screwed++,1,1,'+'); + }else{ + static char tmp[4] = {'%',0,0,0}; + snprintf(&tmp[1],3,"%02X",0xFF&(int)danger); + rv.replace(screwed,1,tmp,3); + screwed+=3; + } + } + } + return rv; + } + string url_unescape(const string& str) { + string rv = str; + string::size_type unscrewed = 0; + for(;;) { + unscrewed = rv.find_first_of("%+",unscrewed); + if(unscrewed == string::npos) + break; + if(rv.at(unscrewed)=='+') { + rv.replace(unscrewed++,1,1,' '); + }else{ + if((rv.length()-unscrewed)<3) + throw exception(CODEPOINT,"incorrectly escaped string"); + // XXX: ensure it's hex? + int danger = strtol(rv.substr(unscrewed+1,2).c_str(),NULL,16); + rv.replace(unscrewed,3,1,danger); + unscrewed++; + } + } + return rv; + } +} |