201 lines
5.8 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|