Skip to content
Open
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
29 changes: 25 additions & 4 deletions packages/react-native/React/CoreModules/RCTWebSocketModule.mm
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#import <objc/runtime.h>

#import <FBReactNativeSpec/FBReactNativeSpec.h>
#import <React/RCTAssert.h>
#import <React/RCTConvert.h>
#import <React/RCTUtils.h>
#import <SocketRocket/SRWebSocket.h>
Expand Down Expand Up @@ -66,6 +67,14 @@ - (void)invalidate
connect : (NSURL *)URL protocols : (NSArray *)protocols options : (JS::NativeWebSocketModule::SpecConnectOptions &)
options socketID : (double)socketID)
{
if (!URL || !URL.absoluteString.length) {
RCTAssert(NO, @"RCTWebSocketModule: Invalid WebSocket URL passed to connect");
NSNumber *socketIDNumber = @(socketID);
NSDictionary *body = @{@"message" : @"Invalid WebSocket URL", @"id" : socketIDNumber};
[self sendEventWithName:@"websocketFailed" body:body];
return;
}

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];

// We load cookies from sharedHTTPCookieStorage (shared with XHR and
Expand All @@ -77,14 +86,26 @@ - (void)invalidate
}

// Load and set the cookie header.
NSArray<NSHTTPCookie *> *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:components.URL];
request.allHTTPHeaderFields = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies];
if (components && components.URL) {
NSArray<NSHTTPCookie *> *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:components.URL];
request.allHTTPHeaderFields = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies];
} else {
RCTAssert(NO, @"RCTWebSocketModule: Invalid URL components - components or components.URL is nil");
}

// Load supplied headers
if ([options.headers() isKindOfClass:NSDictionary.class]) {
NSDictionary *headers = (NSDictionary *)options.headers();
[headers enumerateKeysAndObjectsUsingBlock:^(NSString *key, id value, BOOL *stop) {
[request addValue:[RCTConvert NSString:value] forHTTPHeaderField:key];
[headers enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) {
if (![key isKindOfClass:[NSString class]]) {
RCTAssert(NO, @"RCTWebSocketModule: Invalid header key type - expected NSString");
return;
}
NSString *headerValue = [RCTConvert NSString:value];
if (headerValue == nil) {
headerValue = @"";
}
[request addValue:headerValue forHTTPHeaderField:key];
}];
}

Expand Down
Loading