|
|
|
@ -30,10 +30,10 @@ using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Configuration;
|
|
|
|
using System.Configuration;
|
|
|
|
using System.IO;
|
|
|
|
using System.IO;
|
|
|
|
using System.Net;
|
|
|
|
|
|
|
|
using System.Net.Sockets;
|
|
|
|
using System.Net.Sockets;
|
|
|
|
using System.Security.Cryptography.X509Certificates;
|
|
|
|
using System.Security.Cryptography.X509Certificates;
|
|
|
|
using System.Text;
|
|
|
|
using System.Text;
|
|
|
|
|
|
|
|
using WebSocketSharp.Net;
|
|
|
|
using WebSocketSharp.Net.Security;
|
|
|
|
using WebSocketSharp.Net.Security;
|
|
|
|
|
|
|
|
|
|
|
|
namespace WebSocketSharp {
|
|
|
|
namespace WebSocketSharp {
|
|
|
|
@ -48,43 +48,35 @@ namespace WebSocketSharp {
|
|
|
|
|
|
|
|
|
|
|
|
#region Private Fields
|
|
|
|
#region Private Fields
|
|
|
|
|
|
|
|
|
|
|
|
private Stream _innerStream;
|
|
|
|
|
|
|
|
private bool _isSecure;
|
|
|
|
|
|
|
|
private Object _forRead;
|
|
|
|
private Object _forRead;
|
|
|
|
private Object _forWrite;
|
|
|
|
private Object _forWrite;
|
|
|
|
|
|
|
|
private Stream _innerStream;
|
|
|
|
|
|
|
|
private bool _secure;
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region Private Constructors
|
|
|
|
#region Private Constructors
|
|
|
|
|
|
|
|
|
|
|
|
private WsStream()
|
|
|
|
private WsStream(Stream innerStream, bool secure)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
_innerStream = innerStream;
|
|
|
|
|
|
|
|
_secure = secure;
|
|
|
|
_forRead = new object();
|
|
|
|
_forRead = new object();
|
|
|
|
_forWrite = new object();
|
|
|
|
_forWrite = new object();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region Public Constructors
|
|
|
|
#region Internal Constructors
|
|
|
|
|
|
|
|
|
|
|
|
public WsStream(NetworkStream innerStream)
|
|
|
|
internal WsStream(NetworkStream innerStream)
|
|
|
|
: this()
|
|
|
|
: this(innerStream, false)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (innerStream == null)
|
|
|
|
|
|
|
|
throw new ArgumentNullException("innerStream");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_innerStream = innerStream;
|
|
|
|
|
|
|
|
_isSecure = false;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public WsStream(SslStream innerStream)
|
|
|
|
internal WsStream(SslStream innerStream)
|
|
|
|
: this()
|
|
|
|
: this(innerStream, true)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (innerStream == null)
|
|
|
|
|
|
|
|
throw new ArgumentNullException("innerStream");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_innerStream = innerStream;
|
|
|
|
|
|
|
|
_isSecure = true;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
#endregion
|
|
|
|
@ -93,7 +85,7 @@ namespace WebSocketSharp {
|
|
|
|
|
|
|
|
|
|
|
|
public bool DataAvailable {
|
|
|
|
public bool DataAvailable {
|
|
|
|
get {
|
|
|
|
get {
|
|
|
|
return _isSecure
|
|
|
|
return _secure
|
|
|
|
? ((SslStream)_innerStream).DataAvailable
|
|
|
|
? ((SslStream)_innerStream).DataAvailable
|
|
|
|
: ((NetworkStream)_innerStream).DataAvailable;
|
|
|
|
: ((NetworkStream)_innerStream).DataAvailable;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -101,7 +93,7 @@ namespace WebSocketSharp {
|
|
|
|
|
|
|
|
|
|
|
|
public bool IsSecure {
|
|
|
|
public bool IsSecure {
|
|
|
|
get {
|
|
|
|
get {
|
|
|
|
return _isSecure;
|
|
|
|
return _secure;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@ -127,18 +119,18 @@ namespace WebSocketSharp {
|
|
|
|
|
|
|
|
|
|
|
|
#region Internal Methods
|
|
|
|
#region Internal Methods
|
|
|
|
|
|
|
|
|
|
|
|
internal static WsStream CreateClientStream(TcpClient client, string host, bool secure)
|
|
|
|
internal static WsStream CreateClientStream(TcpClient tcpClient, string host, bool secure)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var netStream = client.GetStream();
|
|
|
|
var netStream = tcpClient.GetStream();
|
|
|
|
if (secure)
|
|
|
|
if (secure)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
System.Net.Security.RemoteCertificateValidationCallback validationCb = (sender, certificate, chain, sslPolicyErrors) =>
|
|
|
|
System.Net.Security.RemoteCertificateValidationCallback callback = (sender, certificate, chain, sslPolicyErrors) =>
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// FIXME: Always returns true
|
|
|
|
// FIXME: Always returns true
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
var sslStream = new SslStream(netStream, false, validationCb);
|
|
|
|
var sslStream = new SslStream(netStream, false, callback);
|
|
|
|
sslStream.AuthenticateAsClient(host);
|
|
|
|
sslStream.AuthenticateAsClient(host);
|
|
|
|
|
|
|
|
|
|
|
|
return new WsStream(sslStream);
|
|
|
|
return new WsStream(sslStream);
|
|
|
|
@ -147,9 +139,9 @@ namespace WebSocketSharp {
|
|
|
|
return new WsStream(netStream);
|
|
|
|
return new WsStream(netStream);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
internal static WsStream CreateServerStream(TcpClient client, bool secure)
|
|
|
|
internal static WsStream CreateServerStream(TcpClient tcpClient, bool secure)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var netStream = client.GetStream();
|
|
|
|
var netStream = tcpClient.GetStream();
|
|
|
|
if (secure)
|
|
|
|
if (secure)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var sslStream = new SslStream(netStream, false);
|
|
|
|
var sslStream = new SslStream(netStream, false);
|
|
|
|
@ -162,14 +154,10 @@ namespace WebSocketSharp {
|
|
|
|
return new WsStream(netStream);
|
|
|
|
return new WsStream(netStream);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
internal static WsStream CreateServerStream(WebSocketSharp.Net.HttpListenerContext context)
|
|
|
|
internal static WsStream CreateServerStream(HttpListenerContext context)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var conn = context.Connection;
|
|
|
|
var conn = context.Connection;
|
|
|
|
var stream = conn.Stream;
|
|
|
|
return new WsStream(conn.Stream, conn.IsSecure);
|
|
|
|
|
|
|
|
|
|
|
|
return conn.IsSecure
|
|
|
|
|
|
|
|
? new WsStream((SslStream)stream)
|
|
|
|
|
|
|
|
: new WsStream((NetworkStream)stream);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
#endregion
|
|
|
|
@ -230,16 +218,16 @@ namespace WebSocketSharp {
|
|
|
|
.Replace("\r\n", "\n")
|
|
|
|
.Replace("\r\n", "\n")
|
|
|
|
.Replace("\n ", " ")
|
|
|
|
.Replace("\n ", " ")
|
|
|
|
.Replace("\n\t", " ")
|
|
|
|
.Replace("\n\t", " ")
|
|
|
|
.Replace("\n\n", "")
|
|
|
|
.TrimEnd('\n')
|
|
|
|
.Split('\n');
|
|
|
|
.Split('\n');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public bool Write(WsFrame frame)
|
|
|
|
public bool WriteFrame(WsFrame frame)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return write(frame.ToByteArray());
|
|
|
|
return write(frame.ToByteArray());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public bool Write(Handshake handshake)
|
|
|
|
public bool WriteHandshake(Handshake handshake)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return write(handshake.ToByteArray());
|
|
|
|
return write(handshake.ToByteArray());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|