Files
2026-04-08 23:40:05 +02:00

652 lines
20 KiB
C#

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.<Latency>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.<Level>k__BackingField = (CompressionLevel)((ulong)6L);
perMessageCompression.<ClientNoContextTakeover>k__BackingField = false;
perMessageCompression.<ClientMaxWindowBits>k__BackingField = (int)((ulong)15L);
perMessageCompression.<ServerMaxWindowBits>k__BackingField = (int)((ulong)15L);
perMessageCompression.<MinimumDataLegthToCompress>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.<InternalRequest>k__BackingField;
string host2 = uri2.Host;
int port2 = uri2.Port;
string text2 = host2 + ":" + port2;
}
HTTPRequest httprequest3 = this.<InternalRequest>k__BackingField;
string host3 = uri2.Host;
httprequest3.SetHeader("Host", host3);
this.<InternalRequest>k__BackingField.SetHeader("Upgrade", "websocket");
this.<InternalRequest>k__BackingField.SetHeader("Connection", "Upgrade");
HTTPRequest httprequest4 = this.<InternalRequest>k__BackingField;
object[] array2 = new object[4];
array2[0] = this;
HTTPRequest httprequest5 = this.<InternalRequest>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.<InternalRequest>k__BackingField.SetHeader("Origin", origin);
}
this.<InternalRequest>k__BackingField.SetHeader("Sec-WebSocket-Version", "13");
if (secKey == 0)
{
this.<InternalRequest>k__BackingField.SetHeader("Sec-WebSocket-Protocol", protocol);
}
this.<InternalRequest>k__BackingField.SetHeader("Cache-Control", "no-cache");
this.<InternalRequest>k__BackingField.SetHeader("Pragma", "no-cache");
HTTPRequest httprequest6 = this.<InternalRequest>k__BackingField;
this.Extensions = 0;
httprequest6.DisableCache = true;
this.<InternalRequest>k__BackingField.<DisableRetry>k__BackingField = true;
this.<InternalRequest>k__BackingField.<TryToMinimizeTCPLatency>k__BackingField = true;
Proxy <Proxy>k__BackingField = HTTPManager.<Proxy>k__BackingField;
if (<Proxy>k__BackingField != 0 && <Proxy>k__BackingField != 0)
{
HTTPProxy httpproxy;
this.<InternalRequest>k__BackingField.<Proxy>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.<State>k__BackingField;
if (req != 0)
{
if (req != 0 && req != 0 && req != 0 && httprequestStates != HTTPRequestStates.Queued)
{
return;
}
if (req.<Exception>k__BackingField != 0)
{
Exception innerException = req.<Exception>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 <StatusCode>k__BackingField = resp.<StatusCode>k__BackingField;
if (<StatusCode>k__BackingField != 101)
{
string <Message>k__BackingField = resp.<Message>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}", <StatusCode>k__BackingField, <Message>k__BackingField, dataAsText);
if ((int)this.<State>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 <Exception>k__BackingField = req.<Exception>k__BackingField;
onError(this, <Exception>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.<Extensions>k__BackingField;
if (array != 0)
{
int length = array.Length;
if (num < length)
{
if (array[num] != 0 && array == 0)
{
this.<Extensions>k__BackingField[0] = num;
}
ILogger logger = HTTPManager.Logger;
IExtension[] array2 = this.<Extensions>k__BackingField;
int num2 = 0;
array2[0] = num2;
num++;
}
}
this.<State>k__BackingField = (WebSocketStates)((ulong)1L);
if (this.OnOpen != (ulong)0L)
{
this.OnOpen(this);
ILogger logger2 = HTTPManager.Logger;
}
WebSocketResponse webSocketResponse = this.webSocket;
Action<WebSocketResponse, string> 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<WebSocketResponse, byte[]> 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<WebSocketResponse, ushort, string> action3 = delegate(WebSocketResponse ws, ushort code, string msg)
{
OnWebSocketClosedDelegate onClosed = this.OnClosed;
this.<State>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<WebSocketResponse, WebSocketFrameReader> action4 = delegate(WebSocketResponse ws, WebSocketFrameReader frame)
{
if (this.OnIncompleteFrame != 0)
{
byte[] <Data>k__BackingField = frame.<Data>k__BackingField;
}
};
webSocketResponse4.OnIncompleteFrame = action4;
}
if (this.<StartPingThread>k__BackingField)
{
WebSocketResponse webSocketResponse5 = this.webSocket;
int num3 = Math.Max(this.<PingFrequency>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.<Extensions>k__BackingField != (ulong)0L)
{
int num = 0;
IExtension[] array = this.<Extensions>k__BackingField;
int length = array.Length;
if (num < length)
{
if (array[num] != 0)
{
}
num++;
}
ILogger logger = HTTPManager.Logger;
}
HTTPRequest httprequest = this.<InternalRequest>k__BackingField.Send();
this.requestSent = true;
this.<State>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.<State>k__BackingField;
this.<State>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;
}
}