Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "patch",
"comment": "Implement HTTP redirection (#10534)",
"packageName": "react-native-windows",
"email": "julio.rocha@microsoft.com",
"dependentChangeType": "patch"
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace http = boost::beast::http;

using folly::dynamic;
using Microsoft::React::Networking::IHttpResource;
using Microsoft::React::Networking::OriginPolicy;
using std::make_shared;
Expand Down Expand Up @@ -82,7 +83,8 @@ TEST_CLASS(HttpOriginPolicyIntegrationTest)

auto reqHandler = [&serverArgs](const DynamicRequest& request) -> ResponseWrapper
{
return { std::move(serverArgs.Response) };
// Don't use move constructor in case of multiple requests
return { serverArgs.Response };
};

switch (clientArgs.Method)
Expand Down Expand Up @@ -133,7 +135,7 @@ TEST_CLASS(HttpOriginPolicyIntegrationTest)
clientArgs.ResponseContent = std::move(content);
clientArgs.ContentPromise.set_value();
});
resource->SetOnError([&clientArgs](int64_t, string&& message)
resource->SetOnError([&clientArgs](int64_t, string&& message, bool)
{
clientArgs.ErrorMessage = std::move(message);
clientArgs.ContentPromise.set_value();
Expand All @@ -144,7 +146,7 @@ TEST_CLASS(HttpOriginPolicyIntegrationTest)
string{server1Args.Url},
0, /*requestId*/
std::move(clientArgs.RequestHeaders),
{}, /*data*/
dynamic::object("string", ""), /*data*/
"text",
false, /*useIncrementalUpdates*/
0, /*timeout*/
Expand Down Expand Up @@ -187,7 +189,7 @@ TEST_CLASS(HttpOriginPolicyIntegrationTest)
clientArgs.ResponseContent = std::move(content);
clientArgs.ContentPromise.set_value();
});
resource->SetOnError([&clientArgs](int64_t, string&& message)
resource->SetOnError([&clientArgs](int64_t, string&& message, bool)
{
clientArgs.ErrorMessage = std::move(message);
clientArgs.ContentPromise.set_value();
Expand All @@ -198,7 +200,7 @@ TEST_CLASS(HttpOriginPolicyIntegrationTest)
string{serverArgs.Url},
0, /*requestId*/
std::move(clientArgs.RequestHeaders),
{}, /*data*/
dynamic::object("string", ""), /*data*/
"text",
false, /*useIncrementalUpdates*/
0, /*timeout*/
Expand All @@ -223,16 +225,16 @@ TEST_CLASS(HttpOriginPolicyIntegrationTest)

TEST_METHOD_CLEANUP(MethodCleanup)
{
// Clear any runtime options that may be used by tests in this class.
SetRuntimeOptionInt("Http.OriginPolicy", static_cast<int32_t>(OriginPolicy::None));
SetRuntimeOptionString("Http.GlobalOrigin", {});
SetRuntimeOptionBool("Http.OmitCredentials", false);

// Bug in HttpServer does not correctly release TCP port between test methods.
// Using a different por per test for now.
s_port++;
}

//TODO: NoCors_InvalidMethod_Failed?

BEGIN_TEST_METHOD_ATTRIBUTE(NoCorsForbiddenMethodSucceeds)
// CONNECT, TRACE, and TRACK methods not supported by Windows.Web.Http
// https://docs.microsoft.com/en-us/uwp/api/windows.web.http.httpmethod?view=winrt-19041#properties
Expand Down Expand Up @@ -283,7 +285,7 @@ TEST_CLASS(HttpOriginPolicyIntegrationTest)
getContent = std::move(content);
getDataPromise.set_value();
});
resource->SetOnError([&server, &error, &getDataPromise](int64_t, string&& message)
resource->SetOnError([&server, &error, &getDataPromise](int64_t, string&& message, bool)
{
error = std::move(message);
getDataPromise.set_value();
Expand All @@ -296,8 +298,7 @@ TEST_CLASS(HttpOriginPolicyIntegrationTest)
{
{"ValidHeader", "AnyValue"}
},
{}, /*data*/
//{} /*bodyData*/,
dynamic::object("string", ""), /*data*/
"text",
false /*useIncrementalUpdates*/,
0 /*timeout*/,
Expand All @@ -324,6 +325,7 @@ TEST_CLASS(HttpOriginPolicyIntegrationTest)

SetRuntimeOptionString("Http.GlobalOrigin", s_crossOriginUrl);
SetRuntimeOptionInt("Http.OriginPolicy", static_cast<int32_t>(OriginPolicy::SimpleCrossOriginResourceSharing));

TestOriginPolicy(serverArgs, clientArgs, s_shouldFail);
}// SimpleCorsForbiddenMethodFails

Expand All @@ -344,8 +346,6 @@ TEST_CLASS(HttpOriginPolicyIntegrationTest)
TestOriginPolicy(serverArgs, clientArgs, true /*shouldSucceed*/);
}// NoCorsCrossOriginFetchRequestSucceeds

//NoCors_CrossOriginFetchRequestWithTimeout_Succeeded //TODO: Implement timeout

BEGIN_TEST_METHOD_ATTRIBUTE(NoCorsCrossOriginPatchSucceededs)
END_TEST_METHOD_ATTRIBUTE()
TEST_METHOD(NoCorsCrossOriginPatchSucceededs)
Expand Down Expand Up @@ -377,6 +377,7 @@ TEST_CLASS(HttpOriginPolicyIntegrationTest)

SetRuntimeOptionString("Http.GlobalOrigin", serverArgs.Url.c_str());
SetRuntimeOptionInt("Http.OriginPolicy", static_cast<int32_t>(OriginPolicy::SimpleCrossOriginResourceSharing));

TestOriginPolicy(serverArgs, clientArgs, true /*shouldSucceed*/);
}// SimpleCorsSameOriginSucceededs

Expand All @@ -390,6 +391,7 @@ TEST_CLASS(HttpOriginPolicyIntegrationTest)

SetRuntimeOptionString("Http.GlobalOrigin", s_crossOriginUrl);
SetRuntimeOptionInt("Http.OriginPolicy", static_cast<int32_t>(OriginPolicy::SimpleCrossOriginResourceSharing));

TestOriginPolicy(serverArgs, clientArgs, s_shouldFail);
}// SimpleCorsCrossOriginFetchFails

Expand All @@ -404,6 +406,7 @@ TEST_CLASS(HttpOriginPolicyIntegrationTest)

SetRuntimeOptionString("Http.GlobalOrigin", serverArgs.Url.c_str());
SetRuntimeOptionInt("Http.OriginPolicy", static_cast<int32_t>(OriginPolicy::CrossOriginResourceSharing));

TestOriginPolicy(serverArgs, clientArgs, true /*shouldSucceed*/);
}// FullCorsSameOriginRequestSucceeds

