url_request_rewrite_type_converters.cc 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. // Copyright 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "fuchsia_web/webengine/browser/url_request_rewrite_type_converters.h"
  5. #include "base/strings/strcat.h"
  6. #include "base/strings/string_piece.h"
  7. #include "base/strings/string_util.h"
  8. #include "fuchsia_web/common/string_util.h"
  9. #include "net/base/url_util.h"
  10. namespace {
  11. std::string NormalizeHost(base::StringPiece host) {
  12. return GURL(base::StrCat({url::kHttpScheme, "://", host})).host();
  13. }
  14. } // namespace
  15. namespace mojo {
  16. template <>
  17. struct TypeConverter<url_rewrite::mojom::UrlRequestRewriteAddHeadersPtr,
  18. fuchsia::web::UrlRequestRewriteAddHeaders> {
  19. static url_rewrite::mojom::UrlRequestRewriteAddHeadersPtr Convert(
  20. const fuchsia::web::UrlRequestRewriteAddHeaders& input) {
  21. url_rewrite::mojom::UrlRequestRewriteAddHeadersPtr add_headers =
  22. url_rewrite::mojom::UrlRequestRewriteAddHeaders::New();
  23. if (input.has_headers()) {
  24. for (const auto& header : input.headers()) {
  25. base::StringPiece header_name = BytesAsString(header.name);
  26. base::StringPiece header_value = BytesAsString(header.value);
  27. url_rewrite::mojom::UrlHeaderPtr url_header =
  28. url_rewrite::mojom::UrlHeader::New(std::string(header_name),
  29. std::string(header_value));
  30. add_headers->headers.push_back(std::move(url_header));
  31. }
  32. }
  33. return add_headers;
  34. }
  35. };
  36. template <>
  37. struct TypeConverter<url_rewrite::mojom::UrlRequestRewriteRemoveHeaderPtr,
  38. fuchsia::web::UrlRequestRewriteRemoveHeader> {
  39. static url_rewrite::mojom::UrlRequestRewriteRemoveHeaderPtr Convert(
  40. const fuchsia::web::UrlRequestRewriteRemoveHeader& input) {
  41. url_rewrite::mojom::UrlRequestRewriteRemoveHeaderPtr remove_header =
  42. url_rewrite::mojom::UrlRequestRewriteRemoveHeader::New();
  43. if (input.has_query_pattern())
  44. remove_header->query_pattern = absl::make_optional(input.query_pattern());
  45. if (input.has_header_name()) {
  46. remove_header->header_name =
  47. std::string(BytesAsString(input.header_name()));
  48. }
  49. return remove_header;
  50. }
  51. };
  52. template <>
  53. struct TypeConverter<
  54. url_rewrite::mojom::UrlRequestRewriteSubstituteQueryPatternPtr,
  55. fuchsia::web::UrlRequestRewriteSubstituteQueryPattern> {
  56. static url_rewrite::mojom::UrlRequestRewriteSubstituteQueryPatternPtr Convert(
  57. const fuchsia::web::UrlRequestRewriteSubstituteQueryPattern& input) {
  58. url_rewrite::mojom::UrlRequestRewriteSubstituteQueryPatternPtr
  59. substitute_query_pattern =
  60. url_rewrite::mojom::UrlRequestRewriteSubstituteQueryPattern::New();
  61. if (input.has_pattern())
  62. substitute_query_pattern->pattern = input.pattern();
  63. if (input.has_substitution())
  64. substitute_query_pattern->substitution = input.substitution();
  65. return substitute_query_pattern;
  66. }
  67. };
  68. template <>
  69. struct TypeConverter<url_rewrite::mojom::UrlRequestRewriteReplaceUrlPtr,
  70. fuchsia::web::UrlRequestRewriteReplaceUrl> {
  71. static url_rewrite::mojom::UrlRequestRewriteReplaceUrlPtr Convert(
  72. const fuchsia::web::UrlRequestRewriteReplaceUrl& input) {
  73. url_rewrite::mojom::UrlRequestRewriteReplaceUrlPtr replace_url =
  74. url_rewrite::mojom::UrlRequestRewriteReplaceUrl::New();
  75. if (input.has_url_ends_with())
  76. replace_url->url_ends_with = input.url_ends_with();
  77. if (input.has_new_url())
  78. replace_url->new_url = GURL(input.new_url());
  79. return replace_url;
  80. }
  81. };
  82. template <>
  83. struct TypeConverter<url_rewrite::mojom::UrlRequestRewriteAppendToQueryPtr,
  84. fuchsia::web::UrlRequestRewriteAppendToQuery> {
  85. static url_rewrite::mojom::UrlRequestRewriteAppendToQueryPtr Convert(
  86. const fuchsia::web::UrlRequestRewriteAppendToQuery& input) {
  87. url_rewrite::mojom::UrlRequestRewriteAppendToQueryPtr append_to_query =
  88. url_rewrite::mojom::UrlRequestRewriteAppendToQuery::New();
  89. if (input.has_query())
  90. append_to_query->query = input.query();
  91. return append_to_query;
  92. }
  93. };
  94. template <>
  95. struct TypeConverter<url_rewrite::mojom::UrlRequestAccessPolicy,
  96. fuchsia::web::UrlRequestAction> {
  97. static url_rewrite::mojom::UrlRequestAccessPolicy Convert(
  98. const fuchsia::web::UrlRequestAction& input) {
  99. switch (input) {
  100. case fuchsia::web::UrlRequestAction::ALLOW:
  101. return url_rewrite::mojom::UrlRequestAccessPolicy::kAllow;
  102. case fuchsia::web::UrlRequestAction::DENY:
  103. return url_rewrite::mojom::UrlRequestAccessPolicy::kDeny;
  104. }
  105. }
  106. };
  107. template <>
  108. struct TypeConverter<url_rewrite::mojom::UrlRequestActionPtr,
  109. fuchsia::web::UrlRequestRewrite> {
  110. static url_rewrite::mojom::UrlRequestActionPtr Convert(
  111. const fuchsia::web::UrlRequestRewrite& input) {
  112. switch (input.Which()) {
  113. case fuchsia::web::UrlRequestRewrite::Tag::kAddHeaders:
  114. return url_rewrite::mojom::UrlRequestAction::NewAddHeaders(
  115. mojo::ConvertTo<url_rewrite::mojom::UrlRequestRewriteAddHeadersPtr>(
  116. input.add_headers()));
  117. case fuchsia::web::UrlRequestRewrite::Tag::kRemoveHeader:
  118. return url_rewrite::mojom::UrlRequestAction::NewRemoveHeader(
  119. mojo::ConvertTo<
  120. url_rewrite::mojom::UrlRequestRewriteRemoveHeaderPtr>(
  121. input.remove_header()));
  122. case fuchsia::web::UrlRequestRewrite::Tag::kSubstituteQueryPattern:
  123. return url_rewrite::mojom::UrlRequestAction::NewSubstituteQueryPattern(
  124. mojo::ConvertTo<
  125. url_rewrite::mojom::UrlRequestRewriteSubstituteQueryPatternPtr>(
  126. input.substitute_query_pattern()));
  127. case fuchsia::web::UrlRequestRewrite::Tag::kReplaceUrl:
  128. return url_rewrite::mojom::UrlRequestAction::NewReplaceUrl(
  129. mojo::ConvertTo<url_rewrite::mojom::UrlRequestRewriteReplaceUrlPtr>(
  130. input.replace_url()));
  131. case fuchsia::web::UrlRequestRewrite::Tag::kAppendToQuery:
  132. return url_rewrite::mojom::UrlRequestAction::NewAppendToQuery(
  133. mojo::ConvertTo<
  134. url_rewrite::mojom::UrlRequestRewriteAppendToQueryPtr>(
  135. input.append_to_query()));
  136. default:
  137. return nullptr;
  138. }
  139. }
  140. };
  141. template <>
  142. struct TypeConverter<url_rewrite::mojom::UrlRequestRulePtr,
  143. fuchsia::web::UrlRequestRewriteRule> {
  144. static url_rewrite::mojom::UrlRequestRulePtr Convert(
  145. const fuchsia::web::UrlRequestRewriteRule& input) {
  146. url_rewrite::mojom::UrlRequestRulePtr rule =
  147. url_rewrite::mojom::UrlRequestRule::New();
  148. if (input.has_hosts_filter()) {
  149. // Convert host names in case they contain non-ASCII characters.
  150. const base::StringPiece kWildcard("*.");
  151. std::vector<std::string> hosts;
  152. for (const base::StringPiece host : input.hosts_filter()) {
  153. if (base::StartsWith(host, kWildcard, base::CompareCase::SENSITIVE)) {
  154. hosts.push_back(
  155. base::StrCat({kWildcard, NormalizeHost(host.substr(2))}));
  156. } else {
  157. hosts.push_back(NormalizeHost(host));
  158. }
  159. }
  160. rule->hosts_filter = std::move(hosts);
  161. }
  162. if (input.has_schemes_filter())
  163. rule->schemes_filter = absl::make_optional(input.schemes_filter());
  164. if (input.has_rewrites()) {
  165. rule->actions =
  166. mojo::ConvertTo<std::vector<url_rewrite::mojom::UrlRequestActionPtr>>(
  167. input.rewrites());
  168. } else if (input.has_action()) {
  169. rule->actions = std::vector<url_rewrite::mojom::UrlRequestActionPtr>();
  170. rule->actions.push_back(url_rewrite::mojom::UrlRequestAction::NewPolicy(
  171. mojo::ConvertTo<url_rewrite::mojom::UrlRequestAccessPolicy>(
  172. input.action())));
  173. }
  174. return rule;
  175. }
  176. };
  177. url_rewrite::mojom::UrlRequestRewriteRulesPtr
  178. TypeConverter<url_rewrite::mojom::UrlRequestRewriteRulesPtr,
  179. std::vector<fuchsia::web::UrlRequestRewriteRule>>::
  180. Convert(const std::vector<fuchsia::web::UrlRequestRewriteRule>& input) {
  181. url_rewrite::mojom::UrlRequestRewriteRulesPtr rules =
  182. url_rewrite::mojom::UrlRequestRewriteRules::New();
  183. for (const auto& rule : input) {
  184. rules->rules.push_back(
  185. mojo::ConvertTo<url_rewrite::mojom::UrlRequestRulePtr>(rule));
  186. }
  187. return rules;
  188. }
  189. } // namespace mojo