From df9b8f8ae7a540988c20fdffaaff2442c349873a Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Fri, 20 Jun 2014 21:31:41 -0700 Subject: Moving tokenize, percentEncode and percentDecode around. Fixing a few warnings. Workarounding c-ares and pthreads compilation issue with unicode. --- src/Http.cc | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) (limited to 'src/Http.cc') diff --git a/src/Http.cc b/src/Http.cc index 10c3430..c645836 100644 --- a/src/Http.cc +++ b/src/Http.cc @@ -72,3 +72,71 @@ static const std::map s_mimeMap { const char * Balau::Http::getContentType(const String & extension) { return getMap(s_mimeMap, extension, "application/octet-stream"); } + + +Balau::String Balau::Http::percentEncode(const String & src) { + const size_t size = src.strlen(); + String ret; + ret.reserve(size); + + static char toHex[] = "0123456789ABCDEF"; + + for (size_t i = 0; i < size; i++) { + char c = src[i]; + if (((c >= '0') && (c <= '9')) || ((c >= 'A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'z')) || (c == '-') || (c == '.') || (c == '_') || (c == '~')) { + ret += c; + } + else { + ret += '%'; + ret += toHex[c >> 4]; + ret += toHex[c & 15]; + } + } + + return ret; +} + +Balau::String Balau::Http::percentDecode(const String & src) { + const size_t size = src.strlen(); + String ret; + ret.reserve(size); + + for (size_t i = 0; i < size; i++) { + char c = src[i]; + if (((c >= '0') && (c <= '9')) || ((c >= 'A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'z')) || (c == '-') || (c == '.') || (c == '_') || (c == '~')) { + ret += c; + } + else if ((c == '%') && ((i + 2) < size)) { + char h1 = src[i + 1]; + char h2 = src[i + 2]; + if ((h1 >= '0') && (h1 <= '9')) { + c = h1 - '0'; + } + else if ((h1 >= 'A') && (h1 <= 'F')) { + c = h1 - 'A' + 10; + } + else { + // invalid + return ret; + } + c <<= 4; + if ((h2 >= '0') && (h2 <= '9')) { + c |= h2 - '0'; + } + else if ((h2 >= 'A') && (h2 <= 'F')) { + c |= h2 - 'A' + 10; + } + else { + // invalid + return ret; + } + i += 2; + } + else { + // invalid + return ret; + } + } + + return ret; +} -- cgit v1.2.3