Expand Down Expand Up @@ -669,9 +672,6 @@ TEST_CLASS(HttpOriginPolicyIntegrationTest)
} // FullCorsCrossOriginToAnotherCrossOriginRedirectSucceeds

BEGIN_TEST_METHOD_ATTRIBUTE(FullCorsCrossOriginToAnotherCrossOriginRedirectWithPreflightSucceeds)
// [0x80072f88] The HTTP redirect request must be confirmed by the user
//TODO: Figure out manual redirection.
TEST_IGNORE()
END_TEST_METHOD_ATTRIBUTE()
TEST_METHOD(FullCorsCrossOriginToAnotherCrossOriginRedirectWithPreflightSucceeds)
{
Expand Down Expand Up @@ -763,8 +763,6 @@ TEST_CLASS(HttpOriginPolicyIntegrationTest)
// The current implementation omits withCredentials flag from request and always sets it to false
// Configure the responses for CORS request
BEGIN_TEST_METHOD_ATTRIBUTE(FullCorsCrossOriginWithCredentialsSucceeds)
//TODO: Fails if run after FullCorsCrossOriginWithCredentialsFails
TEST_IGNORE()
END_TEST_METHOD_ATTRIBUTE()
TEST_METHOD(FullCorsCrossOriginWithCredentialsSucceeds)
{
Expand Down Expand Up @@ -823,15 +821,6 @@ TEST_CLASS(HttpOriginPolicyIntegrationTest)

TestOriginPolicy(serverArgs, clientArgs, s_shouldFail);
}// RequestWithProxyAuthorizationHeaderFails

BEGIN_TEST_METHOD_ATTRIBUTE(ExceedingRedirectLimitFails)
TEST_IGNORE()
END_TEST_METHOD_ATTRIBUTE()
TEST_METHOD(ExceedingRedirectLimitFails)
{
Assert::Fail(L"NOT IMPLEMENTED");
}// ExceedingRedirectLimitFails

};

uint16_t HttpOriginPolicyIntegrationTest::s_port = 7777;
Expand Down
Loading