diff options
author | albert <albert@yandex-team.ru> | 2022-02-10 16:48:15 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:48:15 +0300 |
commit | a817f5de12611ec73085eba17f8ec7740a46bdb7 (patch) | |
tree | b222e5ac2e2e98872661c51ccceee5da0d291e13 /library/cpp/uri/encode.cpp | |
parent | 9f25ef3232c288ca664ceee6c376cf64e4349a2e (diff) | |
download | ydb-a817f5de12611ec73085eba17f8ec7740a46bdb7.tar.gz |
Restoring authorship annotation for <albert@yandex-team.ru>. Commit 2 of 2.
Diffstat (limited to 'library/cpp/uri/encode.cpp')
-rw-r--r-- | library/cpp/uri/encode.cpp | 110 |
1 files changed, 55 insertions, 55 deletions
diff --git a/library/cpp/uri/encode.cpp b/library/cpp/uri/encode.cpp index 2f63d8140a..584fb1bac9 100644 --- a/library/cpp/uri/encode.cpp +++ b/library/cpp/uri/encode.cpp @@ -1,33 +1,33 @@ -#include "encode.h" +#include "encode.h" #include <util/generic/singleton.h> -namespace NUri { +namespace NUri { namespace NEncode { -// http://tools.ietf.org/html/rfc3986#section-2.2 -#define GENDELIMS0 ":/?#[]@" -#define SUBDELIMS0 "!$&'()*+,;=" -// http://tools.ietf.org/html/rfc3986#section-2.3 -#define UNRESERVED "-._~" - -// now find subsets which can sometimes be decoded - -// remove '#' which can't ever be decoded -// don't mark anything allowed for pass (pass is completely encoded) -// safe in path, qry, frag -#define GENDELIMS1 ":@" -// allowed in qry, frag -#define GENDELIMS2 "/?" - -// qry-unsafe chars -#define SUBDELIMS1 "&+=;" -// rest allowed in qry, frag -#define SUBDELIMS2 "!$'()*," - +// http://tools.ietf.org/html/rfc3986#section-2.2 +#define GENDELIMS0 ":/?#[]@" +#define SUBDELIMS0 "!$&'()*+,;=" +// http://tools.ietf.org/html/rfc3986#section-2.3 +#define UNRESERVED "-._~" + +// now find subsets which can sometimes be decoded + +// remove '#' which can't ever be decoded +// don't mark anything allowed for pass (pass is completely encoded) +// safe in path, qry, frag +#define GENDELIMS1 ":@" +// allowed in qry, frag +#define GENDELIMS2 "/?" + +// qry-unsafe chars +#define SUBDELIMS1 "&+=;" +// rest allowed in qry, frag +#define SUBDELIMS2 "!$'()*," + const TEncoder::TGrammar& TEncoder::Grammar() { return *Singleton<TEncoder::TGrammar>(); } - + // initialize the grammar map TEncoder::TGrammar::TGrammar() { // first set up unreserved characters safe in any field @@ -36,37 +36,37 @@ namespace NUri { AddRng('A', 'Z', ECFUpper, featUnres | TFeature::FeatureToLower); AddRng('a', 'z', ECFLower, featUnres); Add(UNRESERVED, ECFUnres, featUnres); - + // XXX: standard "safe" set used previously "-_.!~*();/:@$,", with comment: // alnum + reserved + mark + ( '[', ']') - ('=' '+' '&' '\'' '"' '\\' '?') Add("!*();/:@$,", ECFStdrd, TFeature::FeatureDecodeStandardExtra); - + // now field-specific subsets of reserved characters (gen-delims + sub-delims) const ui64 featSafe = TFeature::FeatureDecodeFieldAllowed; - + Add(GENDELIMS1, 0, featSafe, TField::FlagPath | TField::FlagQuery | TField::FlagFrag); Add(GENDELIMS2, 0, featSafe, TField::FlagQuery | TField::FlagFrag); - + Add(SUBDELIMS1, 0, featSafe, TField::FlagUser); Add(SUBDELIMS2, 0, featSafe, TField::FlagUser | TField::FlagQuery | TField::FlagFrag); - + // control chars AddRng(0x00, 0x20, TFeature::FeatureEncodeCntrl); Add(0x7f, TFeature::FeatureEncodeCntrl); - + // '%' starts a percent-encoded sequence Add('%', TFeature::FeatureDecodeANY | TFeature::FeatureEncodePercent); - + // extended ASCII AddRng(128, 255, TFeature::FeatureEncodeExtendedASCII | TFeature::FeatureDecodeExtendedASCII); - + // extended delims Add("\"<>[\\]^`{|}", TFeature::FeatureEncodeExtendedDelim | TFeature::FeatureDecodeExtendedDelim); - + // add characters with other features Add(' ', TFeature::FeatureEncodeSpace | TFeature::FeatureEncodeSpaceAsPlus); Add("'\"\\", TFeature::FeatureEncodeForSQL); - + GetMutable(':').EncodeFld |= TField::FlagUser; GetMutable('?').EncodeFld |= TField::FlagPath; GetMutable('#').EncodeFld |= TField::FlagPath | TField::FlagQuery; @@ -83,44 +83,44 @@ namespace NUri { return true; return (fldmask & DecodeFld) && (flags & TFeature::FeatureDecodeFieldAllowed); } - + const int dD = 'a' - 'A'; - + int TEncodeMapper::EncodeSym(unsigned char& ch) const { const TCharFlags& chflags = TEncoder::GetFlags(ch); const ui64 flags = Flags & chflags.FeatFlags; - + if (flags & TFeature::FeatureToLower) ch += dD; - + if (Q_DecodeAny) return -1; - + if (flags & TFeature::FeaturesEncode) return 1; - + if (' ' == ch) { if (Q_EncodeSpcAsPlus) ch = '+'; return 0; } - + return 0; } - + int TEncodeMapper::EncodeHex(unsigned char& ch) const { const TCharFlags& chflags = TEncoder::GetFlags(ch); const ui64 flags = Flags & chflags.FeatFlags; - + if (flags & TFeature::FeatureToLower) ch += dD; - + if (Q_DecodeAny) return -1; - + if (chflags.IsDecode(FldMask, Flags)) return 0; - + if (' ' == ch) { if (!Q_EncodeSpcAsPlus) return 1; @@ -128,21 +128,21 @@ namespace NUri { return 0; } - return 1; + return 1; } - + bool TEncodeToMapper::Encode(unsigned char ch) const { if (Q_DecodeAny) return false; - + const TCharFlags& chflags = TEncoder::GetFlags(ch); if (FldMask & chflags.EncodeFld) return true; - + const ui64 flags = Flags & chflags.FeatFlags; return (flags & TFeature::FeaturesEncode); } - + TEncoder::TEncoder(IOutputStream& out, const TEncodeMapper& fldsrc, const TEncodeToMapper& flddst) : Out(out) , FldSrc(fldsrc) @@ -151,12 +151,12 @@ namespace NUri { , HexValue(0) { } - + IOutputStream& TEncoder::Hex(IOutputStream& out, unsigned char val) { static const char sHexCodes[] = "0123456789ABCDEF"; return out << sHexCodes[(val >> 4) & 0xF] << sHexCodes[val & 0xF]; } - + IOutputStream& TEncoder::EncodeAll(IOutputStream& out, const TStringBuf& val) { for (size_t i = 0; i != val.length(); ++i) Encode(out, val[i]); @@ -173,7 +173,7 @@ namespace NUri { } return out; } - + IOutputStream& TEncoder::EncodeField( IOutputStream& out, const TStringBuf& val, TField::EField fld) { const ui32 fldmask = ui32(1) << fld; @@ -210,11 +210,11 @@ namespace NUri { Out << ch; return; } - + Out << '%'; if (escapepct) Out.Write("25", 2); // '%' Hex(Out, ch); } - } + } } |