scheme.ipp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. //
  2. // Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
  3. //
  4. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. //
  7. // Official repository: https://github.com/boostorg/url
  8. //
  9. #ifndef BOOST_URL_IMPL_SCHEME_IPP
  10. #define BOOST_URL_IMPL_SCHEME_IPP
  11. #include <boost/url/scheme.hpp>
  12. #include <boost/url/grammar/ci_string.hpp>
  13. namespace boost {
  14. namespace urls {
  15. scheme
  16. string_to_scheme(
  17. string_view s) noexcept
  18. {
  19. using grammar::to_lower;
  20. switch(s.size())
  21. {
  22. case 0: // none
  23. return scheme::none;
  24. case 2: // ws
  25. if( to_lower(s[0]) == 'w' &&
  26. to_lower(s[1]) == 's')
  27. return scheme::ws;
  28. break;
  29. case 3:
  30. switch(to_lower(s[0]))
  31. {
  32. case 'w': // wss
  33. if( to_lower(s[1]) == 's' &&
  34. to_lower(s[2]) == 's')
  35. return scheme::wss;
  36. break;
  37. case 'f': // ftp
  38. if( to_lower(s[1]) == 't' &&
  39. to_lower(s[2]) == 'p')
  40. return scheme::ftp;
  41. break;
  42. default:
  43. break;
  44. }
  45. break;
  46. case 4:
  47. switch(to_lower(s[0]))
  48. {
  49. case 'f': // file
  50. if( to_lower(s[1]) == 'i' &&
  51. to_lower(s[2]) == 'l' &&
  52. to_lower(s[3]) == 'e')
  53. return scheme::file;
  54. break;
  55. case 'h': // http
  56. if( to_lower(s[1]) == 't' &&
  57. to_lower(s[2]) == 't' &&
  58. to_lower(s[3]) == 'p')
  59. return scheme::http;
  60. break;
  61. default:
  62. break;
  63. }
  64. break;
  65. case 5: // https
  66. if( to_lower(s[0]) == 'h' &&
  67. to_lower(s[1]) == 't' &&
  68. to_lower(s[2]) == 't' &&
  69. to_lower(s[3]) == 'p' &&
  70. to_lower(s[4]) == 's')
  71. return scheme::https;
  72. break;
  73. default:
  74. break;
  75. }
  76. return scheme::unknown;
  77. }
  78. string_view
  79. to_string(scheme s) noexcept
  80. {
  81. switch(s)
  82. {
  83. case scheme::ftp: return "ftp";
  84. case scheme::file: return "file";
  85. case scheme::http: return "http";
  86. case scheme::https: return "https";
  87. case scheme::ws: return "ws";
  88. case scheme::wss: return "wss";
  89. case scheme::none: return {};
  90. default:
  91. break;
  92. }
  93. return "<unknown>";
  94. }
  95. std::uint16_t
  96. default_port(scheme s) noexcept
  97. {
  98. switch(s)
  99. {
  100. case scheme::ftp:
  101. return 21;
  102. case scheme::http:
  103. case scheme::ws:
  104. return 80;
  105. case scheme::https:
  106. case scheme::wss:
  107. return 443;
  108. default:
  109. break;
  110. }
  111. return 0;
  112. }
  113. } // urls
  114. } // boost
  115. #endif