[go: nahoru, domu]

blob: 7d70a43c1bb7b6af33ee5a4ee03b08406c1ae0c3 [file] [log] [blame]
Avi Drissmand878a5012022-09-12 19:13:301// Copyright 2019 The Chromium Authors
Vigen Issahhanjan23455452021-12-01 00:32:012// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Vigen Issahhanjan9c30d482021-12-21 19:03:045#include "chromecast/cast_core/runtime/browser/url_rewrite/url_request_rewrite_type_converters.h"
Vigen Issahhanjan23455452021-12-01 00:32:016
7#include "base/strings/strcat.h"
8#include "base/strings/string_piece.h"
9#include "base/strings/string_util.h"
10
11namespace {
12
13std::string NormalizeHost(base::StringPiece host) {
14 return GURL(base::StrCat({url::kHttpScheme, "://", host})).host();
15}
16
17} // namespace
18
19namespace mojo {
20
21template <>
22struct TypeConverter<url_rewrite::mojom::UrlRequestRewriteAddHeadersPtr,
23 cast::v2::UrlRequestRewriteAddHeaders> {
24 static url_rewrite::mojom::UrlRequestRewriteAddHeadersPtr Convert(
25 const cast::v2::UrlRequestRewriteAddHeaders& input) {
26 url_rewrite::mojom::UrlRequestRewriteAddHeadersPtr add_headers =
27 url_rewrite::mojom::UrlRequestRewriteAddHeaders::New();
28 for (const auto& header : input.headers()) {
29 url_rewrite::mojom::UrlHeaderPtr url_header =
30 url_rewrite::mojom::UrlHeader::New(header.name(), header.value());
31 add_headers->headers.push_back(std::move(url_header));
32 }
33 return add_headers;
34 }
35};
36
37template <>
38struct TypeConverter<url_rewrite::mojom::UrlRequestRewriteRemoveHeaderPtr,
39 cast::v2::UrlRequestRewriteRemoveHeader> {
40 static url_rewrite::mojom::UrlRequestRewriteRemoveHeaderPtr Convert(
41 const cast::v2::UrlRequestRewriteRemoveHeader& input) {
42 url_rewrite::mojom::UrlRequestRewriteRemoveHeaderPtr remove_header =
43 url_rewrite::mojom::UrlRequestRewriteRemoveHeader::New();
44 if (!input.query_pattern().empty())
45 remove_header->query_pattern = absl::make_optional(input.query_pattern());
46 if (!input.header_name().empty())
47 remove_header->header_name = input.header_name();
48 return remove_header;
49 }
50};
51
52template <>
53struct TypeConverter<
54 url_rewrite::mojom::UrlRequestRewriteSubstituteQueryPatternPtr,
55 cast::v2::UrlRequestRewriteSubstituteQueryPattern> {
56 static url_rewrite::mojom::UrlRequestRewriteSubstituteQueryPatternPtr Convert(
57 const cast::v2::UrlRequestRewriteSubstituteQueryPattern& input) {
58 url_rewrite::mojom::UrlRequestRewriteSubstituteQueryPatternPtr
59 substitute_query_pattern =
60 url_rewrite::mojom::UrlRequestRewriteSubstituteQueryPattern::New();
61 if (!input.pattern().empty())
62 substitute_query_pattern->pattern = input.pattern();
63 if (!input.substitution().empty())
64 substitute_query_pattern->substitution = input.substitution();
65 return substitute_query_pattern;
66 }
67};
68
69template <>
70struct TypeConverter<url_rewrite::mojom::UrlRequestRewriteReplaceUrlPtr,
71 cast::v2::UrlRequestRewriteReplaceUrl> {
72 static url_rewrite::mojom::UrlRequestRewriteReplaceUrlPtr Convert(
73 const cast::v2::UrlRequestRewriteReplaceUrl& input) {
74 url_rewrite::mojom::UrlRequestRewriteReplaceUrlPtr replace_url =
75 url_rewrite::mojom::UrlRequestRewriteReplaceUrl::New();
76 if (!input.url_ends_with().empty())
77 replace_url->url_ends_with = input.url_ends_with();
78 if (!input.new_url().empty())
79 replace_url->new_url = GURL(input.new_url());
80 return replace_url;
81 }
82};
83
84template <>
85struct TypeConverter<url_rewrite::mojom::UrlRequestRewriteAppendToQueryPtr,
86 cast::v2::UrlRequestRewriteAppendToQuery> {
87 static url_rewrite::mojom::UrlRequestRewriteAppendToQueryPtr Convert(
88 const cast::v2::UrlRequestRewriteAppendToQuery& input) {
89 url_rewrite::mojom::UrlRequestRewriteAppendToQueryPtr append_to_query =
90 url_rewrite::mojom::UrlRequestRewriteAppendToQuery::New();
91 if (!input.query().empty())
92 append_to_query->query = input.query();
93 return append_to_query;
94 }
95};
96
97// Returns nullptr if conversion is not possible.
98template <>
99struct TypeConverter<url_rewrite::mojom::UrlRequestActionPtr,
100 cast::v2::UrlRequestRewriteRule::UrlRequestAction> {
101 static url_rewrite::mojom::UrlRequestActionPtr Convert(
102 const cast::v2::UrlRequestRewriteRule::UrlRequestAction& input) {
103 // The converter should never get called if policy action is unspecified.
104 DCHECK(input != cast::v2::UrlRequestRewriteRule::ACTION_UNSPECIFIED);
105 switch (input) {
106 case cast::v2::UrlRequestRewriteRule::ALLOW:
107 return url_rewrite::mojom::UrlRequestAction::NewPolicy(
108 mojo::ConvertTo<url_rewrite::mojom::UrlRequestAccessPolicy>(
109 url_rewrite::mojom::UrlRequestAccessPolicy::kAllow));
110 case cast::v2::UrlRequestRewriteRule::DENY:
111 return url_rewrite::mojom::UrlRequestAction::NewPolicy(
112 mojo::ConvertTo<url_rewrite::mojom::UrlRequestAccessPolicy>(
113 url_rewrite::mojom::UrlRequestAccessPolicy::kDeny));
114 default:
115 // Cannot convert the gRPC policy action to a mojo counterpart.
116 return nullptr;
117 }
118 }
119};
120
121// Returns nullptr if conversion is not possible.
122template <>
123struct TypeConverter<url_rewrite::mojom::UrlRequestActionPtr,
124 cast::v2::UrlRequestRewrite> {
125 static url_rewrite::mojom::UrlRequestActionPtr Convert(
126 const cast::v2::UrlRequestRewrite& input) {
127 switch (input.action_case()) {
128 case cast::v2::UrlRequestRewrite::kAddHeaders:
129 return url_rewrite::mojom::UrlRequestAction::NewAddHeaders(
130 mojo::ConvertTo<url_rewrite::mojom::UrlRequestRewriteAddHeadersPtr>(
131 input.add_headers()));
132 case cast::v2::UrlRequestRewrite::kRemoveHeader:
133 return url_rewrite::mojom::UrlRequestAction::NewRemoveHeader(
134 mojo::ConvertTo<
135 url_rewrite::mojom::UrlRequestRewriteRemoveHeaderPtr>(
136 input.remove_header()));
137 case cast::v2::UrlRequestRewrite::kSubstituteQueryPattern:
138 return url_rewrite::mojom::UrlRequestAction::NewSubstituteQueryPattern(
139 mojo::ConvertTo<
140 url_rewrite::mojom::UrlRequestRewriteSubstituteQueryPatternPtr>(
141 input.substitute_query_pattern()));
142 case cast::v2::UrlRequestRewrite::kReplaceUrl:
143 return url_rewrite::mojom::UrlRequestAction::NewReplaceUrl(
144 mojo::ConvertTo<url_rewrite::mojom::UrlRequestRewriteReplaceUrlPtr>(
145 input.replace_url()));
146 case cast::v2::UrlRequestRewrite::kAppendToQuery:
147 return url_rewrite::mojom::UrlRequestAction::NewAppendToQuery(
148 mojo::ConvertTo<
149 url_rewrite::mojom::UrlRequestRewriteAppendToQueryPtr>(
150 input.append_to_query()));
151 case cast::v2::UrlRequestRewrite::ACTION_NOT_SET:
152 // Cannot convert the gRPC rewrite rule to a mojo counterpart.
153 return nullptr;
154 }
155 }
156};
157
158// Returns nullptr if conversion is not possible.
159template <>
160struct TypeConverter<url_rewrite::mojom::UrlRequestRulePtr,
161 cast::v2::UrlRequestRewriteRule> {
162 static url_rewrite::mojom::UrlRequestRulePtr Convert(
163 const cast::v2::UrlRequestRewriteRule& input) {
164 url_rewrite::mojom::UrlRequestRulePtr rule =
165 url_rewrite::mojom::UrlRequestRule::New();
166
167 if (!input.host_filters().empty()) {
168 // Convert host names in case they contain non-ASCII characters.
169 const base::StringPiece kWildcard("*.");
170
171 std::vector<std::string> hosts;
172 for (base::StringPiece host : input.host_filters()) {
173 if (base::StartsWith(host, kWildcard, base::CompareCase::SENSITIVE)) {
174 hosts.push_back(
175 base::StrCat({kWildcard, NormalizeHost(host.substr(2))}));
176 } else {
177 hosts.push_back(NormalizeHost(host));
178 }
179 }
180 rule->hosts_filter = std::move(hosts);
181 }
182
183 if (!input.scheme_filters().empty())
184 rule->schemes_filter.emplace(input.scheme_filters().begin(),
185 input.scheme_filters().end());
186
187 // Convert the rewrite rules.
188 for (const cast::v2::UrlRequestRewrite& grpc_rewrite : input.rewrites()) {
189 auto action = mojo::ConvertTo<url_rewrite::mojom::UrlRequestActionPtr>(
190 grpc_rewrite);
191 if (!action) {
192 // Conversion to Mojo failed.
193 return nullptr;
194 }
195 rule->actions.push_back(std::move(action));
196 }
197
198 // Convert the action policy.
199 if (input.action() != cast::v2::UrlRequestRewriteRule::ACTION_UNSPECIFIED) {
200 // Convert the action policy.
201 auto policy = mojo::ConvertTo<url_rewrite::mojom::UrlRequestActionPtr>(
202 input.action());
203 if (!policy) {
204 // Conversion to Mojo failed.
205 return nullptr;
206 }
207 rule->actions.push_back(std::move(policy));
208 }
209
210 return rule;
211 }
212};
213
214url_rewrite::mojom::UrlRequestRewriteRulesPtr
215TypeConverter<url_rewrite::mojom::UrlRequestRewriteRulesPtr,
216 cast::v2::UrlRequestRewriteRules>::
217 Convert(const cast::v2::UrlRequestRewriteRules& input) {
218 url_rewrite::mojom::UrlRequestRewriteRulesPtr rules =
219 url_rewrite::mojom::UrlRequestRewriteRules::New();
220 for (const auto& rule : input.rules()) {
221 auto mojo_rule =
222 mojo::ConvertTo<url_rewrite::mojom::UrlRequestRulePtr>(rule);
223 if (!mojo_rule) {
224 // Conversion to Mojo failed.
225 return nullptr;
226 }
227 rules->rules.push_back(std::move(mojo_rule));
228 }
229 return rules;
230}
231
232} // namespace mojo