Refactored WebSocket.cs
This commit is contained in:
parent
a18993f2be
commit
0c9179be03
@ -611,7 +611,7 @@ namespace WebSocketSharp
|
|||||||
private bool acceptPingFrame (WebSocketFrame frame)
|
private bool acceptPingFrame (WebSocketFrame frame)
|
||||||
{
|
{
|
||||||
var mask = _client ? Mask.Mask : Mask.Unmask;
|
var mask = _client ? Mask.Mask : Mask.Unmask;
|
||||||
if (sendWebSocketFrame (WebSocketFrame.CreatePongFrame (mask, frame.PayloadData)))
|
if (send (WebSocketFrame.CreatePongFrame (mask, frame.PayloadData).ToByteArray ()))
|
||||||
_logger.Trace ("Returned a Pong.");
|
_logger.Trace ("Returned a Pong.");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -775,9 +775,9 @@ namespace WebSocketSharp
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool closeHandshake (byte[] data, int millisecondsTimeout, Action release)
|
private bool closeHandshake (byte[] frameAsBytes, int millisecondsTimeout, Action release)
|
||||||
{
|
{
|
||||||
var sent = data != null && _stream.WriteBytes (data);
|
var sent = frameAsBytes != null && _stream.WriteBytes (frameAsBytes);
|
||||||
var received =
|
var received =
|
||||||
millisecondsTimeout == 0 ||
|
millisecondsTimeout == 0 ||
|
||||||
(sent && _exitReceiving != null && _exitReceiving.WaitOne (millisecondsTimeout));
|
(sent && _exitReceiving != null && _exitReceiving.WaitOne (millisecondsTimeout));
|
||||||
@ -1045,6 +1045,18 @@ namespace WebSocketSharp
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool send (byte[] frameAsBytes)
|
||||||
|
{
|
||||||
|
lock (_forConn) {
|
||||||
|
if (_readyState != WebSocketState.Open) {
|
||||||
|
_logger.Warn ("Sending has been interrupted.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _stream.WriteBytes (frameAsBytes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private bool send (Opcode opcode, byte[] data)
|
private bool send (Opcode opcode, byte[] data)
|
||||||
{
|
{
|
||||||
lock (_forSend) {
|
lock (_forSend) {
|
||||||
@ -1057,8 +1069,7 @@ namespace WebSocketSharp
|
|||||||
}
|
}
|
||||||
|
|
||||||
var mask = _client ? Mask.Mask : Mask.Unmask;
|
var mask = _client ? Mask.Mask : Mask.Unmask;
|
||||||
sent = sendWebSocketFrame (
|
sent = send (Fin.Final, opcode, mask, data, compressed);
|
||||||
WebSocketFrame.CreateFrame (Fin.Final, opcode, mask, data, compressed));
|
|
||||||
}
|
}
|
||||||
catch (Exception ex) {
|
catch (Exception ex) {
|
||||||
_logger.Fatal (ex.ToString ());
|
_logger.Fatal (ex.ToString ());
|
||||||
@ -1072,8 +1083,8 @@ namespace WebSocketSharp
|
|||||||
private bool send (Opcode opcode, Stream stream)
|
private bool send (Opcode opcode, Stream stream)
|
||||||
{
|
{
|
||||||
lock (_forSend) {
|
lock (_forSend) {
|
||||||
var sent = false;
|
|
||||||
var src = stream;
|
var src = stream;
|
||||||
|
var sent = false;
|
||||||
var compressed = false;
|
var compressed = false;
|
||||||
try {
|
try {
|
||||||
if (_compression != CompressionMethod.None) {
|
if (_compression != CompressionMethod.None) {
|
||||||
@ -1099,6 +1110,19 @@ namespace WebSocketSharp
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool send (Fin fin, Opcode opcode, Mask mask, byte[] data, bool compressed)
|
||||||
|
{
|
||||||
|
lock (_forConn) {
|
||||||
|
if (_readyState != WebSocketState.Open) {
|
||||||
|
_logger.Warn ("Sending has been interrupted.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _stream.WriteBytes (
|
||||||
|
WebSocketFrame.CreateFrame (fin, opcode, mask, data, compressed).ToByteArray ());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void sendAsync (Opcode opcode, byte[] data, Action<bool> completed)
|
private void sendAsync (Opcode opcode, byte[] data, Action<bool> completed)
|
||||||
{
|
{
|
||||||
Func<Opcode, byte[], bool> sender = send;
|
Func<Opcode, byte[], bool> sender = send;
|
||||||
@ -1152,23 +1176,20 @@ namespace WebSocketSharp
|
|||||||
if (quo == 0) {
|
if (quo == 0) {
|
||||||
buff = new byte[rem];
|
buff = new byte[rem];
|
||||||
return stream.Read (buff, 0, rem) == rem &&
|
return stream.Read (buff, 0, rem) == rem &&
|
||||||
sendWebSocketFrame (
|
send (Fin.Final, opcode, mask, buff, compressed);
|
||||||
WebSocketFrame.CreateFrame (Fin.Final, opcode, mask, buff, compressed));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
buff = new byte[FragmentLength];
|
buff = new byte[FragmentLength];
|
||||||
|
|
||||||
// First
|
// First
|
||||||
if (stream.Read (buff, 0, FragmentLength) != FragmentLength ||
|
if (stream.Read (buff, 0, FragmentLength) != FragmentLength ||
|
||||||
!sendWebSocketFrame (
|
!send (Fin.More, opcode, mask, buff, compressed))
|
||||||
WebSocketFrame.CreateFrame (Fin.More, opcode, mask, buff, compressed)))
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Mid
|
// Mid
|
||||||
for (long i = 0; i < times; i++) {
|
for (long i = 0; i < times; i++) {
|
||||||
if (stream.Read (buff, 0, FragmentLength) != FragmentLength ||
|
if (stream.Read (buff, 0, FragmentLength) != FragmentLength ||
|
||||||
!sendWebSocketFrame (
|
!send (Fin.More, Opcode.Cont, mask, buff, compressed))
|
||||||
WebSocketFrame.CreateFrame (Fin.More, Opcode.Cont, mask, buff, compressed)))
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1178,8 +1199,7 @@ namespace WebSocketSharp
|
|||||||
buff = new byte[tmpLen = rem];
|
buff = new byte[tmpLen = rem];
|
||||||
|
|
||||||
return stream.Read (buff, 0, tmpLen) == tmpLen &&
|
return stream.Read (buff, 0, tmpLen) == tmpLen &&
|
||||||
sendWebSocketFrame (
|
send (Fin.Final, Opcode.Cont, mask, buff, compressed);
|
||||||
WebSocketFrame.CreateFrame (Fin.Final, Opcode.Cont, mask, buff, compressed));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// As client
|
// As client
|
||||||
@ -1227,30 +1247,6 @@ namespace WebSocketSharp
|
|||||||
return _stream.WriteHttp (response);
|
return _stream.WriteHttp (response);
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool sendWebSocketFrame (byte[] data)
|
|
||||||
{
|
|
||||||
lock (_forConn) {
|
|
||||||
if (_readyState != WebSocketState.Open) {
|
|
||||||
_logger.Warn ("Sending has been interrupted.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return _stream.WriteBytes (data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool sendWebSocketFrame (WebSocketFrame frame)
|
|
||||||
{
|
|
||||||
lock (_forConn) {
|
|
||||||
if (_readyState != WebSocketState.Open) {
|
|
||||||
_logger.Warn ("Sending has been interrupted.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return _stream.WriteWebSocketFrame (frame);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// As client
|
// As client
|
||||||
private void setClientStream ()
|
private void setClientStream ()
|
||||||
{
|
{
|
||||||
@ -1386,7 +1382,7 @@ namespace WebSocketSharp
|
|||||||
}
|
}
|
||||||
|
|
||||||
// As server
|
// As server
|
||||||
internal void Close (CloseEventArgs e, byte[] data, int millisecondsTimeout)
|
internal void Close (CloseEventArgs e, byte[] frameAsBytes, int millisecondsTimeout)
|
||||||
{
|
{
|
||||||
lock (_forConn) {
|
lock (_forConn) {
|
||||||
if (_readyState == WebSocketState.Closing || _readyState == WebSocketState.Closed) {
|
if (_readyState == WebSocketState.Closing || _readyState == WebSocketState.Closed) {
|
||||||
@ -1397,7 +1393,7 @@ namespace WebSocketSharp
|
|||||||
_readyState = WebSocketState.Closing;
|
_readyState = WebSocketState.Closing;
|
||||||
}
|
}
|
||||||
|
|
||||||
e.WasClean = closeHandshake (data, millisecondsTimeout, closeServerResources);
|
e.WasClean = closeHandshake (frameAsBytes, millisecondsTimeout, closeServerResources);
|
||||||
|
|
||||||
_readyState = WebSocketState.Closed;
|
_readyState = WebSocketState.Closed;
|
||||||
try {
|
try {
|
||||||
@ -1442,12 +1438,12 @@ namespace WebSocketSharp
|
|||||||
return Convert.ToBase64String (src);
|
return Convert.ToBase64String (src);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal bool Ping (byte[] data, int millisecondsTimeout)
|
internal bool Ping (byte[] frameAsBytes, int millisecondsTimeout)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
AutoResetEvent pong;
|
AutoResetEvent pong;
|
||||||
return _readyState == WebSocketState.Open &&
|
return _readyState == WebSocketState.Open &&
|
||||||
sendWebSocketFrame (data) &&
|
send (frameAsBytes) &&
|
||||||
(pong = _receivePong) != null &&
|
(pong = _receivePong) != null &&
|
||||||
pong.WaitOne (millisecondsTimeout);
|
pong.WaitOne (millisecondsTimeout);
|
||||||
}
|
}
|
||||||
@ -1499,8 +1495,9 @@ namespace WebSocketSharp
|
|||||||
cached = stream.Compress (_compression);
|
cached = stream.Compress (_compression);
|
||||||
cache.Add (_compression, cached);
|
cache.Add (_compression, cached);
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
cached.Position = 0;
|
cached.Position = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (_readyState == WebSocketState.Open)
|
if (_readyState == WebSocketState.Open)
|
||||||
sendFragmented (opcode, cached, Mask.Unmask, _compression != CompressionMethod.None);
|
sendFragmented (opcode, cached, Mask.Unmask, _compression != CompressionMethod.None);
|
||||||
|
@ -292,12 +292,6 @@ namespace WebSocketSharp
|
|||||||
return writeBytes (_innerStream, http.ToByteArray ());
|
return writeBytes (_innerStream, http.ToByteArray ());
|
||||||
}
|
}
|
||||||
|
|
||||||
internal bool WriteWebSocketFrame (WebSocketFrame frame)
|
|
||||||
{
|
|
||||||
lock (_forWrite)
|
|
||||||
return writeBytes (_innerStream, frame.ToByteArray ());
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Public Methods
|
#region Public Methods
|
||||||
|
Loading…
Reference in New Issue
Block a user