@@ -738,7 +738,7 @@ private string checkIfValidReceivedFrame (WebSocketFrame frame)
738738 : null ;
739739 }
740740
741- private void close ( CloseEventArgs e , bool send , bool wait )
741+ private void close ( CloseEventArgs e , bool send , bool receive , bool received )
742742 {
743743 lock ( _forConn ) {
744744 if ( _readyState == WebSocketState . Closing ) {
@@ -752,17 +752,15 @@ private void close (CloseEventArgs e, bool send, bool wait)
752752 }
753753
754754 send = send && _readyState == WebSocketState . Open ;
755- wait = wait && send ;
755+ receive = receive && send ;
756756
757757 _readyState = WebSocketState . Closing ;
758758 }
759759
760760 _logger . Trace ( "Begin closing the connection." ) ;
761761
762- e . WasClean = closeHandshake (
763- send ? WebSocketFrame . CreateCloseFrame ( e . PayloadData , _client ) . ToArray ( ) : null ,
764- wait ? _waitTime : TimeSpan . Zero ,
765- _client ? ( Action ) releaseClientResources : releaseServerResources ) ;
762+ var bytes = send ? WebSocketFrame . CreateCloseFrame ( e . PayloadData , _client ) . ToArray ( ) : null ;
763+ e . WasClean = closeHandshake ( bytes , receive , received ) ;
766764
767765 _logger . Trace ( "End closing the connection." ) ;
768766
@@ -776,19 +774,23 @@ private void close (CloseEventArgs e, bool send, bool wait)
776774 }
777775 }
778776
779- private void closeAsync ( CloseEventArgs e , bool send , bool wait )
777+ private void closeAsync ( CloseEventArgs e , bool send , bool receive , bool received )
780778 {
781- Action < CloseEventArgs , bool , bool > closer = close ;
782- closer . BeginInvoke ( e , send , wait , ar => closer . EndInvoke ( ar ) , null ) ;
779+ Action < CloseEventArgs , bool , bool , bool > closer = close ;
780+ closer . BeginInvoke ( e , send , receive , received , ar => closer . EndInvoke ( ar ) , null ) ;
783781 }
784782
785- private bool closeHandshake ( byte [ ] frameAsBytes , TimeSpan timeout , Action release )
783+ private bool closeHandshake ( byte [ ] frameAsBytes , bool receive , bool received )
786784 {
787785 var sent = frameAsBytes != null && sendBytes ( frameAsBytes ) ;
788- var received = timeout == TimeSpan . Zero ||
789- ( sent && _exitReceiving != null && _exitReceiving . WaitOne ( timeout ) ) ;
786+ received = received ||
787+ ( receive && sent && _exitReceiving != null && _exitReceiving . WaitOne ( _waitTime ) ) ;
788+
789+ if ( _client )
790+ releaseClientResources ( ) ;
791+ else
792+ releaseServerResources ( ) ;
790793
791- release ( ) ;
792794 if ( _fragmentsBuffer != null ) {
793795 _fragmentsBuffer . Dispose ( ) ;
794796 _fragmentsBuffer = null ;
@@ -944,7 +946,7 @@ private bool doHandshake ()
944946
945947 msg = "An error has occurred while connecting." ;
946948 error ( msg , null ) ;
947- close ( new CloseEventArgs ( CloseStatusCode . Abnormal , msg ) , false , false ) ;
949+ close ( new CloseEventArgs ( CloseStatusCode . Abnormal , msg ) , false , false , false ) ;
948950
949951 return false ;
950952 }
@@ -1006,7 +1008,7 @@ private void open ()
10061008 private bool processCloseFrame ( WebSocketFrame frame )
10071009 {
10081010 var payload = frame . PayloadData ;
1009- close ( new CloseEventArgs ( payload ) , ! payload . IncludesReservedCloseStatusCode , false ) ;
1011+ close ( new CloseEventArgs ( payload ) , ! payload . IncludesReservedCloseStatusCode , false , true ) ;
10101012
10111013 return false ;
10121014 }
@@ -1043,7 +1045,8 @@ private void processException (Exception exception, string message)
10431045 return ;
10441046 }
10451047
1046- close ( new CloseEventArgs ( code , reason ?? code . GetMessage ( ) ) , ! code . IsReserved ( ) , false ) ;
1048+ close (
1049+ new CloseEventArgs ( code , reason ?? code . GetMessage ( ) ) , ! code . IsReserved ( ) , false , false ) ;
10471050 }
10481051
10491052 private bool processFragmentedFrame ( WebSocketFrame frame )
@@ -1677,7 +1680,7 @@ internal void Close (HttpStatusCode code)
16771680 }
16781681
16791682 // As server
1680- internal void Close ( CloseEventArgs e , byte [ ] frameAsBytes , TimeSpan timeout )
1683+ internal void Close ( CloseEventArgs e , byte [ ] frameAsBytes , bool receive )
16811684 {
16821685 lock ( _forConn ) {
16831686 if ( _readyState == WebSocketState . Closing ) {
@@ -1693,7 +1696,7 @@ internal void Close (CloseEventArgs e, byte[] frameAsBytes, TimeSpan timeout)
16931696 _readyState = WebSocketState . Closing ;
16941697 }
16951698
1696- e . WasClean = closeHandshake ( frameAsBytes , timeout , releaseServerResources ) ;
1699+ e . WasClean = closeHandshake ( frameAsBytes , receive , false ) ;
16971700
16981701 _readyState = WebSocketState . Closed ;
16991702 try {
@@ -1874,7 +1877,7 @@ public void Close ()
18741877 return ;
18751878 }
18761879
1877- close ( new CloseEventArgs ( ) , true , true ) ;
1880+ close ( new CloseEventArgs ( ) , true , true , false ) ;
18781881 }
18791882
18801883 /// <summary>
@@ -1901,12 +1904,12 @@ public void Close (ushort code)
19011904 }
19021905
19031906 if ( code == ( ushort ) CloseStatusCode . NoStatus ) {
1904- close ( new CloseEventArgs ( ) , true , true ) ;
1907+ close ( new CloseEventArgs ( ) , true , true , false ) ;
19051908 return ;
19061909 }
19071910
19081911 var send = ! code . IsReserved ( ) ;
1909- close ( new CloseEventArgs ( code ) , send , send ) ;
1912+ close ( new CloseEventArgs ( code ) , send , send , false ) ;
19101913 }
19111914
19121915 /// <summary>
@@ -1930,12 +1933,12 @@ public void Close (CloseStatusCode code)
19301933 }
19311934
19321935 if ( code == CloseStatusCode . NoStatus ) {
1933- close ( new CloseEventArgs ( ) , true , true ) ;
1936+ close ( new CloseEventArgs ( ) , true , true , false ) ;
19341937 return ;
19351938 }
19361939
19371940 var send = ! code . IsReserved ( ) ;
1938- close ( new CloseEventArgs ( code ) , send , send ) ;
1941+ close ( new CloseEventArgs ( code ) , send , send , false ) ;
19391942 }
19401943
19411944 /// <summary>
@@ -1966,12 +1969,12 @@ public void Close (ushort code, string reason)
19661969 }
19671970
19681971 if ( code == ( ushort ) CloseStatusCode . NoStatus ) {
1969- close ( new CloseEventArgs ( ) , true , true ) ;
1972+ close ( new CloseEventArgs ( ) , true , true , false ) ;
19701973 return ;
19711974 }
19721975
19731976 var send = ! code . IsReserved ( ) ;
1974- close ( new CloseEventArgs ( code , reason ) , send , send ) ;
1977+ close ( new CloseEventArgs ( code , reason ) , send , send , false ) ;
19751978 }
19761979
19771980 /// <summary>
@@ -2002,12 +2005,12 @@ public void Close (CloseStatusCode code, string reason)
20022005 }
20032006
20042007 if ( code == CloseStatusCode . NoStatus ) {
2005- close ( new CloseEventArgs ( ) , true , true ) ;
2008+ close ( new CloseEventArgs ( ) , true , true , false ) ;
20062009 return ;
20072010 }
20082011
20092012 var send = ! code . IsReserved ( ) ;
2010- close ( new CloseEventArgs ( code , reason ) , send , send ) ;
2013+ close ( new CloseEventArgs ( code , reason ) , send , send , false ) ;
20112014 }
20122015
20132016 /// <summary>
@@ -2026,7 +2029,7 @@ public void CloseAsync ()
20262029 return ;
20272030 }
20282031
2029- closeAsync ( new CloseEventArgs ( ) , true , true ) ;
2032+ closeAsync ( new CloseEventArgs ( ) , true , true , false ) ;
20302033 }
20312034
20322035 /// <summary>
@@ -2058,12 +2061,12 @@ public void CloseAsync (ushort code)
20582061 }
20592062
20602063 if ( code == ( ushort ) CloseStatusCode . NoStatus ) {
2061- closeAsync ( new CloseEventArgs ( ) , true , true ) ;
2064+ closeAsync ( new CloseEventArgs ( ) , true , true , false ) ;
20622065 return ;
20632066 }
20642067
20652068 var send = ! code . IsReserved ( ) ;
2066- closeAsync ( new CloseEventArgs ( code ) , send , send ) ;
2069+ closeAsync ( new CloseEventArgs ( code ) , send , send , false ) ;
20672070 }
20682071
20692072 /// <summary>
@@ -2090,12 +2093,12 @@ public void CloseAsync (CloseStatusCode code)
20902093 }
20912094
20922095 if ( code == CloseStatusCode . NoStatus ) {
2093- closeAsync ( new CloseEventArgs ( ) , true , true ) ;
2096+ closeAsync ( new CloseEventArgs ( ) , true , true , false ) ;
20942097 return ;
20952098 }
20962099
20972100 var send = ! code . IsReserved ( ) ;
2098- closeAsync ( new CloseEventArgs ( code ) , send , send ) ;
2101+ closeAsync ( new CloseEventArgs ( code ) , send , send , false ) ;
20992102 }
21002103
21012104 /// <summary>
@@ -2131,12 +2134,12 @@ public void CloseAsync (ushort code, string reason)
21312134 }
21322135
21332136 if ( code == ( ushort ) CloseStatusCode . NoStatus ) {
2134- closeAsync ( new CloseEventArgs ( ) , true , true ) ;
2137+ closeAsync ( new CloseEventArgs ( ) , true , true , false ) ;
21352138 return ;
21362139 }
21372140
21382141 var send = ! code . IsReserved ( ) ;
2139- closeAsync ( new CloseEventArgs ( code , reason ) , send , send ) ;
2142+ closeAsync ( new CloseEventArgs ( code , reason ) , send , send , false ) ;
21402143 }
21412144
21422145 /// <summary>
@@ -2173,12 +2176,12 @@ public void CloseAsync (CloseStatusCode code, string reason)
21732176 }
21742177
21752178 if ( code == CloseStatusCode . NoStatus ) {
2176- closeAsync ( new CloseEventArgs ( ) , true , true ) ;
2179+ closeAsync ( new CloseEventArgs ( ) , true , true , false ) ;
21772180 return ;
21782181 }
21792182
21802183 var send = ! code . IsReserved ( ) ;
2181- closeAsync ( new CloseEventArgs ( code , reason ) , send , send ) ;
2184+ closeAsync ( new CloseEventArgs ( code , reason ) , send , send , false ) ;
21822185 }
21832186
21842187 /// <summary>
@@ -2631,7 +2634,7 @@ public void SetProxy (string url, string username, string password)
26312634 /// </remarks>
26322635 void IDisposable . Dispose ( )
26332636 {
2634- close ( new CloseEventArgs ( CloseStatusCode . Away ) , true , true ) ;
2637+ close ( new CloseEventArgs ( CloseStatusCode . Away ) , true , true , false ) ;
26352638 }
26362639
26372640 #endregion
0 commit comments