@@ -607,7 +607,7 @@ private bool connect()
607607 // As client
608608 private static string createBase64Key ( )
609609 {
610- var src = new byte [ 16 ] ;
610+ var src = new byte [ 16 ] ;
611611 var rand = new Random ( ) ;
612612 rand . NextBytes ( src ) ;
613613
@@ -719,10 +719,10 @@ private ResponseHandshake createResponseHandshake(HttpStatusCode code)
719719
720720 private string createResponseKey ( )
721721 {
722+ var buffer = new StringBuilder ( _base64key , 64 ) ;
723+ buffer . Append ( _guid ) ;
722724 SHA1 sha1 = new SHA1CryptoServiceProvider ( ) ;
723- var sb = new StringBuilder ( _base64key ) ;
724- sb . Append ( _guid ) ;
725- var src = sha1 . ComputeHash ( Encoding . UTF8 . GetBytes ( sb . ToString ( ) ) ) ;
725+ var src = sha1 . ComputeHash ( Encoding . UTF8 . GetBytes ( buffer . ToString ( ) ) ) ;
726726
727727 return Convert . ToBase64String ( src ) ;
728728 }
@@ -1169,63 +1169,59 @@ private void send(ResponseHandshake response)
11691169
11701170 private bool send ( WsFrame frame )
11711171 {
1172- if ( ! isOpened ( false ) )
1172+ if ( _readyState == WsState . CONNECTING || _readyState == WsState . CLOSED )
11731173 {
11741174 onError ( "The WebSocket connection isn't established or has been closed." ) ;
11751175 return false ;
11761176 }
11771177
1178+ return _wsStream != null
1179+ ? _wsStream . Write ( frame )
1180+ : false ;
1181+ }
1182+
1183+ private void send ( Opcode opcode , Stream stream )
1184+ {
1185+ var data = stream ;
1186+ var compressed = false ;
11781187 try
11791188 {
1180- if ( _wsStream == null )
1181- return false ;
1189+ if ( _compression != CompressionMethod . NONE )
1190+ {
1191+ data = data . Compress ( _compression ) ;
1192+ compressed = true ;
1193+ }
11821194
1183- _wsStream . Write ( frame ) ;
1184- return true ;
1195+ send ( opcode , data , compressed ) ;
11851196 }
11861197 catch ( Exception ex )
11871198 {
11881199 onError ( ex . Message ) ;
1189- return false ;
11901200 }
1191- }
1192-
1193- private void send ( Opcode opcode , Stream stream )
1194- {
1195- if ( _compression == CompressionMethod . NONE )
1201+ finally
11961202 {
1197- send ( opcode , stream , false ) ;
1198- return ;
1199- }
1203+ if ( compressed )
1204+ data . Dispose ( ) ;
12001205
1201- using ( var compressed = stream . Compress ( _compression ) )
1202- {
1203- send ( opcode , compressed , true ) ;
1206+ stream . Dispose ( ) ;
12041207 }
12051208 }
12061209
12071210 private void send ( Opcode opcode , Stream stream , bool compressed )
12081211 {
12091212 lock ( _forSend )
12101213 {
1211- try
1214+ if ( _readyState != WsState . OPEN )
12121215 {
1213- if ( _readyState != WsState . OPEN )
1214- {
1215- onError ( "The WebSocket connection isn't established or has been closed." ) ;
1216- return ;
1217- }
1218-
1219- var length = stream . Length ;
1220- if ( length <= _fragmentLen )
1221- send ( Fin . FINAL , opcode , stream . ReadBytes ( ( int ) length ) , compressed ) ;
1222- else
1223- sendFragmented ( opcode , stream , compressed ) ;
1224- }
1225- catch ( Exception ex )
1226- {
1227- onError ( ex . Message ) ;
1216+ onError ( "The WebSocket connection isn't established or has been closed." ) ;
1217+ return ;
12281218 }
1219+
1220+ var length = stream . Length ;
1221+ if ( length <= _fragmentLen )
1222+ send ( Fin . FINAL , opcode , stream . ReadBytes ( ( int ) length ) , compressed ) ;
1223+ else
1224+ sendFragmented ( opcode , stream , compressed ) ;
12291225 }
12301226 }
12311227
@@ -1237,26 +1233,22 @@ private bool send(Fin fin, Opcode opcode, byte[] data, bool compressed)
12371233
12381234 private void sendAsync ( Opcode opcode , Stream stream , Action completed )
12391235 {
1240- Action < Opcode , Stream > action = send ;
1241- AsyncCallback callback = ( ar ) =>
1236+ Action < Opcode , Stream > sender = send ;
1237+ AsyncCallback callback = ar =>
12421238 {
12431239 try
12441240 {
1245- action . EndInvoke ( ar ) ;
1241+ sender . EndInvoke ( ar ) ;
12461242 if ( completed != null )
12471243 completed ( ) ;
12481244 }
12491245 catch ( Exception ex )
12501246 {
12511247 onError ( ex . Message ) ;
12521248 }
1253- finally
1254- {
1255- stream . Close ( ) ;
1256- }
12571249 } ;
12581250
1259- action . BeginInvoke ( opcode , stream , callback , null ) ;
1251+ sender . BeginInvoke ( opcode , stream , callback , null ) ;
12601252 }
12611253
12621254 private long sendFragmented ( Opcode opcode , Stream stream , bool compressed )
@@ -1267,8 +1259,8 @@ private long sendFragmented(Opcode opcode, Stream stream, bool compressed)
12671259 var count = rem == 0 ? quo - 2 : quo - 1 ;
12681260
12691261 long readLen = 0 ;
1270- var tmpLen = 0 ;
1271- var buffer = new byte [ _fragmentLen ] ;
1262+ var tmpLen = 0 ;
1263+ var buffer = new byte [ _fragmentLen ] ;
12721264
12731265 // First
12741266 tmpLen = stream . Read ( buffer , 0 , _fragmentLen ) ;
@@ -1519,10 +1511,8 @@ public void Send(byte[] data)
15191511 return ;
15201512 }
15211513
1522- using ( var ms = new MemoryStream ( data ) )
1523- {
1524- send ( Opcode . BINARY , ms ) ;
1525- }
1514+ var stream = new MemoryStream ( data ) ;
1515+ send ( Opcode . BINARY , stream ) ;
15261516 }
15271517
15281518 /// <summary>
@@ -1539,10 +1529,8 @@ public void Send(string data)
15391529 return ;
15401530 }
15411531
1542- using ( var ms = new MemoryStream ( Encoding . UTF8 . GetBytes ( data ) ) )
1543- {
1544- send ( Opcode . TEXT , ms ) ;
1545- }
1532+ var stream = new MemoryStream ( Encoding . UTF8 . GetBytes ( data ) ) ;
1533+ send ( Opcode . TEXT , stream ) ;
15461534 }
15471535
15481536 /// <summary>
@@ -1559,10 +1547,7 @@ public void Send(FileInfo file)
15591547 return ;
15601548 }
15611549
1562- using ( var fs = file . OpenRead ( ) )
1563- {
1564- send ( Opcode . BINARY , fs ) ;
1565- }
1550+ send ( Opcode . BINARY , file . OpenRead ( ) ) ;
15661551 }
15671552
15681553 /// <summary>
@@ -1583,8 +1568,8 @@ public void SendAsync(byte[] data, Action completed)
15831568 return ;
15841569 }
15851570
1586- var ms = new MemoryStream ( data ) ;
1587- sendAsync ( Opcode . BINARY , ms , completed ) ;
1571+ var stream = new MemoryStream ( data ) ;
1572+ sendAsync ( Opcode . BINARY , stream , completed ) ;
15881573 }
15891574
15901575 /// <summary>
@@ -1605,8 +1590,8 @@ public void SendAsync(string data, Action completed)
16051590 return ;
16061591 }
16071592
1608- var ms = new MemoryStream ( Encoding . UTF8 . GetBytes ( data ) ) ;
1609- sendAsync ( Opcode . TEXT , ms , completed ) ;
1593+ var stream = new MemoryStream ( Encoding . UTF8 . GetBytes ( data ) ) ;
1594+ sendAsync ( Opcode . TEXT , stream , completed ) ;
16101595 }
16111596
16121597 /// <summary>
0 commit comments