summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Martin <github@martintribe.org>2011-05-06 11:04:39 -0500
committerJoel Martin <github@martintribe.org>2011-05-06 11:04:39 -0500
commit9e67e24ba3af73fda6fd7adabe95d37ef8ca50e2 (patch)
treeb81dfe5ab2eb842c3eac2378b4cdbabb7cf8f778
parent128b3c7facd69493be0740a085379d87018405f9 (diff)
downloadweb-socket-js-9e67e24ba3af73fda6fd7adabe95d37ef8ca50e2.tar.gz
Use byte length rather than character length.
Requires restructuring the code slightly so that we write the string into a ByteArray before determining the length so that we can get the byte length of the UTF-8 encoded string. Also, remove an extraneous debug statement.
-rw-r--r--WebSocketMain.swfbin175511 -> 175506 bytes
-rw-r--r--WebSocketMainInsecure.zipbin166190 -> 166162 bytes
-rw-r--r--flash-src/WebSocket.as31
3 files changed, 17 insertions, 14 deletions
diff --git a/WebSocketMain.swf b/WebSocketMain.swf
index 8d00f09..7fa6666 100644
--- a/WebSocketMain.swf
+++ b/WebSocketMain.swf
Binary files differ
diff --git a/WebSocketMainInsecure.zip b/WebSocketMainInsecure.zip
index eb9dd06..d83c898 100644
--- a/WebSocketMainInsecure.zip
+++ b/WebSocketMainInsecure.zip
Binary files differ
diff --git a/flash-src/WebSocket.as b/flash-src/WebSocket.as
index 5d0ef56..d2bdf11 100644
--- a/flash-src/WebSocket.as
+++ b/flash-src/WebSocket.as
@@ -134,20 +134,24 @@ public class WebSocket extends EventDispatcher {
public function send(encData:String):int {
var raw_str:String = decodeURIComponent(encData);
var data:ByteArray = new ByteArray();
+ data.writeUTFBytes(raw_str);
+ var plength:uint = data.length;
+
if (readyState == OPEN) {
// TODO: binary API support
- data.writeByte(0x80 | 0x01); // FIN + text opcode
+ var header:ByteArray = new ByteArray();
+
+ header.writeByte(0x80 | 0x01); // FIN + text opcode
- var plength:uint = raw_str.length;
if (plength <= 125) {
- data.writeByte(0x80 | plength); // Masked + length
+ header.writeByte(0x80 | plength); // Masked + length
} else if (plength > 125 && plength < 65536) {
- data.writeByte(0x80 | 126); // Masked + 126
- data.writeShort(plength);
+ header.writeByte(0x80 | 126); // Masked + 126
+ header.writeShort(plength);
} else if (plength >= 65536 && plength < 4294967296) {
- data.writeByte(0x80 | 127); // Masked + 127
- data.writeUnsignedInt(0); // zero high order bits
- data.writeUnsignedInt(plength);
+ header.writeByte(0x80 | 127); // Masked + 127
+ header.writeUnsignedInt(0); // zero high order bits
+ header.writeUnsignedInt(plength);
} else {
fatal("Send frame size too large");
return 0;
@@ -157,19 +161,19 @@ public class WebSocket extends EventDispatcher {
var mask:Array = new Array(4);
for (var i:int = 0; i < 4; i++) {
mask[i] = randomInt(0, 255);
- data.writeByte(mask[i]);
+ header.writeByte(mask[i]);
}
- for (i = 0; i < raw_str.length; i++) {
- data.writeByte(mask[i%4] ^ raw_str.charCodeAt(i));
+ for (i = 0; i < data.length; i++) {
+ data[i] = mask[i%4] ^ data[i];
}
+ socket.writeBytes(header);
socket.writeBytes(data);
socket.flush();
logger.log("sent: " + data);
return -1;
} else if (readyState == CLOSING || readyState == CLOSED) {
- data.writeUTFBytes(raw_str);
- return data.length; // not sure whether it should include \x00 and \xff
+ return plength;
} else {
fatal("invalid state");
return 0;
@@ -253,7 +257,6 @@ public class WebSocket extends EventDispatcher {
SHA1.b64pad = "=";
expectedDigest = SHA1.b64_sha1(key + GUID);
- logger.error("expectedDigest: " + expectedDigest);
var opt:String = "";
if (protocol) opt += "Sec-WebSocket-Protocol: " + protocol + "\r\n";