Private
Public Access
1
0

guessing at this point

This commit is contained in:
2025-06-13 14:54:51 -07:00
parent d706435103
commit 3f03937ca4

View File

@@ -43,7 +43,7 @@
@implementation MBIMPingPongWebSocket
{
NSData *pendingPingPayload;
NSUInteger currentPayloadLength;
}
#pragma mark - Ping/Pong Frame Construction
@@ -90,7 +90,7 @@
return [frame copy];
}
- (void)sendPongWithPayload:(NSData *)payload socket:(GCDAsyncSocket *)asyncSocket {
- (void)sendPongWithPayload:(NSData *)payload {
NSData *pongFrame = [self createPongFrameWithPayload:payload];
// Send the pong frame directly through the socket
@@ -101,7 +101,7 @@
#pragma mark - Override AsyncSocket Delegate
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
- (void)socket:(GCDAsyncSocket *)asyncSocket didReadData:(NSData *)data withTag:(long)tag {
// xxx: sheesh: really need to get off of CococaHTTPServer.
NSData *maskingKey = [self valueForKey:@"maskingKey"];
BOOL nextFrameMasked = [[self valueForKey:@"nextFrameMasked"] boolValue];
@@ -127,7 +127,7 @@
}
NSLog(@"Sending pong response to ping with payload length: %lu", (unsigned long)[payload length]);
[self sendPongWithPayload:payload socket:sock];
[self sendPongWithPayload:payload];
// Continue reading the next frame
[asyncSocket readDataToLength:1 withTimeout:TIMEOUT_NONE tag:TAG_PAYLOAD_PREFIX];
@@ -136,7 +136,7 @@
// Let parent handle TAG_PAYLOAD_PREFIX first to set nextOpCode
if (tag == TAG_PAYLOAD_PREFIX) {
[super socket:sock didReadData:data withTag:tag];
[super socket:asyncSocket didReadData:data withTag:tag];
return;
}
@@ -147,14 +147,21 @@
BOOL masked = (frame & 0x80) != 0;
NSUInteger length = frame & 0x7F;
nextFrameMasked = masked;
currentPayloadLength = length;
NSLog(@"Processing ping/pong frame, masked: %d, length: %lu", masked, (unsigned long)length);
if (length <= 125) {
if (nextFrameMasked) {
[asyncSocket readDataToLength:4 withTimeout:TIMEOUT_NONE tag:TAG_MSG_MASKING_KEY];
} else if (length > 0) {
[asyncSocket readDataToLength:length withTimeout:TIMEOUT_NONE tag:TAG_PING_PAYLOAD];
} else {
// Empty payload, no masking - handle immediately
NSLog(@"Handling empty unmasked ping payload");
[self sendPongWithPayload:[NSData data]];
[asyncSocket readDataToLength:1 withTimeout:TIMEOUT_NONE tag:TAG_PAYLOAD_PREFIX];
}
[asyncSocket readDataToLength:length withTimeout:TIMEOUT_NONE tag:TAG_PING_PAYLOAD];
}
else if (length == 126) {
[asyncSocket readDataToLength:2 withTimeout:TIMEOUT_NONE tag:TAG_PAYLOAD_LENGTH16];
@@ -169,6 +176,16 @@
// Store the masking key
maskingKey = [data copy];
NSLog(@"Stored masking key for ping/pong frame");
// Now read the payload (or handle empty payload)
if (currentPayloadLength > 0) {
[asyncSocket readDataToLength:currentPayloadLength withTimeout:TIMEOUT_NONE tag:TAG_PING_PAYLOAD];
} else {
// Empty payload - send pong immediately
NSLog(@"Sending pong for empty masked ping payload");
[self sendPongWithPayload:[NSData data]];
[asyncSocket readDataToLength:1 withTimeout:TIMEOUT_NONE tag:TAG_PAYLOAD_PREFIX];
}
return;
}
@@ -191,10 +208,9 @@
}
// For all other cases, call the parent implementation
[super socket:sock didReadData:data withTag:tag];
[super socket:asyncSocket didReadData:data withTag:tag];
}
#pragma mark - Helper Methods
// Expose the isValidWebSocketFrame method since it's private in the parent
@@ -207,22 +223,4 @@
return YES;
}
// Override didReceiveMessage to add logging
- (void)didReceiveMessage:(NSString *)msg {
NSLog(@"Received message: %@", msg);
[super didReceiveMessage:msg];
}
// Override didOpen to add logging
- (void)didOpen {
NSLog(@"WebSocket opened with ping/pong support");
[super didOpen];
}
- (void)didClose {
NSLog(@"WebSocket closed");
[super didClose];
}
@end