Refactored WebSocket.cs

This commit is contained in:
sta 2014-07-18 17:57:03 +09:00
parent a18993f2be
commit 0c9179be03
2 changed files with 40 additions and 49 deletions

View File

@ -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);

View File

@ -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