-
Notifications
You must be signed in to change notification settings - Fork 814
/
brave_translate_redirect_network_delegate_helper.cc
124 lines (101 loc) · 4.32 KB
/
brave_translate_redirect_network_delegate_helper.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/* Copyright (c) 2019 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "brave/browser/net/brave_translate_redirect_network_delegate_helper.h"
#include <memory>
#include <string>
#include <vector>
#include "brave/common/translate_network_constants.h"
#include "brave/components/translate/core/browser/brave_translate_features.h"
#include "extensions/common/url_pattern.h"
#include "net/base/net_errors.h"
namespace {
const char kTranslateElementLibQuery[] = "client=te_lib";
int OkIfBraveTranslateGoAvailableElseAbort() {
return translate::IsBraveTranslateGoAvailable() ? net::OK : net::ERR_ABORTED;
}
} // namespace
namespace brave {
bool IsTranslateScriptRequest(const GURL& gurl) {
static std::vector<URLPattern> translate_patterns({
URLPattern(URLPattern::SCHEME_HTTPS, kTranslateElementMainJSPattern),
URLPattern(URLPattern::SCHEME_HTTPS, kTranslateMainJSPattern),
});
return std::any_of(translate_patterns.begin(), translate_patterns.end(),
[&gurl](URLPattern pattern) {
return pattern.MatchesURL(gurl);
});
}
bool IsTranslateResourceRequest(const GURL& gurl) {
static std::vector<URLPattern> translate_patterns({
URLPattern(URLPattern::SCHEME_HTTPS, kTranslateElementMainCSSPattern),
URLPattern(URLPattern::SCHEME_HTTPS, kTranslateBrandingPNGPattern),
});
return std::any_of(translate_patterns.begin(), translate_patterns.end(),
[&gurl](URLPattern pattern) {
return pattern.MatchesURL(gurl);
});
}
bool IsTranslateRequest(const GURL& gurl) {
static URLPattern translate_pattern =
URLPattern(URLPattern::SCHEME_HTTPS, kTranslateRequestPattern);
return translate_pattern.MatchesURL(gurl);
}
bool IsTranslateGen204Request(const GURL& gurl) {
static URLPattern pattern = URLPattern(URLPattern::SCHEME_HTTPS,
kTranslateGen204Pattern);
bool is_te_lib =
gurl.spec().find(kTranslateElementLibQuery) != std::string::npos;
return is_te_lib && pattern.MatchesURL(gurl);
}
int OnBeforeURLRequest_TranslateRedirectWork(
const ResponseCallback& next_callback,
std::shared_ptr<BraveRequestInfo> ctx) {
GURL::Replacements replacements;
if (translate::DisableTranslateLibraryNetworkRedirects())
return net::OK;
// Skip extensions/service-worker/etc requests.
if (!ctx->initiator_url.SchemeIsHTTPOrHTTPS())
return net::OK;
const static std::string kTranslateInitiatorHost(
GURL(kTranslateInitiatorURL).host());
const static std::string kTranslateGen204PatternHost(
GURL(kTranslateGen204Pattern).host());
const static std::string kTranslateBrandingPngHost(
GURL(kTranslateBrandingPNGPattern).host());
// Fast way to exclude any unrelated requests.
if (ctx->request_url.host_piece() != kTranslateInitiatorHost ||
ctx->request_url.host_piece() != kTranslateGen204PatternHost ||
ctx->request_url.host_piece() != kTranslateBrandingPngHost) {
return net::OK;
}
// Abort those gen204 requests triggered by translate element library.
if (IsTranslateGen204Request(ctx->request_url)) {
return net::ERR_ABORTED;
}
// For those translate resources which might be triggered by translate
// element library, go through brave's proxy so we won't introduce direct
// connection to google when using translate element library.
if (IsTranslateResourceRequest(ctx->request_url)) {
replacements.SetPathStr(ctx->request_url.path_piece());
ctx->new_url_spec =
GURL(kBraveTranslateEndpoint).ReplaceComponents(replacements).spec();
return OkIfBraveTranslateGoAvailableElseAbort();
}
if (IsTranslateScriptRequest(ctx->request_url)) {
replacements.SetQueryStr(ctx->request_url.query_piece());
replacements.SetPathStr(ctx->request_url.path_piece());
ctx->new_url_spec =
GURL(kBraveTranslateEndpoint).ReplaceComponents(replacements).spec();
return OkIfBraveTranslateGoAvailableElseAbort();
}
if (IsTranslateRequest(ctx->request_url)) {
replacements.SetQueryStr(ctx->request_url.query_piece());
ctx->new_url_spec =
GURL(kBraveTranslateEndpoint).ReplaceComponents(replacements).spec();
return OkIfBraveTranslateGoAvailableElseAbort();
}
return net::OK;
}
} // namespace brave