summaryrefslogtreecommitdiff
path: root/src/Http.cc
diff options
context:
space:
mode:
authorNicolas "Pixel" Noble <pixel@nobis-crew.org>2014-06-20 21:31:41 -0700
committerNicolas "Pixel" Noble <pixel@nobis-crew.org>2014-06-20 21:31:41 -0700
commitdf9b8f8ae7a540988c20fdffaaff2442c349873a (patch)
treeff9be69934b6896c8d7e91412b63dd9cd9b37341 /src/Http.cc
parentfcc66ce9f5d6db995536beab5539fd47e490bf14 (diff)
Moving tokenize, percentEncode and percentDecode around. Fixing a few warnings. Workarounding c-ares and pthreads compilation issue with unicode.
Diffstat (limited to 'src/Http.cc')
-rw-r--r--src/Http.cc68
1 files changed, 68 insertions, 0 deletions
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<const Balau::String, const char *> s_mimeMap {
const char * Balau::Http::getContentType(const String & extension) {
return getMap<const Balau::String>(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;
+}