@samitouri / QOSAMI-WSL / commits / 91ada0b5

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,