@ -40,6 +40,12 @@ namespace WebSocketSharp {
internal class WsStream : IDisposable
internal class WsStream : IDisposable
{
{
#region Private Const Fields
private const int _handshakeLimitLen = 8192 ;
# endregion
#region Private Fields
#region Private Fields
private Stream _innerStream ;
private Stream _innerStream ;
@ -64,7 +70,7 @@ namespace WebSocketSharp {
public WsStream ( NetworkStream innerStream )
public WsStream ( NetworkStream innerStream )
: this ( )
: this ( )
{
{
if ( innerStream . IsNull ( ) )
if ( innerStream = = null )
throw new ArgumentNullException ( "innerStream" ) ;
throw new ArgumentNullException ( "innerStream" ) ;
_innerStream = innerStream ;
_innerStream = innerStream ;
@ -74,7 +80,7 @@ namespace WebSocketSharp {
public WsStream ( SslStream innerStream )
public WsStream ( SslStream innerStream )
: this ( )
: this ( )
{
{
if ( innerStream . IsNull ( ) )
if ( innerStream = = null )
throw new ArgumentNullException ( "innerStream" ) ;
throw new ArgumentNullException ( "innerStream" ) ;
_innerStream = innerStream ;
_innerStream = innerStream ;
@ -103,40 +109,6 @@ namespace WebSocketSharp {
#region Private Methods
#region Private Methods
private int read ( byte [ ] buffer , int offset , int size )
{
var readLen = _innerStream . Read ( buffer , offset , size ) ;
if ( readLen < size )
{
var msg = String . Format ( "Data can not be read from {0}." , _innerStream . GetType ( ) . Name ) ;
throw new IOException ( msg ) ;
}
return readLen ;
}
private int readByte ( )
{
return _innerStream . ReadByte ( ) ;
}
private string [ ] readHandshake ( )
{
var buffer = new List < byte > ( ) ;
while ( true )
{
if ( readByte ( ) . EqualsAndSaveTo ( '\r' , buffer ) & &
readByte ( ) . EqualsAndSaveTo ( '\n' , buffer ) & &
readByte ( ) . EqualsAndSaveTo ( '\r' , buffer ) & &
readByte ( ) . EqualsAndSaveTo ( '\n' , buffer ) )
break ;
}
return Encoding . UTF8 . GetString ( buffer . ToArray ( ) )
. Replace ( "\r\n" , "\n" ) . Replace ( "\n\n" , "\n" ) . TrimEnd ( '\n' )
. Split ( '\n' ) ;
}
private bool write ( byte [ ] data )
private bool write ( byte [ ] data )
{
{
lock ( _forWrite )
lock ( _forWrite )
@ -236,17 +208,30 @@ namespace WebSocketSharp {
public string [ ] ReadHandshake ( )
public string [ ] ReadHandshake ( )
{
{
lock ( _forRead )
var read = false ;
var buffer = new List < byte > ( ) ;
Action < int > add = i = > buffer . Add ( ( byte ) i ) ;
while ( buffer . Count < _handshakeLimitLen )
{
{
try
if ( _innerStream . ReadByte ( ) . EqualsWith ( '\r' , add ) & &
_innerStream . ReadByte ( ) . EqualsWith ( '\n' , add ) & &
_innerStream . ReadByte ( ) . EqualsWith ( '\r' , add ) & &
_innerStream . ReadByte ( ) . EqualsWith ( '\n' , add ) )
{
{
return readHandshake ( ) ;
read = true ;
}
break ;
catch
{
return null ;
}
}
}
}
if ( ! read )
throw new WebSocketException ( "The length of the handshake is greater than the limit length." ) ;
return Encoding . UTF8 . GetString ( buffer . ToArray ( ) )
. Replace ( "\r\n" , "\n" )
. Replace ( "\n " , " " )
. Replace ( "\n\t" , " " )
. Replace ( "\n\n" , "" )
. Split ( '\n' ) ;
}
}
public bool Write ( WsFrame frame )
public bool Write ( WsFrame frame )