33#include <absl/status/status.h>
34#include <absl/status/statusor.h>
35#include <absl/strings/ascii.h>
36#include <absl/strings/str_cat.h>
42 if (one >=
'0' && one <=
'9') {
45 if (one >=
'a' && one <=
'f') {
46 return one -
'a' + 10;
48 if (one >=
'A' && one <=
'F') {
49 return one -
'A' + 10;
67inline std::string
Decode(std::string_view
value,
bool plus_is_space =
false) {
69 decoded.reserve(
value.size());
70 for (
size_t index = 0; index <
value.size(); ++index) {
71 const char one =
value[index];
72 if (plus_is_space && one ==
'+') {
73 decoded.push_back(
' ');
76 if (one ==
'%' && index + 2 <
value.size()) {
79 if (high >= 0 && low >= 0) {
80 decoded.push_back(
static_cast<char>((high << 4) | low));
85 decoded.push_back(one);
101 std::string_view what) {
103 decoded.reserve(
value.size());
104 for (
size_t index = 0; index <
value.size(); ++index) {
105 if (
value[index] !=
'%') {
106 decoded.push_back(
value[index]);
109 if (index + 2 >=
value.size()) {
110 return absl::InvalidArgumentError(
111 absl::StrCat(
"Truncated percent escape in ", what));
115 if (high < 0 || low < 0) {
116 return absl::InvalidArgumentError(
117 absl::StrCat(
"Invalid percent escape in ", what));
119 decoded.push_back(
static_cast<char>((high << 4) | low));
127 static constexpr std::string_view kLowerHex =
"0123456789abcdef";
129 out.reserve(
value.size());
130 for (
const char ch :
value) {
131 const auto byte =
static_cast<unsigned char>(ch);
132 if (absl::ascii_isalnum(
byte) ||
byte ==
'-' ||
byte ==
'.' ||
133 byte ==
'_' ||
byte ==
'~') {
138 out.push_back(kLowerHex[
byte >> 4U]);
139 out.push_back(kLowerHex[
byte & 0x0FU]);
std::string value
Definition discover.cc:114
int HexDigit(char one)
The value 0-15 of a hex digit, either case, or -1 if one is not one.
Definition percent.h:41
absl::StatusOr< std::string > DecodeStrict(std::string_view value, std::string_view what)
Percent-decodes value, or says why it cannot be decoded.
Definition percent.h:100
std::string Decode(std::string_view value, bool plus_is_space=false)
Percent-decodes value, leaving anything malformed as it stands.
Definition percent.h:67
std::string Encode(std::string_view value)
Percent-encodes everything outside RFC 3986's unreserved set.
Definition percent.h:126