common.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #include "common.h"
  2. #include <util/generic/map.h>
  3. #include <util/generic/singleton.h>
  4. namespace NUri {
  5. static_assert(TFeature::FeatureMAX <= sizeof(ui64) * 8, "expect TFeature::FeatureMAX <= sizeof(ui64) * 8");
  6. const TSchemeInfo TSchemeInfo::Registry[] = {
  7. TSchemeInfo(TScheme::SchemeEmpty, TStringBuf()), // scheme is empty and inited
  8. TSchemeInfo(TScheme::SchemeHTTP, TStringBuf("http"), TField::FlagHost | TField::FlagPath, 80),
  9. TSchemeInfo(TScheme::SchemeHTTPS, TStringBuf("https"), TField::FlagHost | TField::FlagPath, 443),
  10. TSchemeInfo(TScheme::SchemeFTP, TStringBuf("ftp"), TField::FlagHost | TField::FlagPath, 20),
  11. TSchemeInfo(TScheme::SchemeFILE, TStringBuf("file"), TField::FlagPath),
  12. TSchemeInfo(TScheme::SchemeWS, TStringBuf("ws"), TField::FlagHost | TField::FlagPath, 80),
  13. TSchemeInfo(TScheme::SchemeWSS, TStringBuf("wss"), TField::FlagHost | TField::FlagPath, 443),
  14. // add above
  15. TSchemeInfo(TScheme::SchemeUnknown, TStringBuf()) // scheme is empty and uninited
  16. };
  17. namespace {
  18. struct TLessNoCase {
  19. bool operator()(const TStringBuf& lt, const TStringBuf& rt) const {
  20. return 0 > CompareNoCase(lt, rt);
  21. }
  22. };
  23. class TSchemeInfoMap {
  24. typedef TMap<TStringBuf, TScheme::EKind, TLessNoCase> TdMap;
  25. TdMap Map_;
  26. public:
  27. TSchemeInfoMap() {
  28. for (int i = TScheme::SchemeEmpty; i < TScheme::SchemeUnknown; ++i) {
  29. const TSchemeInfo& info = TSchemeInfo::Get(TScheme::EKind(i));
  30. Map_.insert(std::make_pair(info.Str, info.Kind));
  31. }
  32. }
  33. TScheme::EKind Get(const TStringBuf& scheme) const {
  34. const TdMap::const_iterator it = Map_.find(scheme);
  35. return Map_.end() == it ? TScheme::SchemeUnknown : it->second;
  36. }
  37. static const TSchemeInfoMap& Instance() {
  38. return *Singleton<TSchemeInfoMap>();
  39. }
  40. };
  41. }
  42. const TSchemeInfo& TSchemeInfo::Get(const TStringBuf& scheme) {
  43. return Registry[TSchemeInfoMap::Instance().Get(scheme)];
  44. }
  45. const char* ParsedStateToString(const TState::EParsed& t) {
  46. switch (t) {
  47. case TState::ParsedOK:
  48. return "ParsedOK";
  49. case TState::ParsedEmpty:
  50. return "ParsedEmpty";
  51. case TState::ParsedRootless:
  52. return "ParsedRootless";
  53. case TState::ParsedBadFormat:
  54. return "ParsedBadFormat";
  55. case TState::ParsedBadPath:
  56. return "ParsedBadPath";
  57. case TState::ParsedTooLong:
  58. return "ParsedTooLong";
  59. case TState::ParsedBadPort:
  60. return "ParsedBadPort";
  61. case TState::ParsedBadAuth:
  62. return "ParsedBadAuth";
  63. case TState::ParsedBadScheme:
  64. return "ParsedBadScheme";
  65. case TState::ParsedBadHost:
  66. return "ParsedBadHost";
  67. default:
  68. return "Parsed[Unknown]";
  69. }
  70. }
  71. const char* FieldToString(const TField::EField& t) {
  72. switch (t) {
  73. case TField::FieldScheme:
  74. return "scheme";
  75. case TField::FieldUser:
  76. return "username";
  77. case TField::FieldPass:
  78. return "password";
  79. case TField::FieldHost:
  80. return "host";
  81. case TField::FieldHostAscii:
  82. return "hostascii";
  83. case TField::FieldPort:
  84. return "port";
  85. case TField::FieldPath:
  86. return "path";
  87. case TField::FieldQuery:
  88. return "query";
  89. case TField::FieldFrag:
  90. return "fragment";
  91. case TField::FieldHashBang:
  92. return "hashbang";
  93. default:
  94. return "Field[Unknown]";
  95. }
  96. }
  97. const char* SchemeKindToString(const TScheme::EKind& t) {
  98. const TSchemeInfo& info = TSchemeInfo::Get(t);
  99. if (!info.Str.empty())
  100. return info.Str.data();
  101. return TScheme::SchemeEmpty == t ? "empty" : "unknown";
  102. }
  103. }