Refactor IsContainerNetworkMode into ParseContainerNetworkMode (#40606)
beena352 committed
May 20, 2026 at 18:08 UTC
91ada0b5ba3fcdaa298830bc0c92fcef5169f253
1 file changed
+26
-14
src/windows/wslcsession/WSLCContainer.cpp
+26
-14
@@ -151,9 +151,20 @@ uint16_t AllocateEphemeralPort(int family, const char* address)
151
152
constexpr std::string_view c_containerNetworkPrefix = "container:";
153
154
-bool IsContainerNetworkMode(LPCSTR name)
154
+// Returns the target name after "container:" if present, std::nullopt otherwise.
155
+std::optional<std::string> ParseContainerTarget(std::string_view mode)
156
{
156
- return name != nullptr && std::string_view(name).starts_with(c_containerNetworkPrefix);
157
+ if (!mode.starts_with(c_containerNetworkPrefix))
158
+ {
159
+ return std::nullopt;
160
+ }
161
+
162
+ return std::string{mode.substr(c_containerNetworkPrefix.size())};
163
+}
164
+
165
+std::optional<std::string> ParseContainerTarget(LPCSTR mode)
166
+{
167
+ return mode != nullptr ? ParseContainerTarget(std::string_view{mode}) : std::nullopt;
168
}
169
170
// Builds port mapping list from container options and returns the network mode string.
@@ -172,6 +183,7 @@ std::pair<std::vector<ContainerPortMapping>, std::string> ProcessPortMappings(
183
184
// Determine network mode string.
185
std::string networkMode;
186
+ std::optional<std::string> containerTarget;
187
if (networkType == WSLCContainerNetworkTypeBridged)
188
{
189
networkMode = "bridge";
@@ -189,22 +201,22 @@ std::pair<std::vector<ContainerPortMapping>, std::string> ProcessPortMappings(
201
THROW_HR_WITH_USER_ERROR_IF(
202
E_INVALIDARG, Localization::MessageWslcContainerNetworkNameRequired(), !containerNetworkName || strlen(containerNetworkName) == 0);
203
192
- if (IsContainerNetworkMode(containerNetworkName))
204
+ containerTarget = ParseContainerTarget(containerNetworkName);
205
+ if (containerTarget)
206
{
194
- auto target = std::string_view(containerNetworkName).substr(c_containerNetworkPrefix.size());
195
- THROW_HR_WITH_USER_ERROR_IF(E_INVALIDARG, Localization::MessageWslcContainerModeRequiresTarget(), target.empty());
207
+ THROW_HR_WITH_USER_ERROR_IF(E_INVALIDARG, Localization::MessageWslcContainerModeRequiresTarget(), containerTarget->empty());
208
209
THROW_HR_WITH_USER_ERROR_IF(E_INVALIDARG, Localization::MessageWslcContainerModeNoPorts(), !requestedPorts.empty());
210
211
try
212
{
201
- auto targetInspect = dockerClient.InspectContainer(std::string(target));
213
+ auto targetInspect = dockerClient.InspectContainer(*containerTarget);
214
networkMode = std::format("container:{}", targetInspect.Id);
215
}
216
catch (const DockerHTTPException& e)
217
{
218
THROW_HR_WITH_USER_ERROR_IF(
207
- WSLC_E_CONTAINER_NOT_FOUND, Localization::MessageWslcContainerModeTargetNotFound(std::string(target)), e.StatusCode() == 404);
219
+ WSLC_E_CONTAINER_NOT_FOUND, Localization::MessageWslcContainerModeTargetNotFound(*containerTarget), e.StatusCode() == 404);
220
throw;
221
}
222
}
@@ -240,8 +252,7 @@ std::pair<std::vector<ContainerPortMapping>, std::string> ProcessPortMappings(
252
auto& entry = ports.emplace_back(VMPortMapping::FromWSLCPortMapping(e), e.ContainerPort);
253
254
// Allocate VM ports for bridged and custom networks. Host mode ports are allocated when the container starts.
243
- if (networkType == WSLCContainerNetworkTypeBridged ||
244
- (networkType == WSLCContainerNetworkTypeCustom && !IsContainerNetworkMode(containerNetworkName)))
255
+ if (networkType == WSLCContainerNetworkTypeBridged || (networkType == WSLCContainerNetworkTypeCustom && !containerTarget))
256
{
257
entry.VmMapping.AssignVmPort(virtualMachine.AllocatePort(e.Family, e.Protocol));
258
}
@@ -335,11 +346,10 @@ DockerNetworkMode ParseDockerNetworkMode(const std::string& mode)
346
return {WSLCContainerNetworkTypeBridged, {}};
347
}
348
338
- if (mode.starts_with(c_containerNetworkPrefix))
349
+ if (auto target = ParseContainerTarget(mode))
350
{
340
- auto target = mode.substr(c_containerNetworkPrefix.size());
341
- THROW_HR_IF_MSG(E_INVALIDARG, target.empty(), "Invalid Docker network mode: missing container id/name in '%hs'", mode.c_str());
342
- return {WSLCContainerNetworkTypeCustom, std::move(target)};
351
+ THROW_HR_IF_MSG(E_INVALIDARG, target->empty(), "Invalid Docker network mode: missing container id/name in '%hs'", mode.c_str());
352
+ return {WSLCContainerNetworkTypeCustom, std::move(*target)};
353
}
354
355
// Reject other Docker special syntaxes (service:<name>, etc.);
@@ -468,7 +478,9 @@ void ProcessAdditionalNetworks(
478
}
479
480
THROW_HR_WITH_USER_ERROR_IF(
471
- E_INVALIDARG, Localization::MessageWslcContainerModeNoAdditionalNetworks(), IsContainerNetworkMode(GetPrimaryNetworkName(network)));
481
+ E_INVALIDARG,
482
+ Localization::MessageWslcContainerModeNoAdditionalNetworks(),
483
+ ParseContainerTarget(GetPrimaryNetworkName(network)).has_value());
484
485
THROW_HR_WITH_USER_ERROR_IF(
486
E_INVALIDARG,