Commit cc3a1f5e authored by Song Fangzhen's avatar Song Fangzhen Committed by Chromium LUCI CQ

Direct Sockets: Populate local_addr from options.

Below documents are from Eric Willigers <ericwilligers@chromium.org>.
Explainer: https://github.com/WICG/raw-sockets/blob/master/docs/explainer.md

Design doc:
https://docs.google.com/document/d/1Xa5nFkIWxkL3hZHvDYWPhT8sZvNeFpCUKNuqIwZHxnE/edit?usp=sharing

Bug: 905818
Change-Id: Ia6f7dd79a8b82f6ff5a33c1abab08e8320741441
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2603063
Commit-Queue: Ke He <kehe@chromium.org>
Commit-Queue: Eric Willigers <ericwilligers@chromium.org>
Reviewed-by: default avatarEric Willigers <ericwilligers@chromium.org>
Cr-Commit-Position: refs/heads/master@{#839412}
parent 9152688e
......@@ -74,8 +74,8 @@ void DirectSocketsServiceImpl::OpenTcpSocket(
return;
}
// TODO(crbug.com/905818): Populate local_addr from options.
const base::Optional<net::IPEndPoint> local_addr = base::nullopt;
base::Optional<net::IPEndPoint> local_addr = base::nullopt;
PopulateLocalAddr(*options, local_addr);
network::mojom::TCPConnectedSocketOptionsPtr tcp_connected_socket_options =
network::mojom::TCPConnectedSocketOptions::New();
......@@ -182,6 +182,19 @@ net::Error DirectSocketsServiceImpl::ValidateOptions(
return net::ERR_NOT_IMPLEMENTED;
}
void DirectSocketsServiceImpl::PopulateLocalAddr(
const blink::mojom::DirectSocketOptions& options,
base::Optional<net::IPEndPoint>& local_addr) {
DCHECK(!local_addr);
if (!options.local_hostname)
return;
net::IPAddress local_address;
bool success = local_address.AssignFromIPLiteral(*options.local_hostname);
if (success)
local_addr = net::IPEndPoint(local_address, options.local_port);
}
network::mojom::NetworkContext* DirectSocketsServiceImpl::GetNetworkContext() {
if (network::mojom::NetworkContext* network_context =
GetNetworkContextForTesting()) {
......
......@@ -71,6 +71,10 @@ class CONTENT_EXPORT DirectSocketsServiceImpl
net::Error ValidateOptions(const blink::mojom::DirectSocketOptions& options,
net::IPAddress& remote_address);
// Populate |local_addr| from options.
void PopulateLocalAddr(const blink::mojom::DirectSocketOptions& options,
base::Optional<net::IPEndPoint>& local_addr);
network::mojom::NetworkContext* GetNetworkContext();
RenderFrameHost* frame_host_;
......
......@@ -36,6 +36,11 @@ class DirectSocketsUnitTest : public RenderViewHostTestHarness {
return direct_sockets_service().ValidateOptions(options, remote_address);
}
void PopulateLocalAddr(const blink::mojom::DirectSocketOptions& options,
base::Optional<net::IPEndPoint>& local_addr) {
return direct_sockets_service().PopulateLocalAddr(options, local_addr);
}
private:
base::test::ScopedFeatureList feature_list_;
std::unique_ptr<DirectSocketsServiceImpl> direct_sockets_service_;
......@@ -61,4 +66,35 @@ TEST_F(DirectSocketsUnitTest, RemoteAddressCurrentlyRequired) {
EXPECT_EQ(ValidateOptions(options), net::ERR_NAME_NOT_RESOLVED);
}
TEST_F(DirectSocketsUnitTest, PopulateLocalAddr) {
blink::mojom::DirectSocketOptions options;
// Test for default condition.
base::Optional<net::IPEndPoint> local_addr = base::nullopt;
PopulateLocalAddr(options, local_addr);
EXPECT_EQ(local_addr, base::nullopt);
// Test with IPv4 address and default port(0) provided.
local_addr = base::nullopt;
options.local_hostname = "12.34.56.78";
PopulateLocalAddr(options, local_addr);
const uint8_t ipv4[net::IPAddress::kIPv4AddressSize] = {12, 34, 56, 78};
EXPECT_EQ(local_addr, net::IPEndPoint(net::IPAddress(ipv4), 0));
// Test with IPv6 address and default port(0) provided.
local_addr = base::nullopt;
options.local_hostname = "fedc:ba98:7654:3210:fedc:ba98:7654:3210";
PopulateLocalAddr(options, local_addr);
const uint8_t ipv6[net::IPAddress::kIPv6AddressSize] = {
0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,
0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10};
EXPECT_EQ(local_addr, net::IPEndPoint(net::IPAddress(ipv6), 0));
// Test with IPv6 address and port(12345) provided.
local_addr = base::nullopt;
options.local_port = 12345;
PopulateLocalAddr(options, local_addr);
EXPECT_EQ(local_addr, net::IPEndPoint(net::IPAddress(ipv6), 12345));
}
} // namespace content
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment