mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-19 16:25:38 +00:00
Bug 1689474 - Make sure sending queries to ODoH proxy is working r=necko-reviewers,valentin
Differential Revision: https://phabricator.services.mozilla.com/D103817
This commit is contained in:
parent
a3582caf5e
commit
660e474854
@ -72,13 +72,13 @@ nsresult ODoHService::ReadPrefs(const char* aName) {
|
|||||||
if (!aName || !strcmp(aName, kODoHProxyURIPref) ||
|
if (!aName || !strcmp(aName, kODoHProxyURIPref) ||
|
||||||
!strcmp(aName, kODoHTargetHostPref) ||
|
!strcmp(aName, kODoHTargetHostPref) ||
|
||||||
!strcmp(aName, kODoHTargetPathPref)) {
|
!strcmp(aName, kODoHTargetPathPref)) {
|
||||||
OnODoHPrefsChange();
|
OnODoHPrefsChange(aName == nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ODoHService::OnODoHPrefsChange() {
|
void ODoHService::OnODoHPrefsChange(bool aInit) {
|
||||||
nsAutoCString proxyURI;
|
nsAutoCString proxyURI;
|
||||||
Preferences::GetCString(kODoHProxyURIPref, proxyURI);
|
Preferences::GetCString(kODoHProxyURIPref, proxyURI);
|
||||||
nsAutoCString targetHost;
|
nsAutoCString targetHost;
|
||||||
@ -101,10 +101,34 @@ void ODoHService::OnODoHPrefsChange() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (updateODoHConfig) {
|
if (updateODoHConfig) {
|
||||||
UpdateODoHConfig();
|
// When this function is called from ODoHService::Init(), it's on the same
|
||||||
|
// call stack as nsDNSService is inited. In this case, we need to dispatch
|
||||||
|
// UpdateODoHConfig(), since recursively getting DNS service is not allowed.
|
||||||
|
auto task = []() { gODoHService->UpdateODoHConfig(); };
|
||||||
|
if (aInit) {
|
||||||
|
NS_DispatchToMainThread(NS_NewRunnableFunction(
|
||||||
|
"ODoHService::UpdateODoHConfig", std::move(task)));
|
||||||
|
} else {
|
||||||
|
task();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static nsresult ExtractHost(const nsACString& aURI, nsCString& aResult) {
|
||||||
|
nsCOMPtr<nsIURI> uri;
|
||||||
|
nsresult rv = NS_NewURI(getter_AddRefs(uri), aURI);
|
||||||
|
if (NS_FAILED(rv)) {
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!uri->SchemeIs("https")) {
|
||||||
|
LOG(("ODoHService host uri is not https"));
|
||||||
|
return NS_ERROR_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return uri->GetAsciiHost(aResult);
|
||||||
|
}
|
||||||
|
|
||||||
void ODoHService::BuildODoHRequestURI() {
|
void ODoHService::BuildODoHRequestURI() {
|
||||||
mLock.AssertCurrentThreadOwns();
|
mLock.AssertCurrentThreadOwns();
|
||||||
|
|
||||||
@ -118,9 +142,14 @@ void ODoHService::BuildODoHRequestURI() {
|
|||||||
mODoHRequestURI.AppendLiteral("/");
|
mODoHRequestURI.AppendLiteral("/");
|
||||||
mODoHRequestURI.Append(mODoHTargetPath);
|
mODoHRequestURI.Append(mODoHTargetPath);
|
||||||
} else {
|
} else {
|
||||||
|
nsAutoCString hostStr;
|
||||||
|
if (NS_FAILED(ExtractHost(mODoHTargetHost, hostStr))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
mODoHRequestURI.Append(mODoHProxyURI);
|
mODoHRequestURI.Append(mODoHProxyURI);
|
||||||
mODoHRequestURI.AppendLiteral("?targethost=");
|
mODoHRequestURI.AppendLiteral("?targethost=");
|
||||||
mODoHRequestURI.Append(mODoHTargetHost);
|
mODoHRequestURI.Append(hostStr);
|
||||||
mODoHRequestURI.AppendLiteral("&targetpath=/");
|
mODoHRequestURI.AppendLiteral("&targetpath=/");
|
||||||
mODoHRequestURI.Append(mODoHTargetPath);
|
mODoHRequestURI.Append(mODoHTargetPath);
|
||||||
}
|
}
|
||||||
@ -140,7 +169,7 @@ nsresult ODoHService::UpdateODoHConfig() {
|
|||||||
nsAutoCString uri;
|
nsAutoCString uri;
|
||||||
{
|
{
|
||||||
MutexAutoLock lock(mLock);
|
MutexAutoLock lock(mLock);
|
||||||
uri = mODoHProxyURI.IsEmpty() ? mODoHTargetHost : mODoHProxyURI;
|
uri = mODoHTargetHost;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsCOMPtr<nsIDNSService> dns(
|
nsCOMPtr<nsIDNSService> dns(
|
||||||
@ -153,21 +182,8 @@ nsresult ODoHService::UpdateODoHConfig() {
|
|||||||
return NS_ERROR_NOT_AVAILABLE;
|
return NS_ERROR_NOT_AVAILABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsCOMPtr<nsIURI> queryURI;
|
|
||||||
nsresult rv = NS_NewURI(getter_AddRefs(queryURI), uri);
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsAutoCString scheme;
|
|
||||||
queryURI->GetScheme(scheme);
|
|
||||||
if (!scheme.Equals("https")) {
|
|
||||||
LOG(("ODoHService::UpdateODoHConfig uri is not https"));
|
|
||||||
return NS_ERROR_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsAutoCString hostStr;
|
nsAutoCString hostStr;
|
||||||
rv = queryURI->GetAsciiHost(hostStr);
|
nsresult rv = ExtractHost(uri, hostStr);
|
||||||
if (NS_FAILED(rv)) {
|
if (NS_FAILED(rv)) {
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
@ -34,13 +34,13 @@ class ODoHService : public nsIDNSListener,
|
|||||||
const Maybe<nsTArray<ObliviousDoHConfig>>& ODoHConfigs();
|
const Maybe<nsTArray<ObliviousDoHConfig>>& ODoHConfigs();
|
||||||
void AppendPendingODoHRequest(ODoH* aRequest);
|
void AppendPendingODoHRequest(ODoH* aRequest);
|
||||||
void GetRequestURI(nsACString& aResult);
|
void GetRequestURI(nsACString& aResult);
|
||||||
|
// Send a DNS query to reterive the ODoHConfig.
|
||||||
nsresult UpdateODoHConfig();
|
nsresult UpdateODoHConfig();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual ~ODoHService();
|
virtual ~ODoHService();
|
||||||
nsresult ReadPrefs(const char* aName);
|
nsresult ReadPrefs(const char* aName);
|
||||||
void OnODoHPrefsChange();
|
void OnODoHPrefsChange(bool aInit);
|
||||||
// Send a DNS query to reterive the ODoHConfig.
|
|
||||||
void BuildODoHRequestURI();
|
void BuildODoHRequestURI();
|
||||||
|
|
||||||
Mutex mLock;
|
Mutex mLock;
|
||||||
|
Loading…
Reference in New Issue
Block a user