|
@@ -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
|