Browse Source

Re-applies scheduleCleanup patch

Jorge Leandro Perez 9 years ago
parent
commit
a770a5fd52
1 changed files with 77 additions and 76 deletions
  1. 77 76
      SocketRocket/SRWebSocket.m

+ 77 - 76
SocketRocket/SRWebSocket.m

@@ -1536,90 +1536,91 @@ static const size_t SRFrameHeaderOverhead = 32;
 
 - (void)safeHandleEvent:(NSStreamEvent)eventCode stream:(NSStream *)aStream
 {
-    switch (eventCode) {
-        case NSStreamEventOpenCompleted: {
-            SRFastLog(@"NSStreamEventOpenCompleted %@", aStream);
-            if (self.readyState >= SR_CLOSING) {
-                return;
-            }
-            assert(_readBuffer);
-            
-            if (!_secure && self.readyState == SR_CONNECTING && aStream == _inputStream) {
-                [self didConnect];
+        switch (eventCode) {
+            case NSStreamEventOpenCompleted: {
+                SRFastLog(@"NSStreamEventOpenCompleted %@", aStream);
+                if (self.readyState >= SR_CLOSING) {
+                    return;
+                }
+                assert(_readBuffer);
+                
+                if (!_secure && self.readyState == SR_CONNECTING && aStream == _inputStream) {
+                    [self didConnect];
+                }
+                [self _pumpWriting];
+                [self _pumpScanner];
+                break;
             }
-
-            [self _pumpWriting];
-            [self _pumpScanner];
-            break;
-        }
-            
-        case NSStreamEventErrorOccurred: {
-            SRFastLog(@"NSStreamEventErrorOccurred %@ %@", aStream, [[aStream streamError] copy]);
-            /// TODO specify error better!
-            [self _failWithError:aStream.streamError];
-            _readBufferOffset = 0;
-            [_readBuffer setLength:0];
-            break;
-            
-        }
-            
-        case NSStreamEventEndEncountered: {
-            [self _pumpScanner];
-            SRFastLog(@"NSStreamEventEndEncountered %@", aStream);
-            if (aStream.streamError) {
+                
+            case NSStreamEventErrorOccurred: {
+                SRFastLog(@"NSStreamEventErrorOccurred %@ %@", aStream, [[aStream streamError] copy]);
+                /// TODO specify error better!
                 [self _failWithError:aStream.streamError];
-            } else {
-                if (self.readyState != SR_CLOSED) {
-                    self.readyState = SR_CLOSED;
-                    [self _scheduleCleanup];
-                }
-
-                if (!_sentClose && !_failed) {
-                    _sentClose = YES;
-                    // If we get closed in this state it's probably not clean because we should be sending this when we send messages
-                    [self _performDelegateBlock:^{
-                        if ([self.delegate respondsToSelector:@selector(webSocket:didCloseWithCode:reason:wasClean:)]) {
-                            [self.delegate webSocket:self didCloseWithCode:SRStatusCodeGoingAway reason:@"Stream end encountered" wasClean:NO];
+                _readBufferOffset = 0;
+                [_readBuffer setLength:0];
+                break;
+                
+            }
+                
+            case NSStreamEventEndEncountered: {
+                [self _pumpScanner];
+                SRFastLog(@"NSStreamEventEndEncountered %@", aStream);
+                if (aStream.streamError) {
+                    [self _failWithError:aStream.streamError];
+                } else {
+                    dispatch_async(_workQueue, ^{
+                        if (self.readyState != SR_CLOSED) {
+                            self.readyState = SR_CLOSED;
+                            [self _scheduleCleanup];
+                        }
+                        
+                        if (!_sentClose && !_failed) {
+                            _sentClose = YES;
+                            // If we get closed in this state it's probably not clean because we should be sending this when we send messages
+                            [self _performDelegateBlock:^{
+                                if ([self.delegate respondsToSelector:@selector(webSocket:didCloseWithCode:reason:wasClean:)]) {
+                                    [self.delegate webSocket:self didCloseWithCode:SRStatusCodeGoingAway reason:@"Stream end encountered" wasClean:NO];
+                                }
+                            }];
                         }
-                    }];
+                    });
                 }
+                
+                break;
             }
-            
-            break;
-        }
-            
-        case NSStreamEventHasBytesAvailable: {
-            SRFastLog(@"NSStreamEventHasBytesAvailable %@", aStream);
-            const int bufferSize = 2048;
-            uint8_t buffer[bufferSize];
-            
-            while (_inputStream.hasBytesAvailable) {
-                NSInteger bytes_read = [_inputStream read:buffer maxLength:bufferSize];
                 
-                if (bytes_read > 0) {
-                    [_readBuffer appendBytes:buffer length:bytes_read];
-                } else if (bytes_read < 0) {
-                    [self _failWithError:_inputStream.streamError];
-                }
+            case NSStreamEventHasBytesAvailable: {
+                SRFastLog(@"NSStreamEventHasBytesAvailable %@", aStream);
+                const int bufferSize = 2048;
+                uint8_t buffer[bufferSize];
                 
-                if (bytes_read != bufferSize) {
-                    break;
-                }
-            };
-            [self _pumpScanner];
-            break;
-        }
-            
-        case NSStreamEventHasSpaceAvailable: {
-            SRFastLog(@"NSStreamEventHasSpaceAvailable %@", aStream);
-            [self _pumpWriting];
-            break;
+                while (_inputStream.hasBytesAvailable) {
+                    NSInteger bytes_read = [_inputStream read:buffer maxLength:bufferSize];
+                    
+                    if (bytes_read > 0) {
+                        [_readBuffer appendBytes:buffer length:bytes_read];
+                    } else if (bytes_read < 0) {
+                        [self _failWithError:_inputStream.streamError];
+                    }
+                    
+                    if (bytes_read != bufferSize) {
+                        break;
+                    }
+                };
+                [self _pumpScanner];
+                break;
+            }
+                
+            case NSStreamEventHasSpaceAvailable: {
+                SRFastLog(@"NSStreamEventHasSpaceAvailable %@", aStream);
+                [self _pumpWriting];
+                break;
+            }
+                
+            default:
+                SRFastLog(@"(default)  %@", aStream);
+                break;
         }
-            
-        default:
-            SRFastLog(@"(default)  %@", aStream);
-            break;
-    }
 }
 
 @end