Skip to content

Commit 43a9e14

Browse files
cipolleschifacebook-github-bot
authored andcommitted
Add SRWebSocketProvider for selective WebSocket header injection (#55870)
Summary: ## Summary: Replace the blind application of dev headers on all WebSocket connections with a provider pattern that mirrors RCTHTTPRequestHandler's NSURLSessionConfigurationProvider. A custom `SRWebSocketProvider` block can be registered via `RCTSetCustomSRWebSocketProvider` to intercept WebSocket creation and selectively modify the request (e.g. injecting auth headers) for specific endpoints. If no provider is set, or if the provider returns nil, the default SRWebSocket creation logic is used. - Declare `SRWebSocketProvider` typedef and `RCTSetCustomSRWebSocketProvider` in RCTWebSocketModule.h - Implement the provider hook in RCTWebSocketModule.mm - Remove the previous blind `RCTDevSupportHttpHeaders` application ## Changelog: [IOS][CHANGED] - Add SRWebSocketProvider for selective WebSocket header injection ## Test Plan: Verified that the `SRWebSocketProvider` block is called when registered, and that returning nil falls back to the default SRWebSocket creation. When no provider is registered, behavior is unchanged from before. ## Facebook: Applied from nest/mobile/apps/atod-sample/patches/react-native+0.83.1+005+atod-websocket-ios.patch Reviewed By: cortinico Differential Revision: D95037876
1 parent cd33062 commit 43a9e14

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

packages/react-native/React/CoreModules/RCTWebSocketModule.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ NS_ASSUME_NONNULL_BEGIN
1818

1919
@end
2020

21+
@class SRWebSocket;
22+
23+
typedef SRWebSocket * (^SRWebSocketProvider)(NSURLRequest *request);
24+
25+
RCT_EXTERN void RCTSetCustomSRWebSocketProvider(SRWebSocketProvider provider);
26+
2127
@interface RCTWebSocketModule : RCTEventEmitter
2228

2329
// Register a custom handler for a specific websocket. The handler will be strongly held by the WebSocketModule.

packages/react-native/React/CoreModules/RCTWebSocketModule.mm

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,13 @@ @interface RCTWebSocketModule () <SRWebSocketDelegate, NativeWebSocketModuleSpec
3535

3636
@end
3737

38+
static SRWebSocketProvider srWebSocketProvider;
39+
40+
void RCTSetCustomSRWebSocketProvider(SRWebSocketProvider provider)
41+
{
42+
srWebSocketProvider = provider;
43+
}
44+
3845
@implementation RCTWebSocketModule {
3946
NSMutableDictionary<NSNumber *, SRWebSocket *> *_sockets;
4047
NSMutableDictionary<NSNumber *, id<RCTWebSocketContentHandler>> *_contentHandlers;
@@ -114,7 +121,13 @@ - (void)invalidate
114121
}];
115122
}
116123

117-
SRWebSocket *webSocket = [[SRWebSocket alloc] initWithURLRequest:request protocols:protocols];
124+
SRWebSocket *webSocket;
125+
if (srWebSocketProvider != nullptr) {
126+
webSocket = srWebSocketProvider(request);
127+
}
128+
if (webSocket == nil) {
129+
webSocket = [[SRWebSocket alloc] initWithURLRequest:request protocols:protocols];
130+
}
118131
[webSocket setDelegateDispatchQueue:[self methodQueue]];
119132
webSocket.delegate = self;
120133
webSocket.reactTag = @(socketID);

0 commit comments

Comments
 (0)