RPCSocketProxyServer.cs 3.5 KB

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