Skip to content

Commit

Permalink
[0.72] Omit trailing slash in Origin header (#12794)
Browse files Browse the repository at this point in the history
* Omit trailing slash in Origin header

* Remove change file

* Change files
  • Loading branch information
JunielKatarn committed Mar 5, 2024
1 parent cbda34b commit b97a232
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "patch",
"comment": "Omit trailing slash in Origin header #12791",
"packageName": "react-native-windows",
"email": "julio.rocha@microsoft.com",
"dependentChangeType": "patch"
}
27 changes: 27 additions & 0 deletions vnext/Desktop.UnitTests/OriginPolicyHttpFilterTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,33 @@ TEST_CLASS (OriginPolicyHttpFilterTest) {
Assert::Fail(e.message().c_str());
}
}

TEST_METHOD(GetOriginRespectsDefaultPorts) {
constexpr const wchar_t *urls[] = {
L"http://site.ext",
L"https://site.ext",
L"http://site.ext:80",
L"https://site.ext:443",
L"http://site.ext:5555",
L"https://site.ext:5555",
L"http://site.ext:443",
L"https://site.ext:80"};

constexpr const wchar_t *expected[] = {
L"http://site.ext",
L"https://site.ext",
L"http://site.ext",
L"https://site.ext",
L"http://site.ext:5555",
L"https://site.ext:5555",
L"http://site.ext:443",
L"https://site.ext:80"};

auto size = sizeof(urls) / sizeof(wchar_t *);
for (size_t i = 0; i < size; ++i) {
Assert::AreEqual(expected[i], OriginPolicyHttpFilter::GetOrigin(Uri{urls[i]}).c_str());
}
}
};

} // namespace Microsoft::React::Test
16 changes: 12 additions & 4 deletions vnext/Shared/Networking/OriginPolicyHttpFilter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -154,8 +154,16 @@ bool OriginPolicyHttpFilter::ConstWcharComparer::operator()(const wchar_t *a, co
return s_simpleCorsMethods.find(request.Method().ToString().c_str()) != s_simpleCorsMethods.cend();
}

/*static*/ Uri OriginPolicyHttpFilter::GetOrigin(Uri const &uri) noexcept {
return Uri{uri.SchemeName() + L"://" + uri.Host() + L":" + to_hstring(uri.Port())};
/*static*/ const hstring OriginPolicyHttpFilter::GetOrigin(Uri const &uri) noexcept {
auto const &scheme = uri.SchemeName();
auto port = uri.Port();

hstring result = scheme + L"://" + uri.Host();
if (!(port == 80 && scheme == L"http") && !(port == 443 && scheme == L"https")) {
result = result + L":" + to_hstring(port);
}

return result;
}

/*static*/ bool OriginPolicyHttpFilter::AreSafeRequestHeaders(
Expand Down Expand Up @@ -677,7 +685,7 @@ ResponseOperation OriginPolicyHttpFilter::SendPreflightAsync(HttpRequestMessage
}

preflightRequest.Headers().Insert(L"Access-Control-Request-Headers", headerNames);
preflightRequest.Headers().Insert(L"Origin", s_origin.AbsoluteCanonicalUri());
preflightRequest.Headers().Insert(L"Origin", GetOrigin(s_origin));
preflightRequest.Headers().Insert(L"Sec-Fetch-Mode", L"CORS");

co_return {co_await m_innerFilter.SendRequestAsync(preflightRequest)};
Expand Down Expand Up @@ -763,7 +771,7 @@ ResponseOperation OriginPolicyHttpFilter::SendRequestAsync(HttpRequestMessage co

if (originPolicy == OriginPolicy::SimpleCrossOriginResourceSharing ||
originPolicy == OriginPolicy::CrossOriginResourceSharing) {
coRequest.Headers().Insert(L"Origin", s_origin.AbsoluteCanonicalUri());
coRequest.Headers().Insert(L"Origin", GetOrigin(s_origin));
}

auto response = co_await m_innerFilter.SendRequestAsync(coRequest);
Expand Down
2 changes: 1 addition & 1 deletion vnext/Shared/Networking/OriginPolicyHttpFilter.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ class OriginPolicyHttpFilter
winrt::Windows::Foundation::Uri const &u1,
winrt::Windows::Foundation::Uri const &u2) noexcept;

static winrt::Windows::Foundation::Uri GetOrigin(winrt::Windows::Foundation::Uri const &uri) noexcept;
static const winrt::hstring GetOrigin(winrt::Windows::Foundation::Uri const &uri) noexcept;

static bool IsSimpleCorsRequest(winrt::Windows::Web::Http::HttpRequestMessage const &request) noexcept;

Expand Down

0 comments on commit b97a232

Please sign in to comment.