String::CPtr percentDecode(String::CPtr str, String::Encoding enc) { if (!str || str->isEmpty()) return String::create(); Size len = str->length() + 1; char* decoded = new char[len]; Size size = percentDecode(decoded, len, str->toStdString().c_str()); String::CPtr res; switch (enc) { case String::UTF8: res = String::create(decoded, enc, size); break; case String::UTF16: case String::UTF16BE: case String::UTF16LE: res = String::create(decoded, enc, size >> 1); break; case String::UTF32: case String::UTF32BE: case String::UTF32LE: res = String::create(decoded, enc, size >> 2); break; default: assert(false); res = String::null(); } delete[] decoded; return res; }
llvm::Expected<URI> URI::parse(llvm::StringRef OrigUri) { URI U; llvm::StringRef Uri = OrigUri; auto Pos = Uri.find(':'); if (Pos == 0 || Pos == llvm::StringRef::npos) return make_string_error("Scheme must be provided in URI: " + OrigUri); U.Scheme = percentDecode(Uri.substr(0, Pos)); Uri = Uri.substr(Pos + 1); if (Uri.consume_front("//")) { Pos = Uri.find('/'); U.Authority = percentDecode(Uri.substr(0, Pos)); Uri = Uri.substr(Pos); } U.Body = percentDecode(Uri); return U; }