@@ -301,23 +301,25 @@ public class WebSocket : NSObject, NSStreamDelegate {
301301 CFWriteStreamSetDispatchQueue ( outStream, WebSocket . sharedWorkQueue)
302302 inStream. open ( )
303303 outStream. open ( )
304+
305+ self. mutex. lock ( )
306+ self. readyToWrite = true
307+ self . mutex. unlock ( )
308+
304309 let bytes = UnsafePointer < UInt8 > ( data. bytes)
305310 var timeout = 5000000 //wait 5 seconds before giving up
306311 writeQueue. addOperationWithBlock { [ unowned self] in
307312 while !outStream. hasSpaceAvailable {
308313 usleep ( 100 ) //wait until the socket is ready
309314 timeout -= 100
310315 if timeout < 0 {
311- self . disconnectStream ( self . errorWithDetail ( " write wait timed out " , code: 2 ) )
312- return
313- } else if let error = outStream. streamError {
314- self . disconnectStream ( error)
316+ self . cleanupStream ( )
317+ self . doDisconnect ( self . errorWithDetail ( " write wait timed out " , code: 2 ) )
315318 return
319+ } else if outStream. streamError != nil {
320+ return //disconnectStream will be called.
316321 }
317322 }
318- self . mutex. lock ( )
319- self . readyToWrite = true
320- self . mutex. unlock ( )
321323 outStream. write ( bytes, maxLength: data. length)
322324 }
323325 }
@@ -350,6 +352,13 @@ public class WebSocket : NSObject, NSStreamDelegate {
350352 //disconnect the stream object
351353 private func disconnectStream( error: NSError? ) {
352354 writeQueue. waitUntilAllOperationsAreFinished ( )
355+ cleanupStream ( )
356+ doDisconnect ( error)
357+ }
358+
359+ private func cleanupStream( ) {
360+ outputStream? . delegate = nil
361+ inputStream? . delegate = nil
353362 if let stream = inputStream {
354363 CFReadStreamSetDispatchQueue ( stream, nil )
355364 stream. close ( )
@@ -359,8 +368,7 @@ public class WebSocket : NSObject, NSStreamDelegate {
359368 stream. close ( )
360369 }
361370 outputStream = nil
362- certValidated = false
363- doDisconnect ( error)
371+ inputStream = nil
364372 }
365373
366374 ///handles the incoming bytes and sending them to the proper processing method
@@ -800,18 +808,7 @@ public class WebSocket : NSObject, NSStreamDelegate {
800808 mutex. lock ( )
801809 readyToWrite = false
802810 mutex. unlock ( )
803- outputStream? . delegate = nil
804- inputStream? . delegate = nil
805- if let stream = inputStream {
806- CFReadStreamSetDispatchQueue ( stream, nil )
807- stream. close ( )
808- }
809- if let stream = outputStream {
810- CFWriteStreamSetDispatchQueue ( stream, nil )
811- stream. close ( )
812- }
813- outputStream = nil
814- inputStream = nil
811+ cleanupStream ( )
815812 }
816813
817814}
0 commit comments