using System; using System.Runtime.InteropServices; using System.Text; using System.Threading; using BestHTTP.Decompression.Zlib; using BestHTTP.Extensions; using BestHTTP.Logger; using BestHTTP.WebSocket.Extensions; using BestHTTP.WebSocket.Frames; using Cpp2IlInjected; namespace BestHTTP.WebSocket { // Token: 0x020012EA RID: 4842 [Token(Token = "0x20012EA")] [StructLayout(3)] public sealed class WebSocket { // Token: 0x170013A5 RID: 5029 // (get) Token: 0x06007918 RID: 31000 RVA: 0x001928A4 File Offset: 0x00190AA4 // (set) Token: 0x06007919 RID: 31001 RVA: 0x001928B8 File Offset: 0x00190AB8 [Token(Token = "0x170013A5")] public WebSocketStates State { [Token(Token = "0x6007918")] [Address(RVA = "0x559440", Offset = "0x557E40", VA = "0x180559440")] get; [Token(Token = "0x6007919")] [Address(RVA = "0x559450", Offset = "0x557E50", VA = "0x180559450")] private set; } // Token: 0x170013A6 RID: 5030 // (get) Token: 0x0600791A RID: 31002 RVA: 0x001928CC File Offset: 0x00190ACC [Token(Token = "0x170013A6")] public bool IsOpen { [Token(Token = "0x600791A")] [Address(RVA = "0x6FFDC0", Offset = "0x6FE7C0", VA = "0x1806FFDC0")] get { WebSocketResponse webSocketResponse = this.webSocket; if (webSocketResponse == 0) { } return !webSocketResponse.closed; } } // Token: 0x170013A7 RID: 5031 // (get) Token: 0x0600791B RID: 31003 RVA: 0x001928F0 File Offset: 0x00190AF0 [Token(Token = "0x170013A7")] public int BufferedAmount { [Token(Token = "0x600791B")] [Address(RVA = "0x6FFDA0", Offset = "0x6FE7A0", VA = "0x1806FFDA0")] get { return this.webSocket._bufferedAmount; } } // Token: 0x170013A8 RID: 5032 // (get) Token: 0x0600791C RID: 31004 RVA: 0x00192910 File Offset: 0x00190B10 // (set) Token: 0x0600791D RID: 31005 RVA: 0x00192924 File Offset: 0x00190B24 [Token(Token = "0x170013A8")] public bool StartPingThread { [Token(Token = "0x600791C")] [Address(RVA = "0x6E4A50", Offset = "0x6E3450", VA = "0x1806E4A50")] get; [Token(Token = "0x600791D")] [Address(RVA = "0x6E4A60", Offset = "0x6E3460", VA = "0x1806E4A60")] set; } // Token: 0x170013A9 RID: 5033 // (get) Token: 0x0600791E RID: 31006 RVA: 0x00192938 File Offset: 0x00190B38 // (set) Token: 0x0600791F RID: 31007 RVA: 0x0019294C File Offset: 0x00190B4C [Token(Token = "0x170013A9")] public int PingFrequency { [Token(Token = "0x600791E")] [Address(RVA = "0x55D550", Offset = "0x55BF50", VA = "0x18055D550")] get; [Token(Token = "0x600791F")] [Address(RVA = "0x55D5D0", Offset = "0x55BFD0", VA = "0x18055D5D0")] set; } // Token: 0x170013AA RID: 5034 // (get) Token: 0x06007920 RID: 31008 RVA: 0x00192960 File Offset: 0x00190B60 // (set) Token: 0x06007921 RID: 31009 RVA: 0x00192974 File Offset: 0x00190B74 [Token(Token = "0x170013AA")] public TimeSpan CloseAfterNoMesssage { [Token(Token = "0x6007920")] [Address(RVA = "0x3C1240", Offset = "0x3BFC40", VA = "0x1803C1240")] get; [Token(Token = "0x6007921")] [Address(RVA = "0x3C1280", Offset = "0x3BFC80", VA = "0x1803C1280")] set; } // Token: 0x170013AB RID: 5035 // (get) Token: 0x06007922 RID: 31010 RVA: 0x00192988 File Offset: 0x00190B88 // (set) Token: 0x06007923 RID: 31011 RVA: 0x0019299C File Offset: 0x00190B9C [Token(Token = "0x170013AB")] public HTTPRequest InternalRequest { [Token(Token = "0x6007922")] [Address(RVA = "0x3C1220", Offset = "0x3BFC20", VA = "0x1803C1220")] get; [Token(Token = "0x6007923")] [Address(RVA = "0x3C1260", Offset = "0x3BFC60", VA = "0x1803C1260")] private set; } // Token: 0x170013AC RID: 5036 // (get) Token: 0x06007924 RID: 31012 RVA: 0x001929B0 File Offset: 0x00190BB0 // (set) Token: 0x06007925 RID: 31013 RVA: 0x001929C4 File Offset: 0x00190BC4 [Token(Token = "0x170013AC")] public IExtension[] Extensions { [Token(Token = "0x6007924")] [Address(RVA = "0x3C1230", Offset = "0x3BFC30", VA = "0x1803C1230")] get; [Token(Token = "0x6007925")] [Address(RVA = "0x3C1270", Offset = "0x3BFC70", VA = "0x1803C1270")] private set; } // Token: 0x170013AD RID: 5037 // (get) Token: 0x06007926 RID: 31014 RVA: 0x001929D8 File Offset: 0x00190BD8 [Token(Token = "0x170013AD")] public int Latency { [Token(Token = "0x6007926")] [Address(RVA = "0x6FFE00", Offset = "0x6FE800", VA = "0x1806FFE00")] get { return this.webSocket.k__BackingField; } } // Token: 0x06007927 RID: 31015 RVA: 0x001929F8 File Offset: 0x00190BF8 [Token(Token = "0x6007927")] [Address(RVA = "0x6FF320", Offset = "0x6FDD20", VA = "0x1806FF320")] public WebSocket(Uri uri) { string empty = string.Empty; IExtension[] array = new IExtension[1]; int num = 0; PerMessageCompression perMessageCompression; perMessageCompression.FieldGetter(num, empty, empty); perMessageCompression.k__BackingField = (CompressionLevel)((ulong)6L); perMessageCompression.k__BackingField = false; perMessageCompression.k__BackingField = (int)((ulong)15L); perMessageCompression.k__BackingField = (int)((ulong)15L); perMessageCompression.k__BackingField = (int)((ulong)256L); array[0] = perMessageCompression; this.Extensions = array; } // Token: 0x06007928 RID: 31016 RVA: 0x00192A68 File Offset: 0x00190C68 [Token(Token = "0x6007928")] [Address(RVA = "0x6FF4D0", Offset = "0x6FDED0", VA = "0x1806FF4D0")] public WebSocket(Uri uri, string origin, string protocol, params IExtension[] extensions) { int num = 0; base.FieldGetter(num, origin, protocol); bool flag = HTTPProtocolFactory.IsSecureProtocol(uri); string text = "ws"; if (flag) { text = "wss"; } if (uri.Port != -1) { int port = uri.Port; } bool flag2 = text.Equals("wss", StringComparison.OrdinalIgnoreCase); object[] array = new object[6]; if (text != 0) { } array[0] = text; if ("://" != 0) { } array[1] = "://"; string host = uri.Host; if (host != 0) { } array[2] = host; if (":" != 0) { } array[3] = ":"; int num2; if (num2 != 0) { } array[4] = num2; string requestPathAndQueryURL = uri.GetRequestPathAndQueryURL(); if (requestPathAndQueryURL != 0) { } array[5] = requestPathAndQueryURL; Uri uri2 = new Uri(string.Concat(array)); this.PingFrequency = (int)((ulong)1000L); TimeSpan timeSpan; this.CloseAfterNoMesssage = timeSpan; OnRequestFinishedDelegate onRequestFinishedDelegate = new OnRequestFinishedDelegate(this.OnInternalRequestCallback); HTTPRequest httprequest = new HTTPRequest(uri2, onRequestFinishedDelegate); this.InternalRequest = httprequest; OnRequestFinishedDelegate onRequestFinishedDelegate2 = new OnRequestFinishedDelegate(this.OnInternalRequestUpgraded); httprequest.OnUpgraded = onRequestFinishedDelegate2; if (!HTTPProtocolFactory.IsSecureProtocol(uri2) && uri2.Port != 80 && HTTPProtocolFactory.IsSecureProtocol(uri2) && uri2.Port != 443) { HTTPRequest httprequest2 = this.k__BackingField; string host2 = uri2.Host; int port2 = uri2.Port; string text2 = host2 + ":" + port2; } HTTPRequest httprequest3 = this.k__BackingField; string host3 = uri2.Host; httprequest3.SetHeader("Host", host3); this.k__BackingField.SetHeader("Upgrade", "websocket"); this.k__BackingField.SetHeader("Connection", "Upgrade"); HTTPRequest httprequest4 = this.k__BackingField; object[] array2 = new object[4]; array2[0] = this; HTTPRequest httprequest5 = this.k__BackingField; if (httprequest5 != 0) { } array2[1] = httprequest5; array2[2] = uri2; object obj = new object(); if (obj != 0) { } array2[3] = obj; string secKey = this.GetSecKey(array2); httprequest4.SetHeader("Sec-WebSocket-Key", secKey); if (secKey == 0) { this.k__BackingField.SetHeader("Origin", origin); } this.k__BackingField.SetHeader("Sec-WebSocket-Version", "13"); if (secKey == 0) { this.k__BackingField.SetHeader("Sec-WebSocket-Protocol", protocol); } this.k__BackingField.SetHeader("Cache-Control", "no-cache"); this.k__BackingField.SetHeader("Pragma", "no-cache"); HTTPRequest httprequest6 = this.k__BackingField; this.Extensions = 0; httprequest6.DisableCache = true; this.k__BackingField.k__BackingField = true; this.k__BackingField.k__BackingField = true; Proxy k__BackingField = HTTPManager.k__BackingField; if (k__BackingField != 0 && k__BackingField != 0) { HTTPProxy httpproxy; this.k__BackingField.k__BackingField = httpproxy; } HTTPManager.Setup(); } // Token: 0x06007929 RID: 31017 RVA: 0x00192D5C File Offset: 0x00190F5C [Token(Token = "0x6007929")] [Address(RVA = "0x6FE6A0", Offset = "0x6FD0A0", VA = "0x1806FE6A0")] private void OnInternalRequestCallback(HTTPRequest req, HTTPResponse resp) { int num = 0; HTTPRequestStates httprequestStates = req.k__BackingField; if (req != 0) { if (req != 0 && req != 0 && req != 0 && httprequestStates != HTTPRequestStates.Queued) { return; } if (req.k__BackingField != 0) { Exception innerException = req.k__BackingField.InnerException; string text2; string text = "Request Finished with Error! " + text2; } string empty = string.Empty; string text3 = "Request Finished with Error! " + empty; } if (!resp.IsSuccess) { int k__BackingField = resp.k__BackingField; if (k__BackingField != 101) { string k__BackingField = resp.k__BackingField; string dataAsText = resp.DataAsText; string text4 = string.Format("Request Finished Successfully, but the server sent an error. Status Code: {0}-{1} Message: {2}", k__BackingField, k__BackingField, dataAsText); if ((int)this.k__BackingField == num && text4 != 0) { OnWebSocketClosedDelegate onClosed = this.OnClosed; if (onClosed == 0) { goto IL_112; } uint num2; onClosed(this, (ushort)num2, "Closed while opening"); } OnWebSocketErrorDelegate onError = this.OnError; if (onError != 0) { Exception k__BackingField = req.k__BackingField; onError(this, k__BackingField); } OnWebSocketErrorDescriptionDelegate onErrorDesc = this.OnErrorDesc; if (onErrorDesc != 0) { onErrorDesc(this, text4); } if (this.OnError == num && this.OnErrorDesc == num) { ILogger logger = HTTPManager.Logger; } IL_112: if ((req.isKeepAlive ? 1 : 0) != num || resp == 0 || resp != 0) { return; } return; } } ILogger logger2 = HTTPManager.Logger; throw new NullReferenceException(); } // Token: 0x0600792A RID: 31018 RVA: 0x00192E9C File Offset: 0x0019109C [Token(Token = "0x600792A")] [Address(RVA = "0x6FE9D0", Offset = "0x6FD3D0", VA = "0x1806FE9D0")] private void OnInternalRequestUpgraded(HTTPRequest req, HTTPResponse resp) { int num = 0; if (resp != 0) { } this.webSocket = num; WebSocketResponse webSocketResponse6; WaitCallback waitCallback; if (num != 0) { IExtension[] array = this.k__BackingField; if (array != 0) { int length = array.Length; if (num < length) { if (array[num] != 0 && array == 0) { this.k__BackingField[0] = num; } ILogger logger = HTTPManager.Logger; IExtension[] array2 = this.k__BackingField; int num2 = 0; array2[0] = num2; num++; } } this.k__BackingField = (WebSocketStates)((ulong)1L); if (this.OnOpen != (ulong)0L) { this.OnOpen(this); ILogger logger2 = HTTPManager.Logger; } WebSocketResponse webSocketResponse = this.webSocket; Action action = delegate(WebSocketResponse ws, string msg) { OnWebSocketMessageDelegate onMessage = this.OnMessage; if (onMessage != 0) { onMessage(this, msg); return; } }; webSocketResponse.OnText = action; WebSocketResponse webSocketResponse2 = this.webSocket; Action action2 = delegate(WebSocketResponse ws, byte[] bin) { OnWebSocketBinaryDelegate onBinary = this.OnBinary; if (onBinary != 0) { onBinary(this, bin); return; } }; webSocketResponse2.OnBinary = action2; WebSocketResponse webSocketResponse3 = this.webSocket; Action action3 = delegate(WebSocketResponse ws, ushort code, string msg) { OnWebSocketClosedDelegate onClosed = this.OnClosed; this.k__BackingField = (WebSocketStates)((ulong)3L); if (onClosed != 0) { onClosed(this, code, msg); return; } }; webSocketResponse3.OnClosed = action3; if (this.OnIncompleteFrame != (ulong)0L) { WebSocketResponse webSocketResponse4 = this.webSocket; Action action4 = delegate(WebSocketResponse ws, WebSocketFrameReader frame) { if (this.OnIncompleteFrame != 0) { byte[] k__BackingField = frame.k__BackingField; } }; webSocketResponse4.OnIncompleteFrame = action4; } if (this.k__BackingField) { WebSocketResponse webSocketResponse5 = this.webSocket; int num3 = Math.Max(this.k__BackingField, 100); webSocketResponse5.StartPinging(num3); } webSocketResponse6 = this.webSocket; waitCallback = new WaitCallback(webSocketResponse6.ReceiveThreadFunc); bool flag = ThreadPool.QueueUserWorkItem(waitCallback); return; } if (waitCallback.original_method_info != 0) { } if (waitCallback.data != 0 && webSocketResponse6.Stream != 0) { bool canRead = webSocketResponse6.Stream.CanRead; DelegateData data = waitCallback.data; } waitCallback.method_ptr = (IntPtr)((ulong)3L); } // Token: 0x0600792B RID: 31019 RVA: 0x00193054 File Offset: 0x00191254 [Token(Token = "0x600792B")] [Address(RVA = "0x6FEF40", Offset = "0x6FD940", VA = "0x1806FEF40")] public void Open() { if (!this.requestSent) { if (this.k__BackingField != (ulong)0L) { int num = 0; IExtension[] array = this.k__BackingField; int length = array.Length; if (num < length) { if (array[num] != 0) { } num++; } ILogger logger = HTTPManager.Logger; } HTTPRequest httprequest = this.k__BackingField.Send(); this.requestSent = true; this.k__BackingField = (WebSocketStates)((ulong)0L); return; } InvalidOperationException ex = new InvalidOperationException("Open already called! You can't reuse this WebSocket instance!"); throw new IndexOutOfRangeException(); } // Token: 0x0600792C RID: 31020 RVA: 0x001930E4 File Offset: 0x001912E4 [Token(Token = "0x600792C")] [Address(RVA = "0x6FF0D0", Offset = "0x6FDAD0", VA = "0x1806FF0D0")] public void Send(string message) { WebSocketResponse webSocketResponse = this.webSocket; if (webSocketResponse != 0 && !webSocketResponse.closed) { this.webSocket.Send(message); } } // Token: 0x0600792D RID: 31021 RVA: 0x00193118 File Offset: 0x00191318 [Token(Token = "0x600792D")] [Address(RVA = "0x6FF210", Offset = "0x6FDC10", VA = "0x1806FF210")] public void Send(byte[] buffer) { WebSocketResponse webSocketResponse = this.webSocket; if (webSocketResponse != 0 && !webSocketResponse.closed) { this.webSocket.Send(buffer); } } // Token: 0x0600792E RID: 31022 RVA: 0x0019314C File Offset: 0x0019134C [Token(Token = "0x600792E")] [Address(RVA = "0x6FF130", Offset = "0x6FDB30", VA = "0x1806FF130")] public void Send(byte[] buffer, ulong offset, ulong count) { WebSocketResponse webSocketResponse = this.webSocket; if (webSocketResponse != 0 && !webSocketResponse.closed) { this.webSocket.Send(buffer, offset, count); } } // Token: 0x0600792F RID: 31023 RVA: 0x00193184 File Offset: 0x00191384 [Token(Token = "0x600792F")] [Address(RVA = "0x6FF1B0", Offset = "0x6FDBB0", VA = "0x1806FF1B0")] public void Send(WebSocketFrame frame) { WebSocketResponse webSocketResponse = this.webSocket; if (webSocketResponse != 0 && !webSocketResponse.closed) { this.webSocket.Send(frame); } } // Token: 0x06007930 RID: 31024 RVA: 0x001931B8 File Offset: 0x001913B8 [Token(Token = "0x6007930")] [Address(RVA = "0x6FE1C0", Offset = "0x6FCBC0", VA = "0x1806FE1C0")] public void Close() { WebSocketStates webSocketStates = this.k__BackingField; this.k__BackingField = (WebSocketStates)((ulong)2L); WebSocketResponse webSocketResponse = this.webSocket; } // Token: 0x06007931 RID: 31025 RVA: 0x00193200 File Offset: 0x00191400 [Token(Token = "0x6007931")] [Address(RVA = "0x6FE280", Offset = "0x6FCC80", VA = "0x1806FE280")] public void Close(ushort code, string message) { WebSocketResponse webSocketResponse = this.webSocket; if (webSocketResponse != 0 && !webSocketResponse.closed) { this.webSocket.Close(code, message); } } // Token: 0x06007932 RID: 31026 RVA: 0x00193234 File Offset: 0x00191434 [Token(Token = "0x6007932")] [Address(RVA = "0x6FE2F0", Offset = "0x6FCCF0", VA = "0x1806FE2F0")] public static byte[] EncodeCloseData(ushort code, string message) { int num; byte[] array; do { num = 0; object obj = Encoding.UTF8.Clone(); byte[] bytes = BitConverter.GetBytes(code); int length = bytes.Length; int num2 = 0; Array.Reverse(bytes, num2, length); BufferPoolMemoryStream bufferPoolMemoryStream; int num3 = bufferPoolMemoryStream.ReadByte(); Encoding utf = Encoding.UTF8; int num4 = bufferPoolMemoryStream.ReadByte(); array = bufferPoolMemoryStream.ToArray(); if (bufferPoolMemoryStream != 0) { } if (num != -1) { } } while (num != 0); return array; } // Token: 0x06007933 RID: 31027 RVA: 0x001932C4 File Offset: 0x001914C4 [Token(Token = "0x6007933")] [Address(RVA = "0x6FE520", Offset = "0x6FCF20", VA = "0x1806FE520")] private string GetSecKey(object[] from) { byte[] array = new byte[16]; int num = 0; int num2 = 0; int num3 = 0; int length = from.Length; if (num < length) { from[num3].Finalize(); int num4 = 0; byte[] array2; int length2 = array2.Length; if (num4 < length2) { int length3 = array.Length; if (num2 < length3) { num2++; num4++; } } num3++; } return Convert.ToBase64String(array); } // Token: 0x04005762 RID: 22370 [global::Cpp2IlInjected.FieldOffset(Offset = "0x30")] [Token(Token = "0x4005762")] public OnWebSocketOpenDelegate OnOpen; // Token: 0x04005763 RID: 22371 [global::Cpp2IlInjected.FieldOffset(Offset = "0x38")] [Token(Token = "0x4005763")] public OnWebSocketMessageDelegate OnMessage; // Token: 0x04005764 RID: 22372 [global::Cpp2IlInjected.FieldOffset(Offset = "0x40")] [Token(Token = "0x4005764")] public OnWebSocketBinaryDelegate OnBinary; // Token: 0x04005765 RID: 22373 [global::Cpp2IlInjected.FieldOffset(Offset = "0x48")] [Token(Token = "0x4005765")] public OnWebSocketClosedDelegate OnClosed; // Token: 0x04005766 RID: 22374 [global::Cpp2IlInjected.FieldOffset(Offset = "0x50")] [Token(Token = "0x4005766")] public OnWebSocketErrorDelegate OnError; // Token: 0x04005767 RID: 22375 [global::Cpp2IlInjected.FieldOffset(Offset = "0x58")] [Token(Token = "0x4005767")] public OnWebSocketErrorDescriptionDelegate OnErrorDesc; // Token: 0x04005768 RID: 22376 [global::Cpp2IlInjected.FieldOffset(Offset = "0x60")] [Token(Token = "0x4005768")] public OnWebSocketIncompleteFrameDelegate OnIncompleteFrame; // Token: 0x04005769 RID: 22377 [global::Cpp2IlInjected.FieldOffset(Offset = "0x68")] [Token(Token = "0x4005769")] private bool requestSent; // Token: 0x0400576A RID: 22378 [global::Cpp2IlInjected.FieldOffset(Offset = "0x70")] [Token(Token = "0x400576A")] private WebSocketResponse webSocket; } }