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

201 lines
5.8 KiB
C#

using System;
using System.IO;
using System.Runtime.InteropServices;
namespace System.Net
{
// Token: 0x02000202 RID: 514
internal class ChunkedInputStream : RequestStream
{
// Token: 0x06001165 RID: 4453 RVA: 0x00033010 File Offset: 0x00031210
public ChunkedInputStream(HttpListenerContext context, Stream stream, byte[] buffer, int offset, int length)
: base(stream, buffer, offset, length)
{
this.context = context;
WebHeaderCollection webHeaderCollection = (WebHeaderCollection)context.Request.Headers;
this.decoder = new ChunkStream(webHeaderCollection);
}
// Token: 0x170005B7 RID: 1463
// (get) Token: 0x06001166 RID: 4454 RVA: 0x00033050 File Offset: 0x00031250
// (set) Token: 0x06001167 RID: 4455 RVA: 0x00033058 File Offset: 0x00031258
public ChunkStream Decoder
{
get
{
return this.decoder;
}
set
{
this.decoder = value;
}
}
// Token: 0x06001168 RID: 4456 RVA: 0x00033064 File Offset: 0x00031264
public override int Read([In] [Out] byte[] buffer, int offset, int count)
{
IAsyncResult asyncResult = this.BeginRead(buffer, offset, count, null, null);
return this.EndRead(asyncResult);
}
// Token: 0x06001169 RID: 4457 RVA: 0x00033084 File Offset: 0x00031284
public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback cback, object state)
{
if (this.disposed)
{
throw new ObjectDisposedException(base.GetType().ToString());
}
if (buffer == null)
{
throw new ArgumentNullException("buffer");
}
int num = buffer.Length;
if (offset < 0 || offset > num)
{
throw new ArgumentOutOfRangeException("offset exceeds the size of buffer");
}
if (count < 0 || offset > num - count)
{
throw new ArgumentOutOfRangeException("offset+size exceeds the size of buffer");
}
HttpStreamAsyncResult httpStreamAsyncResult = new HttpStreamAsyncResult();
httpStreamAsyncResult.Callback = cback;
httpStreamAsyncResult.State = state;
if (this.no_more_data)
{
httpStreamAsyncResult.Complete();
return httpStreamAsyncResult;
}
int num2 = this.decoder.Read(buffer, offset, count);
offset += num2;
count -= num2;
if (count == 0)
{
httpStreamAsyncResult.Count = num2;
httpStreamAsyncResult.Complete();
return httpStreamAsyncResult;
}
if (!this.decoder.WantMore)
{
this.no_more_data = num2 == 0;
httpStreamAsyncResult.Count = num2;
httpStreamAsyncResult.Complete();
return httpStreamAsyncResult;
}
httpStreamAsyncResult.Buffer = new byte[8192];
httpStreamAsyncResult.Offset = 0;
httpStreamAsyncResult.Count = 8192;
ChunkedInputStream.ReadBufferState readBufferState = new ChunkedInputStream.ReadBufferState(buffer, offset, count, httpStreamAsyncResult);
readBufferState.InitialCount += num2;
base.BeginRead(httpStreamAsyncResult.Buffer, httpStreamAsyncResult.Offset, httpStreamAsyncResult.Count, new AsyncCallback(this.OnRead), readBufferState);
return httpStreamAsyncResult;
}
// Token: 0x0600116A RID: 4458 RVA: 0x000331D8 File Offset: 0x000313D8
private void OnRead(IAsyncResult base_ares)
{
ChunkedInputStream.ReadBufferState readBufferState = (ChunkedInputStream.ReadBufferState)base_ares.AsyncState;
HttpStreamAsyncResult ares = readBufferState.Ares;
try
{
int num = base.EndRead(base_ares);
this.decoder.Write(ares.Buffer, ares.Offset, num);
num = this.decoder.Read(readBufferState.Buffer, readBufferState.Offset, readBufferState.Count);
readBufferState.Offset += num;
readBufferState.Count -= num;
if (readBufferState.Count == 0 || !this.decoder.WantMore || num == 0)
{
this.no_more_data = !this.decoder.WantMore && num == 0;
ares.Count = readBufferState.InitialCount - readBufferState.Count;
ares.Complete();
}
else
{
ares.Offset = 0;
ares.Count = Math.Min(8192, this.decoder.ChunkLeft + 6);
base.BeginRead(ares.Buffer, ares.Offset, ares.Count, new AsyncCallback(this.OnRead), readBufferState);
}
}
catch (Exception ex)
{
this.context.Connection.SendError(ex.Message, 400);
ares.Complete(ex);
}
}
// Token: 0x0600116B RID: 4459 RVA: 0x00033344 File Offset: 0x00031544
public override int EndRead(IAsyncResult ares)
{
if (this.disposed)
{
throw new ObjectDisposedException(base.GetType().ToString());
}
HttpStreamAsyncResult httpStreamAsyncResult = ares as HttpStreamAsyncResult;
if (ares == null)
{
throw new ArgumentException("Invalid IAsyncResult", "ares");
}
if (!ares.IsCompleted)
{
ares.AsyncWaitHandle.WaitOne();
}
if (httpStreamAsyncResult.Error != null)
{
throw new HttpListenerException(400, "I/O operation aborted.");
}
return httpStreamAsyncResult.Count;
}
// Token: 0x0600116C RID: 4460 RVA: 0x000333C4 File Offset: 0x000315C4
public override void Close()
{
if (!this.disposed)
{
this.disposed = true;
base.Close();
}
}
// Token: 0x04000F6A RID: 3946
private bool disposed;
// Token: 0x04000F6B RID: 3947
private ChunkStream decoder;
// Token: 0x04000F6C RID: 3948
private HttpListenerContext context;
// Token: 0x04000F6D RID: 3949
private bool no_more_data;
// Token: 0x02000203 RID: 515
private class ReadBufferState
{
// Token: 0x0600116D RID: 4461 RVA: 0x000333E0 File Offset: 0x000315E0
public ReadBufferState(byte[] buffer, int offset, int count, HttpStreamAsyncResult ares)
{
this.Buffer = buffer;
this.Offset = offset;
this.Count = count;
this.InitialCount = count;
this.Ares = ares;
}
// Token: 0x04000F6E RID: 3950
public byte[] Buffer;
// Token: 0x04000F6F RID: 3951
public int Offset;
// Token: 0x04000F70 RID: 3952
public int Count;
// Token: 0x04000F71 RID: 3953
public int InitialCount;
// Token: 0x04000F72 RID: 3954
public HttpStreamAsyncResult Ares;
}
}
}