Modified WebSocket.cs

This commit is contained in:
sta 2013-05-10 22:35:23 +09:00
parent 876a017ff0
commit b3f6aa2ebf
10 changed files with 51 additions and 66 deletions

Binary file not shown.

View File

@ -607,7 +607,7 @@ namespace WebSocketSharp {
// As client // As client
private static string createBase64Key() private static string createBase64Key()
{ {
var src = new byte[16]; var src = new byte[16];
var rand = new Random(); var rand = new Random();
rand.NextBytes(src); rand.NextBytes(src);
@ -719,10 +719,10 @@ namespace WebSocketSharp {
private string createResponseKey() private string createResponseKey()
{ {
var buffer = new StringBuilder(_base64key, 64);
buffer.Append(_guid);
SHA1 sha1 = new SHA1CryptoServiceProvider(); SHA1 sha1 = new SHA1CryptoServiceProvider();
var sb = new StringBuilder(_base64key); var src = sha1.ComputeHash(Encoding.UTF8.GetBytes(buffer.ToString()));
sb.Append(_guid);
var src = sha1.ComputeHash(Encoding.UTF8.GetBytes(sb.ToString()));
return Convert.ToBase64String(src); return Convert.ToBase64String(src);
} }
@ -1169,38 +1169,41 @@ namespace WebSocketSharp {
private bool send(WsFrame frame) private bool send(WsFrame frame)
{ {
if (!isOpened(false)) if (_readyState == WsState.CONNECTING || _readyState == WsState.CLOSED)
{ {
onError("The WebSocket connection isn't established or has been closed."); onError("The WebSocket connection isn't established or has been closed.");
return false; return false;
} }
try return _wsStream != null
{ ? _wsStream.Write(frame)
if (_wsStream == null) : false;
return false;
_wsStream.Write(frame);
return true;
}
catch (Exception ex)
{
onError(ex.Message);
return false;
}
} }
private void send(Opcode opcode, Stream stream) private void send(Opcode opcode, Stream stream)
{ {
if (_compression == CompressionMethod.NONE) var data = stream;
var compressed = false;
try
{ {
send(opcode, stream, false); if (_compression != CompressionMethod.NONE)
return; {
} data = data.Compress(_compression);
compressed = true;
}
using (var compressed = stream.Compress(_compression)) send(opcode, data, compressed);
}
catch (Exception ex)
{ {
send(opcode, compressed, true); onError(ex.Message);
}
finally
{
if (compressed)
data.Dispose();
stream.Dispose();
} }
} }
@ -1208,24 +1211,17 @@ namespace WebSocketSharp {
{ {
lock (_forSend) lock (_forSend)
{ {
try if (_readyState != WsState.OPEN)
{ {
if (_readyState != WsState.OPEN) onError("The WebSocket connection isn't established or has been closed.");
{ return;
onError("The WebSocket connection isn't established or has been closed."); }
return;
}
var length = stream.Length; var length = stream.Length;
if (length <= _fragmentLen) if (length <= _fragmentLen)
send(Fin.FINAL, opcode, stream.ReadBytes((int)length), compressed); send(Fin.FINAL, opcode, stream.ReadBytes((int)length), compressed);
else else
sendFragmented(opcode, stream, compressed); sendFragmented(opcode, stream, compressed);
}
catch (Exception ex)
{
onError(ex.Message);
}
} }
} }
@ -1237,12 +1233,12 @@ namespace WebSocketSharp {
private void sendAsync(Opcode opcode, Stream stream, Action completed) private void sendAsync(Opcode opcode, Stream stream, Action completed)
{ {
Action<Opcode, Stream> action = send; Action<Opcode, Stream> sender = send;
AsyncCallback callback = (ar) => AsyncCallback callback = ar =>
{ {
try try
{ {
action.EndInvoke(ar); sender.EndInvoke(ar);
if (completed != null) if (completed != null)
completed(); completed();
} }
@ -1250,13 +1246,9 @@ namespace WebSocketSharp {
{ {
onError(ex.Message); onError(ex.Message);
} }
finally
{
stream.Close();
}
}; };
action.BeginInvoke(opcode, stream, callback, null); sender.BeginInvoke(opcode, stream, callback, null);
} }
private long sendFragmented(Opcode opcode, Stream stream, bool compressed) private long sendFragmented(Opcode opcode, Stream stream, bool compressed)
@ -1267,8 +1259,8 @@ namespace WebSocketSharp {
var count = rem == 0 ? quo - 2 : quo - 1; var count = rem == 0 ? quo - 2 : quo - 1;
long readLen = 0; long readLen = 0;
var tmpLen = 0; var tmpLen = 0;
var buffer = new byte[_fragmentLen]; var buffer = new byte[_fragmentLen];
// First // First
tmpLen = stream.Read(buffer, 0, _fragmentLen); tmpLen = stream.Read(buffer, 0, _fragmentLen);
@ -1519,10 +1511,8 @@ namespace WebSocketSharp {
return; return;
} }
using (var ms = new MemoryStream(data)) var stream = new MemoryStream(data);
{ send(Opcode.BINARY, stream);
send(Opcode.BINARY, ms);
}
} }
/// <summary> /// <summary>
@ -1539,10 +1529,8 @@ namespace WebSocketSharp {
return; return;
} }
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(data))) var stream = new MemoryStream(Encoding.UTF8.GetBytes(data));
{ send(Opcode.TEXT, stream);
send(Opcode.TEXT, ms);
}
} }
/// <summary> /// <summary>
@ -1559,10 +1547,7 @@ namespace WebSocketSharp {
return; return;
} }
using (var fs = file.OpenRead()) send(Opcode.BINARY, file.OpenRead());
{
send(Opcode.BINARY, fs);
}
} }
/// <summary> /// <summary>
@ -1583,8 +1568,8 @@ namespace WebSocketSharp {
return; return;
} }
var ms = new MemoryStream(data); var stream = new MemoryStream(data);
sendAsync(Opcode.BINARY, ms, completed); sendAsync(Opcode.BINARY, stream, completed);
} }
/// <summary> /// <summary>
@ -1605,8 +1590,8 @@ namespace WebSocketSharp {
return; return;
} }
var ms = new MemoryStream(Encoding.UTF8.GetBytes(data)); var stream = new MemoryStream(Encoding.UTF8.GetBytes(data));
sendAsync(Opcode.TEXT, ms, completed); sendAsync(Opcode.TEXT, stream, completed);
} }
/// <summary> /// <summary>