|
|
|
|
@ -719,10 +719,10 @@ namespace WebSocketSharp {
|
|
|
|
|
|
|
|
|
|
private string createResponseKey()
|
|
|
|
|
{
|
|
|
|
|
var buffer = new StringBuilder(_base64key, 64);
|
|
|
|
|
buffer.Append(_guid);
|
|
|
|
|
SHA1 sha1 = new SHA1CryptoServiceProvider();
|
|
|
|
|
var sb = new StringBuilder(_base64key);
|
|
|
|
|
sb.Append(_guid);
|
|
|
|
|
var src = sha1.ComputeHash(Encoding.UTF8.GetBytes(sb.ToString()));
|
|
|
|
|
var src = sha1.ComputeHash(Encoding.UTF8.GetBytes(buffer.ToString()));
|
|
|
|
|
|
|
|
|
|
return Convert.ToBase64String(src);
|
|
|
|
|
}
|
|
|
|
|
@ -1169,46 +1169,47 @@ namespace WebSocketSharp {
|
|
|
|
|
|
|
|
|
|
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.");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return _wsStream != null
|
|
|
|
|
? _wsStream.Write(frame)
|
|
|
|
|
: false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void send(Opcode opcode, Stream stream)
|
|
|
|
|
{
|
|
|
|
|
var data = stream;
|
|
|
|
|
var compressed = false;
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
if (_wsStream == null)
|
|
|
|
|
return false;
|
|
|
|
|
if (_compression != CompressionMethod.NONE)
|
|
|
|
|
{
|
|
|
|
|
data = data.Compress(_compression);
|
|
|
|
|
compressed = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_wsStream.Write(frame);
|
|
|
|
|
return true;
|
|
|
|
|
send(opcode, data, compressed);
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
onError(ex.Message);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void send(Opcode opcode, Stream stream)
|
|
|
|
|
{
|
|
|
|
|
if (_compression == CompressionMethod.NONE)
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
send(opcode, stream, false);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (compressed)
|
|
|
|
|
data.Dispose();
|
|
|
|
|
|
|
|
|
|
using (var compressed = stream.Compress(_compression))
|
|
|
|
|
{
|
|
|
|
|
send(opcode, compressed, true);
|
|
|
|
|
stream.Dispose();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void send(Opcode opcode, Stream stream, bool compressed)
|
|
|
|
|
{
|
|
|
|
|
lock (_forSend)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
if (_readyState != WsState.OPEN)
|
|
|
|
|
{
|
|
|
|
|
@ -1222,11 +1223,6 @@ namespace WebSocketSharp {
|
|
|
|
|
else
|
|
|
|
|
sendFragmented(opcode, stream, compressed);
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
onError(ex.Message);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private bool send(Fin fin, Opcode opcode, byte[] data, bool compressed)
|
|
|
|
|
@ -1237,12 +1233,12 @@ namespace WebSocketSharp {
|
|
|
|
|
|
|
|
|
|
private void sendAsync(Opcode opcode, Stream stream, Action completed)
|
|
|
|
|
{
|
|
|
|
|
Action<Opcode, Stream> action = send;
|
|
|
|
|
AsyncCallback callback = (ar) =>
|
|
|
|
|
Action<Opcode, Stream> sender = send;
|
|
|
|
|
AsyncCallback callback = ar =>
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
action.EndInvoke(ar);
|
|
|
|
|
sender.EndInvoke(ar);
|
|
|
|
|
if (completed != null)
|
|
|
|
|
completed();
|
|
|
|
|
}
|
|
|
|
|
@ -1250,13 +1246,9 @@ namespace WebSocketSharp {
|
|
|
|
|
{
|
|
|
|
|
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)
|
|
|
|
|
@ -1519,10 +1511,8 @@ namespace WebSocketSharp {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using (var ms = new MemoryStream(data))
|
|
|
|
|
{
|
|
|
|
|
send(Opcode.BINARY, ms);
|
|
|
|
|
}
|
|
|
|
|
var stream = new MemoryStream(data);
|
|
|
|
|
send(Opcode.BINARY, stream);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
@ -1539,10 +1529,8 @@ namespace WebSocketSharp {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(data)))
|
|
|
|
|
{
|
|
|
|
|
send(Opcode.TEXT, ms);
|
|
|
|
|
}
|
|
|
|
|
var stream = new MemoryStream(Encoding.UTF8.GetBytes(data));
|
|
|
|
|
send(Opcode.TEXT, stream);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
@ -1559,10 +1547,7 @@ namespace WebSocketSharp {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using (var fs = file.OpenRead())
|
|
|
|
|
{
|
|
|
|
|
send(Opcode.BINARY, fs);
|
|
|
|
|
}
|
|
|
|
|
send(Opcode.BINARY, file.OpenRead());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
@ -1583,8 +1568,8 @@ namespace WebSocketSharp {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var ms = new MemoryStream(data);
|
|
|
|
|
sendAsync(Opcode.BINARY, ms, completed);
|
|
|
|
|
var stream = new MemoryStream(data);
|
|
|
|
|
sendAsync(Opcode.BINARY, stream, completed);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
@ -1605,8 +1590,8 @@ namespace WebSocketSharp {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var ms = new MemoryStream(Encoding.UTF8.GetBytes(data));
|
|
|
|
|
sendAsync(Opcode.TEXT, ms, completed);
|
|
|
|
|
var stream = new MemoryStream(Encoding.UTF8.GetBytes(data));
|
|
|
|
|
sendAsync(Opcode.TEXT, stream, completed);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|