@@ -13,6 +13,7 @@ import com.hurlant.crypto.tls.TLSSecurityParameters;
13
13
import com.hurlant.crypto.tls.TLSSocket ;
14
14
15
15
import flash.display.* ;
16
+ import flash.errors.* ;
16
17
import flash.events.* ;
17
18
import flash.external.* ;
18
19
import flash.net.* ;
@@ -139,6 +140,7 @@ public class WebSocket extends EventDispatcher {
139
140
}
140
141
141
142
public function send (encData :String ):int {
143
+ logger. log ("send: " + data );
142
144
var data : String ;
143
145
try {
144
146
data = decodeURIComponent (encData);
@@ -153,9 +155,11 @@ public class WebSocket extends EventDispatcher {
153
155
var frame : WebSocketFrame = new WebSocketFrame();
154
156
frame . opcode = OPCODE_TEXT ;
155
157
frame . payload = dataBytes;
156
- sendFrame(frame );
157
- logger. log ("send: " + data );
158
- return - 1 ;
158
+ if (sendFrame(frame )) {
159
+ return - 1 ;
160
+ } else {
161
+ return dataBytes. length ;
162
+ }
159
163
} else if (readyState == CLOSING || readyState == CLOSED ) {
160
164
return dataBytes. length ;
161
165
} else {
@@ -191,7 +195,7 @@ public class WebSocket extends EventDispatcher {
191
195
logger. log ("closed" );
192
196
readyState = CLOSED ;
193
197
var eventName: String =
194
- (readyState != CONNECTING && isError ) ? "error" : "close" ;
198
+ (readyState != CONNECTING && isConnectionError ) ? "error" : "close" ;
195
199
this . dispatchEvent (new WebSocketEvent(eventName));
196
200
} else {
197
201
logger. log ("closing" );
@@ -303,7 +307,9 @@ public class WebSocket extends EventDispatcher {
303
307
if (frame ) {
304
308
removeBufferBefore(frame . length );
305
309
pos = - 1 ;
306
- if (frame . opcode >= 0x08 && frame . opcode <= 0x0f && frame . payload. length >= 126 ) {
310
+ if (frame . rsv != 0 ) {
311
+ close (1002 , "RSV must be 0." );
312
+ } else if (frame . opcode >= 0x08 && frame . opcode <= 0x0f && frame . payload. length >= 126 ) {
307
313
close (1004 , "Payload of control frame must be less than 126 bytes." );
308
314
} else {
309
315
switch (frame . opcode) {
@@ -391,14 +397,14 @@ public class WebSocket extends EventDispatcher {
391
397
return true ;
392
398
}
393
399
394
- private function sendPong (payload :ByteArray ):void {
400
+ private function sendPong (payload :ByteArray ):Boolean {
395
401
var frame : WebSocketFrame = new WebSocketFrame();
396
402
frame . opcode = OPCODE_PONG ;
397
403
frame . payload = payload;
398
- sendFrame(frame );
404
+ return sendFrame(frame );
399
405
}
400
406
401
- private function sendFrame (frame :WebSocketFrame ):void {
407
+ private function sendFrame (frame :WebSocketFrame ):Boolean {
402
408
403
409
var plength: uint = frame . payload. length ;
404
410
@@ -409,7 +415,8 @@ public class WebSocket extends EventDispatcher {
409
415
}
410
416
411
417
var header : ByteArray = new ByteArray ();
412
- header . writeByte ((frame . fin ? 0x80 : 0x00 ) | frame . opcode); // FIN + opcode
418
+ // FIN + RSV + opcode
419
+ header . writeByte ((frame . fin ? 0x80 : 0x00 ) | (frame . rsv << 4 ) | frame . opcode);
413
420
if (plength <= 125 ) {
414
421
header . writeByte (0x80 | plength); // Masked + length
415
422
} else if (plength > 125 && plength < 65536 ) {
@@ -430,9 +437,17 @@ public class WebSocket extends EventDispatcher {
430
437
maskedPayload[ i] = mask [ i % 4 ] ^ frame . payload[ i];
431
438
}
432
439
433
- socket. writeBytes (header );
434
- socket. writeBytes (maskedPayload);
435
- socket. flush ();
440
+ try {
441
+ socket. writeBytes (header );
442
+ socket. writeBytes (maskedPayload);
443
+ socket. flush ();
444
+ } catch (ex: IOError ) {
445
+ logger. error ("IOError while sending frame" );
446
+ // TODO Fire close event if it hasn't
447
+ readyState = CLOSED ;
448
+ return false ;
449
+ }
450
+ return true ;
436
451
437
452
}
438
453
@@ -447,8 +462,9 @@ public class WebSocket extends EventDispatcher {
447
462
return null ;
448
463
}
449
464
465
+ frame . fin = (buffer[ 0 ] & 0x80 ) != 0 ;
466
+ frame . rsv = (buffer[ 0 ] & 0x70 ) >> 4 ;
450
467
frame . opcode = buffer[ 0 ] & 0x0f ;
451
- frame . fin = (buffer[ 0 ] & 0x80 ) != 0 ;
452
468
plength = buffer[ 1 ] & 0x7f ;
453
469
454
470
if (plength == 126 ) {
0 commit comments