Files
2026-06-04 11:42:34 +02:00

1485 lines
38 KiB
C#

using System;
using System.Collections;
using System.Diagnostics;
using System.IO;
using System.Net.Sockets;
using System.Reflection;
using System.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading;
using Mono.Security.Protocol.Tls;
namespace System.Net
{
// Token: 0x02000261 RID: 609
internal class WebConnection
{
// Token: 0x06001629 RID: 5673 RVA: 0x00047E14 File Offset: 0x00046014
public WebConnection(WebConnectionGroup group, ServicePoint sPoint)
{
this.sPoint = sPoint;
this.buffer = new byte[4096];
this.readState = ReadState.None;
this.Data = new WebConnectionData();
this.initConn = new WaitCallback(this.InitConnection);
this.queue = group.Queue;
this.abortHelper = new WebConnection.AbortHelper();
this.abortHelper.Connection = this;
this.abortHandler = new EventHandler(this.abortHelper.Abort);
}
// Token: 0x0600162B RID: 5675 RVA: 0x00047EC8 File Offset: 0x000460C8
private bool CanReuse()
{
return !this.socket.Poll(0, global::System.Net.Sockets.SelectMode.SelectRead);
}
// Token: 0x0600162C RID: 5676 RVA: 0x00047EDC File Offset: 0x000460DC
private void LoggedThrow(Exception e)
{
Console.WriteLine("Throwing this exception: " + e);
throw e;
}
// Token: 0x0600162D RID: 5677 RVA: 0x00047EF0 File Offset: 0x000460F0
internal static Stream DownloadPolicy(string url, string proxy)
{
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
if (proxy != null)
{
httpWebRequest.Proxy = new WebProxy(proxy);
}
return httpWebRequest.GetResponse().GetResponseStream();
}
// Token: 0x0600162E RID: 5678 RVA: 0x00047F28 File Offset: 0x00046128
private void CheckUnityWebSecurity(HttpWebRequest request)
{
if (!Environment.SocketSecurityEnabled)
{
return;
}
Console.WriteLine("CheckingSecurityForUrl: " + request.RequestUri.AbsoluteUri);
global::System.Uri requestUri = request.RequestUri;
string text = string.Empty;
if (!requestUri.IsDefaultPort)
{
text = ":" + requestUri.Port;
}
if (requestUri.ToString() == string.Concat(new string[] { requestUri.Scheme, "://", requestUri.Host, text, "/crossdomain.xml" }))
{
return;
}
try
{
if (WebConnection.method_GetSecurityPolicyFromNonMainThread == null)
{
Type type = Type.GetType("UnityEngine.UnityCrossDomainHelper, CrossDomainPolicyParser, Version=1.0.0.0, Culture=neutral");
if (type == null)
{
this.LoggedThrow(new SecurityException("Cant find type UnityCrossDomainHelper"));
}
WebConnection.method_GetSecurityPolicyFromNonMainThread = type.GetMethod("GetSecurityPolicyForDotNetWebRequest");
if (WebConnection.method_GetSecurityPolicyFromNonMainThread == null)
{
this.LoggedThrow(new SecurityException("Cant find GetSecurityPolicyFromNonMainThread"));
}
}
MethodInfo method = typeof(WebConnection).GetMethod("DownloadPolicy", BindingFlags.Static | BindingFlags.NonPublic);
if (method == null)
{
this.LoggedThrow(new SecurityException("Cannot find method DownloadPolicy"));
}
if (!(bool)WebConnection.method_GetSecurityPolicyFromNonMainThread.Invoke(null, new object[]
{
request.RequestUri.ToString(),
method
}))
{
this.LoggedThrow(new SecurityException("Webrequest was denied"));
}
}
catch (Exception ex)
{
this.LoggedThrow(new SecurityException("Unexpected error while trying to call method_GetSecurityPolicyBlocking : " + ex));
}
}
// Token: 0x0600162F RID: 5679 RVA: 0x000480CC File Offset: 0x000462CC
private void Connect(HttpWebRequest request)
{
object obj = this.socketLock;
lock (obj)
{
if (this.socket != null && this.socket.Connected && this.status == WebExceptionStatus.Success && this.CanReuse() && this.CompleteChunkedRead())
{
this.reused = true;
}
else
{
this.reused = false;
if (this.socket != null)
{
this.socket.Close();
this.socket = null;
}
this.chunkStream = null;
IPHostEntry hostEntry = this.sPoint.HostEntry;
if (hostEntry == null)
{
this.status = ((!this.sPoint.UsesProxy) ? WebExceptionStatus.NameResolutionFailure : WebExceptionStatus.ProxyNameResolutionFailure);
}
else
{
WebConnectionData data = this.Data;
foreach (IPAddress ipaddress in hostEntry.AddressList)
{
this.socket = new global::System.Net.Sockets.Socket(ipaddress.AddressFamily, global::System.Net.Sockets.SocketType.Stream, global::System.Net.Sockets.ProtocolType.Tcp);
IPEndPoint ipendPoint = new IPEndPoint(ipaddress, this.sPoint.Address.Port);
this.socket.SetSocketOption(global::System.Net.Sockets.SocketOptionLevel.Tcp, global::System.Net.Sockets.SocketOptionName.Debug, (!this.sPoint.UseNagleAlgorithm) ? 1 : 0);
this.socket.NoDelay = !this.sPoint.UseNagleAlgorithm;
if (!this.sPoint.CallEndPointDelegate(this.socket, ipendPoint))
{
this.socket.Close();
this.socket = null;
this.status = WebExceptionStatus.ConnectFailure;
}
else
{
try
{
if (request.Aborted)
{
break;
}
this.CheckUnityWebSecurity(request);
this.socket.Connect(ipendPoint, false);
this.status = WebExceptionStatus.Success;
break;
}
catch (ThreadAbortException)
{
global::System.Net.Sockets.Socket socket = this.socket;
this.socket = null;
if (socket != null)
{
socket.Close();
}
break;
}
catch (ObjectDisposedException ex)
{
break;
}
catch (Exception ex2)
{
global::System.Net.Sockets.Socket socket2 = this.socket;
this.socket = null;
if (socket2 != null)
{
socket2.Close();
}
if (!request.Aborted)
{
this.status = WebExceptionStatus.ConnectFailure;
}
this.connect_exception = ex2;
}
}
}
}
}
}
}
// Token: 0x06001630 RID: 5680 RVA: 0x00048374 File Offset: 0x00046574
private static void EnsureSSLStreamAvailable()
{
object obj = WebConnection.classLock;
lock (obj)
{
if (WebConnection.sslStream == null)
{
WebConnection.sslStream = Type.GetType("Mono.Security.Protocol.Tls.HttpsClientStream, Mono.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756", false);
if (WebConnection.sslStream == null)
{
string text = "Missing Mono.Security.dll assembly. Support for SSL/TLS is unavailable.";
throw new NotSupportedException(text);
}
WebConnection.piClient = WebConnection.sslStream.GetProperty("SelectedClientCertificate");
WebConnection.piServer = WebConnection.sslStream.GetProperty("ServerCertificate");
WebConnection.piTrustFailure = WebConnection.sslStream.GetProperty("TrustFailure");
}
}
}
// Token: 0x06001631 RID: 5681 RVA: 0x00048428 File Offset: 0x00046628
private bool CreateTunnel(HttpWebRequest request, Stream stream, out byte[] buffer)
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("CONNECT ");
stringBuilder.Append(request.Address.Host);
stringBuilder.Append(':');
stringBuilder.Append(request.Address.Port);
stringBuilder.Append(" HTTP/");
if (request.ServicePoint.ProtocolVersion == HttpVersion.Version11)
{
stringBuilder.Append("1.1");
}
else
{
stringBuilder.Append("1.0");
}
stringBuilder.Append("\r\nHost: ");
stringBuilder.Append(request.Address.Authority);
string challenge = this.Data.Challenge;
this.Data.Challenge = null;
bool flag = request.Headers["Proxy-Authorization"] != null;
if (flag)
{
stringBuilder.Append("\r\nProxy-Authorization: ");
stringBuilder.Append(request.Headers["Proxy-Authorization"]);
}
else if (challenge != null && this.Data.StatusCode == 407)
{
flag = true;
ICredentials credentials = request.Proxy.Credentials;
Authorization authorization = AuthenticationManager.Authenticate(challenge, request, credentials);
if (authorization != null)
{
stringBuilder.Append("\r\nProxy-Authorization: ");
stringBuilder.Append(authorization.Message);
}
}
stringBuilder.Append("\r\n\r\n");
this.Data.StatusCode = 0;
byte[] bytes = Encoding.Default.GetBytes(stringBuilder.ToString());
stream.Write(bytes, 0, bytes.Length);
int num;
WebHeaderCollection webHeaderCollection = this.ReadHeaders(request, stream, out buffer, out num);
if (!flag && webHeaderCollection != null && num == 407)
{
this.Data.StatusCode = num;
this.Data.Challenge = webHeaderCollection["Proxy-Authenticate"];
return false;
}
if (num != 200)
{
string text = string.Format("The remote server returned a {0} status code.", num);
this.HandleError(WebExceptionStatus.SecureChannelFailure, null, text);
return false;
}
return webHeaderCollection != null;
}
// Token: 0x06001632 RID: 5682 RVA: 0x00048640 File Offset: 0x00046840
private WebHeaderCollection ReadHeaders(HttpWebRequest request, Stream stream, out byte[] retBuffer, out int status)
{
retBuffer = null;
status = 200;
byte[] array = new byte[1024];
MemoryStream memoryStream = new MemoryStream();
bool flag = false;
int num2;
WebHeaderCollection webHeaderCollection;
for (;;)
{
int num = stream.Read(array, 0, 1024);
if (num == 0)
{
break;
}
memoryStream.Write(array, 0, num);
num2 = 0;
string text = null;
webHeaderCollection = new WebHeaderCollection();
while (WebConnection.ReadLine(memoryStream.GetBuffer(), ref num2, (int)memoryStream.Length, ref text))
{
if (text == null)
{
goto Block_2;
}
if (flag)
{
webHeaderCollection.Add(text);
}
else
{
int num3 = text.IndexOf(' ');
if (num3 == -1)
{
goto Block_5;
}
status = (int)uint.Parse(text.Substring(num3 + 1, 3));
flag = true;
}
}
}
this.HandleError(WebExceptionStatus.ServerProtocolViolation, null, "ReadHeaders");
return null;
Block_2:
if (memoryStream.Length - (long)num2 > 0L)
{
retBuffer = new byte[memoryStream.Length - (long)num2];
Buffer.BlockCopy(memoryStream.GetBuffer(), num2, retBuffer, 0, retBuffer.Length);
}
return webHeaderCollection;
Block_5:
this.HandleError(WebExceptionStatus.ServerProtocolViolation, null, "ReadHeaders2");
return null;
}
// Token: 0x06001633 RID: 5683 RVA: 0x0004875C File Offset: 0x0004695C
private bool CreateStream(HttpWebRequest request)
{
try
{
global::System.Net.Sockets.NetworkStream networkStream = new global::System.Net.Sockets.NetworkStream(this.socket, false);
if (request.Address.Scheme == global::System.Uri.UriSchemeHttps)
{
this.ssl = true;
WebConnection.EnsureSSLStreamAvailable();
if (!this.reused || this.nstream == null || this.nstream.GetType() != WebConnection.sslStream)
{
byte[] array = null;
if (this.sPoint.UseConnect && !this.CreateTunnel(request, networkStream, out array))
{
return false;
}
object[] array2 = new object[] { networkStream, request.ClientCertificates, request, array };
this.nstream = (Stream)Activator.CreateInstance(WebConnection.sslStream, array2);
SslClientStream sslClientStream = (SslClientStream)this.nstream;
ServicePointManager.ChainValidationHelper chainValidationHelper = new ServicePointManager.ChainValidationHelper(request);
sslClientStream.ServerCertValidation2 += chainValidationHelper.ValidateChain;
this.certsAvailable = false;
}
}
else
{
this.ssl = false;
this.nstream = networkStream;
}
}
catch (Exception)
{
if (!request.Aborted)
{
this.status = WebExceptionStatus.ConnectFailure;
}
return false;
}
return true;
}
// Token: 0x06001634 RID: 5684 RVA: 0x000488AC File Offset: 0x00046AAC
private void HandleError(WebExceptionStatus st, Exception e, string where)
{
this.status = st;
lock (this)
{
if (st == WebExceptionStatus.RequestCanceled)
{
this.Data = new WebConnectionData();
}
}
if (e == null)
{
try
{
throw new Exception(new StackTrace().ToString());
}
catch (Exception ex)
{
e = ex;
}
}
HttpWebRequest httpWebRequest = null;
if (this.Data != null && this.Data.request != null)
{
httpWebRequest = this.Data.request;
}
this.Close(true);
if (httpWebRequest != null)
{
httpWebRequest.FinishedReading = true;
httpWebRequest.SetResponseError(st, e, where);
}
}
// Token: 0x06001635 RID: 5685 RVA: 0x00048984 File Offset: 0x00046B84
private static void ReadDone(IAsyncResult result)
{
WebConnection webConnection = (WebConnection)result.AsyncState;
WebConnectionData data = webConnection.Data;
Stream stream = webConnection.nstream;
if (stream == null)
{
webConnection.Close(true);
return;
}
int num = -1;
try
{
num = stream.EndRead(result);
}
catch (Exception ex)
{
webConnection.HandleError(WebExceptionStatus.ReceiveFailure, ex, "ReadDone1");
return;
}
if (num == 0)
{
webConnection.HandleError(WebExceptionStatus.ReceiveFailure, null, "ReadDone2");
return;
}
if (num < 0)
{
webConnection.HandleError(WebExceptionStatus.ServerProtocolViolation, null, "ReadDone3");
return;
}
int num2 = -1;
num += webConnection.position;
if (webConnection.readState == ReadState.None)
{
Exception ex2 = null;
try
{
num2 = webConnection.GetResponse(webConnection.buffer, num);
}
catch (Exception ex3)
{
ex2 = ex3;
}
if (ex2 != null)
{
webConnection.HandleError(WebExceptionStatus.ServerProtocolViolation, ex2, "ReadDone4");
return;
}
}
if (webConnection.readState != ReadState.Content)
{
int num3 = num * 2;
int num4 = ((num3 >= webConnection.buffer.Length) ? num3 : webConnection.buffer.Length);
byte[] array = new byte[num4];
Buffer.BlockCopy(webConnection.buffer, 0, array, 0, num);
webConnection.buffer = array;
webConnection.position = num;
webConnection.readState = ReadState.None;
WebConnection.InitRead(webConnection);
return;
}
webConnection.position = 0;
WebConnectionStream webConnectionStream = new WebConnectionStream(webConnection);
string text = data.Headers["Transfer-Encoding"];
webConnection.chunkedRead = text != null && text.ToLower().IndexOf("chunked") != -1;
if (!webConnection.chunkedRead)
{
webConnectionStream.ReadBuffer = webConnection.buffer;
webConnectionStream.ReadBufferOffset = num2;
webConnectionStream.ReadBufferSize = num;
webConnectionStream.CheckResponseInBuffer();
}
else if (webConnection.chunkStream == null)
{
try
{
webConnection.chunkStream = new ChunkStream(webConnection.buffer, num2, num, data.Headers);
}
catch (Exception ex4)
{
webConnection.HandleError(WebExceptionStatus.ServerProtocolViolation, ex4, "ReadDone5");
return;
}
}
else
{
webConnection.chunkStream.ResetBuffer();
try
{
webConnection.chunkStream.Write(webConnection.buffer, num2, num);
}
catch (Exception ex5)
{
webConnection.HandleError(WebExceptionStatus.ServerProtocolViolation, ex5, "ReadDone6");
return;
}
}
data.stream = webConnectionStream;
if (!WebConnection.ExpectContent(data.StatusCode) || data.request.Method == "HEAD")
{
webConnectionStream.ForceCompletion();
}
data.request.SetResponseData(data);
}
// Token: 0x06001636 RID: 5686 RVA: 0x00048C74 File Offset: 0x00046E74
private static bool ExpectContent(int statusCode)
{
return statusCode >= 200 && statusCode != 204 && statusCode != 304;
}
// Token: 0x06001637 RID: 5687 RVA: 0x00048CA8 File Offset: 0x00046EA8
internal void GetCertificates()
{
X509Certificate x509Certificate = (X509Certificate)WebConnection.piClient.GetValue(this.nstream, null);
X509Certificate x509Certificate2 = (X509Certificate)WebConnection.piServer.GetValue(this.nstream, null);
this.sPoint.SetCertificates(x509Certificate, x509Certificate2);
this.certsAvailable = x509Certificate2 != null;
}
// Token: 0x06001638 RID: 5688 RVA: 0x00048D00 File Offset: 0x00046F00
internal static void InitRead(object state)
{
WebConnection webConnection = (WebConnection)state;
Stream stream = webConnection.nstream;
try
{
int num = webConnection.buffer.Length - webConnection.position;
stream.BeginRead(webConnection.buffer, webConnection.position, num, WebConnection.readDoneDelegate, webConnection);
}
catch (Exception ex)
{
webConnection.HandleError(WebExceptionStatus.ReceiveFailure, ex, "InitRead");
}
}
// Token: 0x06001639 RID: 5689 RVA: 0x00048D7C File Offset: 0x00046F7C
private int GetResponse(byte[] buffer, int max)
{
int num = 0;
string text = null;
bool flag = false;
bool flag2 = false;
for (;;)
{
if (this.readState != ReadState.None)
{
goto IL_114;
}
if (!WebConnection.ReadLine(buffer, ref num, max, ref text))
{
break;
}
if (text == null)
{
flag2 = true;
}
else
{
flag2 = false;
this.readState = ReadState.Status;
string[] array = text.Split(new char[] { ' ' });
if (array.Length < 2)
{
return -1;
}
if (string.Compare(array[0], "HTTP/1.1", true) == 0)
{
this.Data.Version = HttpVersion.Version11;
this.sPoint.SetVersion(HttpVersion.Version11);
}
else
{
this.Data.Version = HttpVersion.Version10;
this.sPoint.SetVersion(HttpVersion.Version10);
}
this.Data.StatusCode = (int)uint.Parse(array[1]);
if (array.Length >= 3)
{
this.Data.StatusDescription = string.Join(" ", array, 2, array.Length - 2);
}
else
{
this.Data.StatusDescription = string.Empty;
}
if (num >= max)
{
return num;
}
goto IL_114;
}
IL_2CA:
if (!flag2 && !flag)
{
return -1;
}
continue;
IL_114:
flag2 = false;
if (this.readState != ReadState.Status)
{
goto IL_2CA;
}
this.readState = ReadState.Headers;
this.Data.Headers = new WebHeaderCollection();
ArrayList arrayList = new ArrayList();
bool flag3 = false;
while (!flag3)
{
if (!WebConnection.ReadLine(buffer, ref num, max, ref text))
{
break;
}
if (text == null)
{
flag3 = true;
}
else if (text.Length > 0 && (text[0] == ' ' || text[0] == '\t'))
{
int num2 = arrayList.Count - 1;
if (num2 < 0)
{
break;
}
string text2 = (string)arrayList[num2] + text;
arrayList[num2] = text2;
}
else
{
arrayList.Add(text);
}
}
if (!flag3)
{
return -1;
}
foreach (object obj in arrayList)
{
string text3 = (string)obj;
this.Data.Headers.SetInternal(text3);
}
if (this.Data.StatusCode != 100)
{
goto IL_2C1;
}
this.sPoint.SendContinue = true;
if (num >= max)
{
return num;
}
if (this.Data.request.ExpectContinue)
{
this.Data.request.DoContinueDelegate(this.Data.StatusCode, this.Data.Headers);
this.Data.request.ExpectContinue = false;
}
this.readState = ReadState.None;
flag = true;
goto IL_2CA;
}
return -1;
IL_2C1:
this.readState = ReadState.Content;
return num;
}
// Token: 0x0600163A RID: 5690 RVA: 0x00049080 File Offset: 0x00047280
private void InitConnection(object state)
{
HttpWebRequest httpWebRequest = (HttpWebRequest)state;
httpWebRequest.WebConnection = this;
if (httpWebRequest.Aborted)
{
return;
}
this.keepAlive = httpWebRequest.KeepAlive;
this.Data = new WebConnectionData();
this.Data.request = httpWebRequest;
WebExceptionStatus webExceptionStatus;
for (;;)
{
this.Connect(httpWebRequest);
if (httpWebRequest.Aborted)
{
break;
}
if (this.status != WebExceptionStatus.Success)
{
goto Block_3;
}
if (this.CreateStream(httpWebRequest))
{
goto IL_D2;
}
if (httpWebRequest.Aborted)
{
return;
}
webExceptionStatus = this.status;
if (this.Data.Challenge == null)
{
goto IL_B4;
}
}
return;
Block_3:
if (!httpWebRequest.Aborted)
{
httpWebRequest.SetWriteStreamError(this.status, this.connect_exception);
this.Close(true);
}
return;
IL_B4:
Exception ex = this.connect_exception;
this.connect_exception = null;
httpWebRequest.SetWriteStreamError(webExceptionStatus, ex);
this.Close(true);
return;
IL_D2:
this.readState = ReadState.None;
httpWebRequest.SetWriteStream(new WebConnectionStream(this, httpWebRequest));
}
// Token: 0x0600163B RID: 5691 RVA: 0x00049174 File Offset: 0x00047374
internal EventHandler SendRequest(HttpWebRequest request)
{
if (request.Aborted)
{
return null;
}
lock (this)
{
if (!this.busy)
{
this.busy = true;
this.status = WebExceptionStatus.Success;
ThreadPool.QueueUserWorkItem(this.initConn, request);
}
else
{
Queue queue = this.queue;
lock (queue)
{
this.queue.Enqueue(request);
}
}
}
return this.abortHandler;
}
// Token: 0x0600163C RID: 5692 RVA: 0x0004922C File Offset: 0x0004742C
private void SendNext()
{
Queue queue = this.queue;
lock (queue)
{
if (this.queue.Count > 0)
{
this.SendRequest((HttpWebRequest)this.queue.Dequeue());
}
}
}
// Token: 0x0600163D RID: 5693 RVA: 0x00049298 File Offset: 0x00047498
internal void NextRead()
{
lock (this)
{
this.Data.request.FinishedReading = true;
string text = ((!this.sPoint.UsesProxy) ? "Connection" : "Proxy-Connection");
string text2 = ((this.Data.Headers == null) ? null : this.Data.Headers[text]);
bool flag = this.Data.Version == HttpVersion.Version11 && this.keepAlive;
if (text2 != null)
{
text2 = text2.ToLower();
flag = this.keepAlive && text2.IndexOf("keep-alive") != -1;
}
if ((this.socket != null && !this.socket.Connected) || !flag || (text2 != null && text2.IndexOf("close") != -1))
{
this.Close(false);
}
this.busy = false;
if (this.priority_request != null)
{
this.SendRequest(this.priority_request);
this.priority_request = null;
}
else
{
this.SendNext();
}
}
}
// Token: 0x0600163E RID: 5694 RVA: 0x000493F0 File Offset: 0x000475F0
private static bool ReadLine(byte[] buffer, ref int start, int max, ref string output)
{
bool flag = false;
StringBuilder stringBuilder = new StringBuilder();
int num = 0;
while (start < max)
{
num = (int)buffer[start++];
if (num == 10)
{
if (stringBuilder.Length > 0 && stringBuilder[stringBuilder.Length - 1] == '\r')
{
stringBuilder.Length--;
}
flag = false;
break;
}
if (flag)
{
stringBuilder.Length--;
break;
}
if (num == 13)
{
flag = true;
}
stringBuilder.Append((char)num);
}
if (num != 10 && num != 13)
{
return false;
}
if (stringBuilder.Length == 0)
{
output = null;
return num == 10 || num == 13;
}
if (flag)
{
stringBuilder.Length--;
}
output = stringBuilder.ToString();
return true;
}
// Token: 0x0600163F RID: 5695 RVA: 0x000494D8 File Offset: 0x000476D8
internal IAsyncResult BeginRead(HttpWebRequest request, byte[] buffer, int offset, int size, AsyncCallback cb, object state)
{
lock (this)
{
if (this.Data.request != request)
{
throw new ObjectDisposedException(typeof(global::System.Net.Sockets.NetworkStream).FullName);
}
if (this.nstream == null)
{
return null;
}
}
IAsyncResult asyncResult = null;
if (this.chunkedRead)
{
if (!this.chunkStream.WantMore)
{
goto IL_9A;
}
}
try
{
asyncResult = this.nstream.BeginRead(buffer, offset, size, cb, state);
cb = null;
}
catch (Exception)
{
this.HandleError(WebExceptionStatus.ReceiveFailure, null, "chunked BeginRead");
throw;
}
IL_9A:
if (this.chunkedRead)
{
WebAsyncResult webAsyncResult = new WebAsyncResult(cb, state, buffer, offset, size);
webAsyncResult.InnerAsyncResult = asyncResult;
if (asyncResult == null)
{
webAsyncResult.SetCompleted(true, null);
webAsyncResult.DoCallback();
}
return webAsyncResult;
}
return asyncResult;
}
// Token: 0x06001640 RID: 5696 RVA: 0x000495EC File Offset: 0x000477EC
internal int EndRead(HttpWebRequest request, IAsyncResult result)
{
lock (this)
{
if (this.Data.request != request)
{
throw new ObjectDisposedException(typeof(global::System.Net.Sockets.NetworkStream).FullName);
}
if (this.nstream == null)
{
throw new ObjectDisposedException(typeof(global::System.Net.Sockets.NetworkStream).FullName);
}
}
int num = 0;
WebAsyncResult webAsyncResult = null;
IAsyncResult innerAsyncResult = ((WebAsyncResult)result).InnerAsyncResult;
if (this.chunkedRead && innerAsyncResult is WebAsyncResult)
{
webAsyncResult = (WebAsyncResult)innerAsyncResult;
IAsyncResult innerAsyncResult2 = webAsyncResult.InnerAsyncResult;
if (innerAsyncResult2 != null && !(innerAsyncResult2 is WebAsyncResult))
{
num = this.nstream.EndRead(innerAsyncResult2);
}
}
else if (!(innerAsyncResult is WebAsyncResult))
{
num = this.nstream.EndRead(innerAsyncResult);
webAsyncResult = (WebAsyncResult)result;
}
if (this.chunkedRead)
{
bool flag = num == 0;
try
{
this.chunkStream.WriteAndReadBack(webAsyncResult.Buffer, webAsyncResult.Offset, webAsyncResult.Size, ref num);
if (!flag && num == 0 && this.chunkStream.WantMore)
{
num = this.EnsureRead(webAsyncResult.Buffer, webAsyncResult.Offset, webAsyncResult.Size);
}
}
catch (Exception ex)
{
if (ex is WebException)
{
throw ex;
}
throw new WebException("Invalid chunked data.", ex, WebExceptionStatus.ServerProtocolViolation, null);
}
if ((flag || num == 0) && this.chunkStream.ChunkLeft != 0)
{
this.HandleError(WebExceptionStatus.ReceiveFailure, null, "chunked EndRead");
throw new WebException("Read error", null, WebExceptionStatus.ReceiveFailure, null);
}
}
return (num == 0) ? (-1) : num;
}
// Token: 0x06001641 RID: 5697 RVA: 0x000497D8 File Offset: 0x000479D8
private int EnsureRead(byte[] buffer, int offset, int size)
{
byte[] array = null;
int num = 0;
while (num == 0 && this.chunkStream.WantMore)
{
int num2 = this.chunkStream.ChunkLeft;
if (num2 <= 0)
{
num2 = 1024;
}
else if (num2 > 16384)
{
num2 = 16384;
}
if (array == null || array.Length < num2)
{
array = new byte[num2];
}
int num3 = this.nstream.Read(array, 0, num2);
if (num3 <= 0)
{
return 0;
}
this.chunkStream.Write(array, 0, num3);
num += this.chunkStream.Read(buffer, offset + num, size - num);
}
return num;
}
// Token: 0x06001642 RID: 5698 RVA: 0x00049888 File Offset: 0x00047A88
private bool CompleteChunkedRead()
{
if (!this.chunkedRead || this.chunkStream == null)
{
return true;
}
while (this.chunkStream.WantMore)
{
int num = this.nstream.Read(this.buffer, 0, this.buffer.Length);
if (num <= 0)
{
return false;
}
this.chunkStream.Write(this.buffer, 0, num);
}
return true;
}
// Token: 0x06001643 RID: 5699 RVA: 0x000498FC File Offset: 0x00047AFC
internal IAsyncResult BeginWrite(HttpWebRequest request, byte[] buffer, int offset, int size, AsyncCallback cb, object state)
{
lock (this)
{
if (this.Data.request != request)
{
throw new ObjectDisposedException(typeof(global::System.Net.Sockets.NetworkStream).FullName);
}
if (this.nstream == null)
{
return null;
}
}
IAsyncResult asyncResult = null;
try
{
asyncResult = this.nstream.BeginWrite(buffer, offset, size, cb, state);
}
catch (Exception)
{
this.status = WebExceptionStatus.SendFailure;
throw;
}
return asyncResult;
}
// Token: 0x06001644 RID: 5700 RVA: 0x000499B8 File Offset: 0x00047BB8
internal void EndWrite2(HttpWebRequest request, IAsyncResult result)
{
if (request.FinishedReading)
{
return;
}
lock (this)
{
if (this.Data.request != request)
{
throw new ObjectDisposedException(typeof(global::System.Net.Sockets.NetworkStream).FullName);
}
if (this.nstream == null)
{
throw new ObjectDisposedException(typeof(global::System.Net.Sockets.NetworkStream).FullName);
}
}
try
{
this.nstream.EndWrite(result);
}
catch (Exception ex)
{
this.status = WebExceptionStatus.SendFailure;
if (ex.InnerException != null)
{
throw ex.InnerException;
}
throw;
}
}
// Token: 0x06001645 RID: 5701 RVA: 0x00049A94 File Offset: 0x00047C94
internal bool EndWrite(HttpWebRequest request, IAsyncResult result)
{
if (request.FinishedReading)
{
return true;
}
lock (this)
{
if (this.Data.request != request)
{
throw new ObjectDisposedException(typeof(global::System.Net.Sockets.NetworkStream).FullName);
}
if (this.nstream == null)
{
throw new ObjectDisposedException(typeof(global::System.Net.Sockets.NetworkStream).FullName);
}
}
bool flag;
try
{
this.nstream.EndWrite(result);
flag = true;
}
catch
{
this.status = WebExceptionStatus.SendFailure;
flag = false;
}
return flag;
}
// Token: 0x06001646 RID: 5702 RVA: 0x00049B6C File Offset: 0x00047D6C
internal int Read(HttpWebRequest request, byte[] buffer, int offset, int size)
{
lock (this)
{
if (this.Data.request != request)
{
throw new ObjectDisposedException(typeof(global::System.Net.Sockets.NetworkStream).FullName);
}
if (this.nstream == null)
{
return 0;
}
}
int num = 0;
try
{
bool flag = false;
if (!this.chunkedRead)
{
num = this.nstream.Read(buffer, offset, size);
flag = num == 0;
}
if (this.chunkedRead)
{
try
{
this.chunkStream.WriteAndReadBack(buffer, offset, size, ref num);
if (!flag && num == 0 && this.chunkStream.WantMore)
{
num = this.EnsureRead(buffer, offset, size);
}
}
catch (Exception ex)
{
this.HandleError(WebExceptionStatus.ReceiveFailure, ex, "chunked Read1");
throw;
}
if ((flag || num == 0) && this.chunkStream.WantMore)
{
this.HandleError(WebExceptionStatus.ReceiveFailure, null, "chunked Read2");
throw new WebException("Read error", null, WebExceptionStatus.ReceiveFailure, null);
}
}
}
catch (Exception ex2)
{
this.HandleError(WebExceptionStatus.ReceiveFailure, ex2, "Read");
}
return num;
}
// Token: 0x06001647 RID: 5703 RVA: 0x00049CE8 File Offset: 0x00047EE8
internal bool Write(HttpWebRequest request, byte[] buffer, int offset, int size, ref string err_msg)
{
err_msg = null;
lock (this)
{
if (this.Data.request != request)
{
throw new ObjectDisposedException(typeof(global::System.Net.Sockets.NetworkStream).FullName);
}
if (this.nstream == null)
{
return false;
}
}
try
{
this.nstream.Write(buffer, offset, size);
if (this.ssl && !this.certsAvailable)
{
this.GetCertificates();
}
}
catch (Exception ex)
{
err_msg = ex.Message;
WebExceptionStatus webExceptionStatus = WebExceptionStatus.SendFailure;
string text = "Write: " + err_msg;
if (ex is WebException)
{
this.HandleError(webExceptionStatus, ex, text);
return false;
}
if (this.ssl && (bool)WebConnection.piTrustFailure.GetValue(this.nstream, null))
{
webExceptionStatus = WebExceptionStatus.TrustFailure;
text = "Trust failure";
}
this.HandleError(webExceptionStatus, ex, text);
return false;
}
return true;
}
// Token: 0x06001648 RID: 5704 RVA: 0x00049E2C File Offset: 0x0004802C
internal void Close(bool sendNext)
{
lock (this)
{
if (this.nstream != null)
{
try
{
this.nstream.Close();
}
catch
{
}
this.nstream = null;
}
if (this.socket != null)
{
try
{
this.socket.Close();
}
catch
{
}
this.socket = null;
}
this.busy = false;
this.Data = new WebConnectionData();
if (sendNext)
{
this.SendNext();
}
}
}
// Token: 0x06001649 RID: 5705 RVA: 0x00049F08 File Offset: 0x00048108
private void Abort(object sender, EventArgs args)
{
lock (this)
{
Queue queue = this.queue;
lock (queue)
{
HttpWebRequest httpWebRequest = (HttpWebRequest)sender;
if (this.Data.request == httpWebRequest)
{
if (!httpWebRequest.FinishedReading)
{
this.status = WebExceptionStatus.RequestCanceled;
this.Close(false);
if (this.queue.Count > 0)
{
this.Data.request = (HttpWebRequest)this.queue.Dequeue();
this.SendRequest(this.Data.request);
}
}
}
else
{
httpWebRequest.FinishedReading = true;
httpWebRequest.SetResponseError(WebExceptionStatus.RequestCanceled, null, "User aborted");
if (this.queue.Count > 0 && this.queue.Peek() == sender)
{
this.queue.Dequeue();
}
else if (this.queue.Count > 0)
{
object[] array = this.queue.ToArray();
this.queue.Clear();
for (int i = array.Length - 1; i >= 0; i--)
{
if (array[i] != sender)
{
this.queue.Enqueue(array[i]);
}
}
}
}
}
}
}
// Token: 0x0600164A RID: 5706 RVA: 0x0004A08C File Offset: 0x0004828C
internal void ResetNtlm()
{
this.ntlm_authenticated = false;
this.ntlm_credentials = null;
this.unsafe_sharing = false;
}
// Token: 0x17000726 RID: 1830
// (get) Token: 0x0600164B RID: 5707 RVA: 0x0004A0A4 File Offset: 0x000482A4
internal bool Busy
{
get
{
bool flag;
lock (this)
{
flag = this.busy;
}
return flag;
}
}
// Token: 0x17000727 RID: 1831
// (get) Token: 0x0600164C RID: 5708 RVA: 0x0004A0F0 File Offset: 0x000482F0
internal bool Connected
{
get
{
bool flag;
lock (this)
{
flag = this.socket != null && this.socket.Connected;
}
return flag;
}
}
// Token: 0x17000728 RID: 1832
// (set) Token: 0x0600164D RID: 5709 RVA: 0x0004A150 File Offset: 0x00048350
internal HttpWebRequest PriorityRequest
{
set
{
this.priority_request = value;
}
}
// Token: 0x17000729 RID: 1833
// (get) Token: 0x0600164E RID: 5710 RVA: 0x0004A15C File Offset: 0x0004835C
// (set) Token: 0x0600164F RID: 5711 RVA: 0x0004A164 File Offset: 0x00048364
internal bool NtlmAuthenticated
{
get
{
return this.ntlm_authenticated;
}
set
{
this.ntlm_authenticated = value;
}
}
// Token: 0x1700072A RID: 1834
// (get) Token: 0x06001650 RID: 5712 RVA: 0x0004A170 File Offset: 0x00048370
// (set) Token: 0x06001651 RID: 5713 RVA: 0x0004A178 File Offset: 0x00048378
internal NetworkCredential NtlmCredential
{
get
{
return this.ntlm_credentials;
}
set
{
this.ntlm_credentials = value;
}
}
// Token: 0x1700072B RID: 1835
// (get) Token: 0x06001652 RID: 5714 RVA: 0x0004A184 File Offset: 0x00048384
// (set) Token: 0x06001653 RID: 5715 RVA: 0x0004A18C File Offset: 0x0004838C
internal bool UnsafeAuthenticatedConnectionSharing
{
get
{
return this.unsafe_sharing;
}
set
{
this.unsafe_sharing = value;
}
}
// Token: 0x0400120E RID: 4622
private ServicePoint sPoint;
// Token: 0x0400120F RID: 4623
private Stream nstream;
// Token: 0x04001210 RID: 4624
private global::System.Net.Sockets.Socket socket;
// Token: 0x04001211 RID: 4625
private object socketLock = new object();
// Token: 0x04001212 RID: 4626
private WebExceptionStatus status;
// Token: 0x04001213 RID: 4627
private WaitCallback initConn;
// Token: 0x04001214 RID: 4628
private bool keepAlive;
// Token: 0x04001215 RID: 4629
private byte[] buffer;
// Token: 0x04001216 RID: 4630
private static AsyncCallback readDoneDelegate = new AsyncCallback(WebConnection.ReadDone);
// Token: 0x04001217 RID: 4631
private EventHandler abortHandler;
// Token: 0x04001218 RID: 4632
private WebConnection.AbortHelper abortHelper;
// Token: 0x04001219 RID: 4633
private ReadState readState;
// Token: 0x0400121A RID: 4634
internal WebConnectionData Data;
// Token: 0x0400121B RID: 4635
private bool chunkedRead;
// Token: 0x0400121C RID: 4636
private ChunkStream chunkStream;
// Token: 0x0400121D RID: 4637
private Queue queue;
// Token: 0x0400121E RID: 4638
private bool reused;
// Token: 0x0400121F RID: 4639
private int position;
// Token: 0x04001220 RID: 4640
private bool busy;
// Token: 0x04001221 RID: 4641
private HttpWebRequest priority_request;
// Token: 0x04001222 RID: 4642
private NetworkCredential ntlm_credentials;
// Token: 0x04001223 RID: 4643
private bool ntlm_authenticated;
// Token: 0x04001224 RID: 4644
private bool unsafe_sharing;
// Token: 0x04001225 RID: 4645
private bool ssl;
// Token: 0x04001226 RID: 4646
private bool certsAvailable;
// Token: 0x04001227 RID: 4647
private Exception connect_exception;
// Token: 0x04001228 RID: 4648
private static object classLock = new object();
// Token: 0x04001229 RID: 4649
private static Type sslStream;
// Token: 0x0400122A RID: 4650
private static PropertyInfo piClient;
// Token: 0x0400122B RID: 4651
private static PropertyInfo piServer;
// Token: 0x0400122C RID: 4652
private static PropertyInfo piTrustFailure;
// Token: 0x0400122D RID: 4653
private static MethodInfo method_GetSecurityPolicyFromNonMainThread;
// Token: 0x02000262 RID: 610
private class AbortHelper
{
// Token: 0x06001655 RID: 5717 RVA: 0x0004A1A0 File Offset: 0x000483A0
public void Abort(object sender, EventArgs args)
{
WebConnection webConnection = ((HttpWebRequest)sender).WebConnection;
if (webConnection == null)
{
webConnection = this.Connection;
}
webConnection.Abort(sender, args);
}
// Token: 0x0400122E RID: 4654
public WebConnection Connection;
}
}
}