RPCServerSocketTransport.cs 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. using System.Net.Security;
  2. using System.Security.Authentication;
  3. using System.Security.Cryptography.X509Certificates;
  4. using System.Security.Cryptography.Xml;
  5. using Fleck;
  6. using InABox.Core;
  7. using Logger = InABox.Core.Logger;
  8. namespace InABox.Rpc
  9. {
  10. public class RpcServerSocketTransport : RpcServerTransport<RpcServerSocketConnection2>
  11. {
  12. private WebSocketServer? _server;
  13. public static X509Certificate2? Certificate { get; set; }
  14. //public static void InitCertificate(string certificateFile) => Certificate = new X509Certificate2(certificateFile);
  15. public override bool IsSecure() => Certificate != null;
  16. public RpcServerSocketTransport(int port, X509Certificate2? certificate = null)
  17. {
  18. Certificate = certificate;
  19. var protocol = certificate != null ? "wss" : "ws";
  20. _server = new WebSocketServer($"{protocol}://0.0.0.0:{port}");
  21. _server.ListenerSocket.NoDelay = true;
  22. //_server.RestartAfterListenError = true;
  23. if (Certificate != null)
  24. {
  25. /*_server.SslConfiguration.ServerCertificate = Certificate;
  26. _server.SslConfiguration.ClientCertificateRequired = false;
  27. _server.SslConfiguration.CheckCertificateRevocation = false;
  28. _server.SslConfiguration.ClientCertificateValidationCallback = WSSCallback;
  29. _server.SslConfiguration.EnabledSslProtocols = SslProtocols.Tls12;*/
  30. _server.Certificate = Certificate;
  31. }
  32. /*_server?.AddWebSocketService<RpcServerSocketConnection>("/", (connection) =>
  33. {
  34. connection.Transport = this;
  35. //new RpcServerSocketConnection() { Transport = this };
  36. });*/
  37. }
  38. private bool WSSCallback(object sender, X509Certificate? certificate, X509Chain? chain, SslPolicyErrors sslpolicyerrors)
  39. {
  40. return true;
  41. }
  42. public override void Start()
  43. {
  44. _server?.Start(socket =>
  45. {
  46. var connection = new RpcServerSocketConnection2(socket);
  47. socket.OnOpen = () => ConnectionOpened(connection);
  48. socket.OnClose = () => ConnectionClosed(connection);
  49. socket.OnError = (e) => ConnectionException(connection, e);
  50. socket.OnBinary = (data) => Task.Run(() =>
  51. {
  52. RpcMessage? request = Serialization.ReadBinary<RpcMessage>(data, BinarySerializationSettings.Latest);
  53. var response = DoMessage(connection, request);
  54. socket.Send(Serialization.WriteBinary(response, BinarySerializationSettings.Latest));
  55. });
  56. socket.OnMessage = (data) => Task.Run(() =>
  57. {
  58. RpcMessage? request = Serialization.Deserialize<RpcMessage>(data);
  59. var response = DoMessage(connection, request);
  60. socket.Send(Serialization.Serialize(response));
  61. });
  62. });
  63. }
  64. public override void Send(RpcServerSocketConnection2 connection, RpcMessage message)
  65. {
  66. connection.Connection.Send(Serialization.WriteBinary(message, BinarySerializationSettings.Latest));
  67. }
  68. public override void Stop()
  69. {
  70. _server?.ListenerSocket.Close();
  71. }
  72. public void ConnectionOpened(RpcServerSocketConnection2 connection)
  73. => DoOpen(connection);
  74. public void ConnectionException(RpcServerSocketConnection2 connection, Exception e)
  75. => DoException(connection, e);
  76. public void ConnectionClosed(RpcServerSocketConnection2 connection)
  77. => DoClose(connection, RpcTransportCloseEventType.Closed);
  78. }
  79. }