diff --git a/packages/react-native/React/DevSupport/RCTInspectorDevServerHelper.mm b/packages/react-native/React/DevSupport/RCTInspectorDevServerHelper.mm index e2ee27e2d881..d5978d535bb3 100644 --- a/packages/react-native/React/DevSupport/RCTInspectorDevServerHelper.mm +++ b/packages/react-native/React/DevSupport/RCTInspectorDevServerHelper.mm @@ -28,6 +28,10 @@ if (host == nullptr) { host = @"localhost"; } + // NSURL.host strips IPv6 brackets, but URL authority requires them. + if ([host containsString:@":"] && ![host hasPrefix:@"["] && ![host hasSuffix:@"]"]) { + host = [NSString stringWithFormat:@"[%@]", host]; + } // Use explicit port from URL if available if ([bundleURL port] != nullptr) { diff --git a/packages/react-native/React/DevSupport/RCTPackagerConnection.mm b/packages/react-native/React/DevSupport/RCTPackagerConnection.mm index 1c17945855dc..aac492a4f307 100644 --- a/packages/react-native/React/DevSupport/RCTPackagerConnection.mm +++ b/packages/react-native/React/DevSupport/RCTPackagerConnection.mm @@ -64,22 +64,24 @@ - (instancetype)init static RCTReconnectingWebSocket *socketForLocation(NSString *const serverHostPort, NSString *scheme) { - NSString *serverHost; - NSString *serverPort; - NSArray *locationComponents = [serverHostPort componentsSeparatedByString:@":"]; - if ([locationComponents count] > 0) { - serverHost = locationComponents[0]; - } - if ([locationComponents count] > 1) { - serverPort = locationComponents[1]; - } if (![scheme length]) { scheme = @"http"; } + + NSString *location = serverHostPort; + if (![location length]) { + location = @"localhost"; + } + + NSString *locationURLString = [location rangeOfString:@"://"].location == NSNotFound + ? [NSString stringWithFormat:@"%@://%@/", scheme, location] + : location; + NSURLComponents *locationURL = [NSURLComponents componentsWithString:locationURLString]; + NSURLComponents *const components = [NSURLComponents new]; - components.host = serverHost ?: @"localhost"; + components.host = locationURL.host ?: @"localhost"; components.scheme = scheme; - components.port = serverPort ? @(serverPort.integerValue) : @(kRCTBundleURLProviderDefaultPort); + components.port = locationURL.port ?: @(kRCTBundleURLProviderDefaultPort); components.path = @"/message"; components.queryItems = @[ [NSURLQueryItem queryItemWithName:@"role" value:RCTPlatformName] ]; static dispatch_queue_t queue;