Commit f5298575 authored by Honfika's avatar Honfika

less exceptions

parent 5ec93000
...@@ -385,11 +385,6 @@ namespace Titanium.Web.Proxy ...@@ -385,11 +385,6 @@ namespace Titanium.Web.Proxy
sslStream?.Dispose(); sslStream?.Dispose();
clientStream.Dispose(); clientStream.Dispose();
if (!cancellationTokenSource.IsCancellationRequested)
{
cancellationTokenSource.Cancel();
}
} }
} }
} }
......
...@@ -17,6 +17,7 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -17,6 +17,7 @@ namespace Titanium.Web.Proxy.Helpers
{ {
internal class HttpStream : Stream, IHttpStreamWriter, IHttpStreamReader, IPeekStream internal class HttpStream : Stream, IHttpStreamWriter, IHttpStreamReader, IPeekStream
{ {
private readonly bool swallowException;
private readonly bool leaveOpen; private readonly bool leaveOpen;
private readonly byte[] streamBuffer; private readonly byte[] streamBuffer;
...@@ -38,7 +39,7 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -38,7 +39,7 @@ namespace Titanium.Web.Proxy.Helpers
public event EventHandler<DataEventArgs>? DataWrite; public event EventHandler<DataEventArgs>? DataWrite;
public Stream BaseStream { get; } private Stream baseStream { get; }
public bool IsClosed => closed; public bool IsClosed => closed;
...@@ -70,7 +71,12 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -70,7 +71,12 @@ namespace Titanium.Web.Proxy.Helpers
/// <param name="leaveOpen"><see langword="true" /> to leave the stream open after disposing the <see cref="T:CustomBufferedStream" /> object; otherwise, <see langword="false" />.</param> /// <param name="leaveOpen"><see langword="true" /> to leave the stream open after disposing the <see cref="T:CustomBufferedStream" /> object; otherwise, <see langword="false" />.</param>
internal HttpStream(Stream baseStream, IBufferPool bufferPool, bool leaveOpen = false) internal HttpStream(Stream baseStream, IBufferPool bufferPool, bool leaveOpen = false)
{ {
BaseStream = baseStream; if (baseStream is NetworkStream)
{
swallowException = true;
}
this.baseStream = baseStream;
this.leaveOpen = leaveOpen; this.leaveOpen = leaveOpen;
streamBuffer = bufferPool.GetBuffer(); streamBuffer = bufferPool.GetBuffer();
this.bufferPool = bufferPool; this.bufferPool = bufferPool;
...@@ -81,7 +87,7 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -81,7 +87,7 @@ namespace Titanium.Web.Proxy.Helpers
/// </summary> /// </summary>
public override void Flush() public override void Flush()
{ {
BaseStream.Flush(); baseStream.Flush();
} }
/// <summary> /// <summary>
...@@ -96,7 +102,7 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -96,7 +102,7 @@ namespace Titanium.Web.Proxy.Helpers
{ {
bufferLength = 0; bufferLength = 0;
bufferPos = 0; bufferPos = 0;
return BaseStream.Seek(offset, origin); return baseStream.Seek(offset, origin);
} }
/// <summary> /// <summary>
...@@ -105,7 +111,7 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -105,7 +111,7 @@ namespace Titanium.Web.Proxy.Helpers
/// <param name="value">The desired length of the current stream in bytes.</param> /// <param name="value">The desired length of the current stream in bytes.</param>
public override void SetLength(long value) public override void SetLength(long value)
{ {
BaseStream.SetLength(value); baseStream.SetLength(value);
} }
/// <summary> /// <summary>
...@@ -145,7 +151,7 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -145,7 +151,7 @@ namespace Titanium.Web.Proxy.Helpers
public override void Write(byte[] buffer, int offset, int count) public override void Write(byte[] buffer, int offset, int count)
{ {
OnDataWrite(buffer, offset, count); OnDataWrite(buffer, offset, count);
BaseStream.Write(buffer, offset, count); baseStream.Write(buffer, offset, count);
} }
/// <summary> /// <summary>
...@@ -178,7 +184,7 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -178,7 +184,7 @@ namespace Titanium.Web.Proxy.Helpers
/// </returns> /// </returns>
public override Task FlushAsync(CancellationToken cancellationToken) public override Task FlushAsync(CancellationToken cancellationToken)
{ {
return BaseStream.FlushAsync(cancellationToken); return baseStream.FlushAsync(cancellationToken);
} }
/// <summary> /// <summary>
...@@ -385,8 +391,7 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -385,8 +391,7 @@ namespace Titanium.Web.Proxy.Helpers
public override async Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) public override async Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
{ {
OnDataWrite(buffer, offset, count); OnDataWrite(buffer, offset, count);
await baseStream.WriteAsync(buffer, offset, count, cancellationToken);
await BaseStream.WriteAsync(buffer, offset, count, cancellationToken);
} }
/// <summary> /// <summary>
...@@ -400,7 +405,7 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -400,7 +405,7 @@ namespace Titanium.Web.Proxy.Helpers
{ {
buffer[0] = value; buffer[0] = value;
OnDataWrite(buffer, 0, 1); OnDataWrite(buffer, 0, 1);
BaseStream.Write(buffer, 0, 1); baseStream.Write(buffer, 0, 1);
} }
finally finally
{ {
...@@ -430,7 +435,7 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -430,7 +435,7 @@ namespace Titanium.Web.Proxy.Helpers
closed = true; closed = true;
if (!leaveOpen) if (!leaveOpen)
{ {
BaseStream.Dispose(); baseStream.Dispose();
} }
bufferPool.ReturnBuffer(streamBuffer); bufferPool.ReturnBuffer(streamBuffer);
...@@ -440,27 +445,27 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -440,27 +445,27 @@ namespace Titanium.Web.Proxy.Helpers
/// <summary> /// <summary>
/// When overridden in a derived class, gets a value indicating whether the current stream supports reading. /// When overridden in a derived class, gets a value indicating whether the current stream supports reading.
/// </summary> /// </summary>
public override bool CanRead => BaseStream.CanRead; public override bool CanRead => baseStream.CanRead;
/// <summary> /// <summary>
/// When overridden in a derived class, gets a value indicating whether the current stream supports seeking. /// When overridden in a derived class, gets a value indicating whether the current stream supports seeking.
/// </summary> /// </summary>
public override bool CanSeek => BaseStream.CanSeek; public override bool CanSeek => baseStream.CanSeek;
/// <summary> /// <summary>
/// When overridden in a derived class, gets a value indicating whether the current stream supports writing. /// When overridden in a derived class, gets a value indicating whether the current stream supports writing.
/// </summary> /// </summary>
public override bool CanWrite => BaseStream.CanWrite; public override bool CanWrite => baseStream.CanWrite;
/// <summary> /// <summary>
/// Gets a value that determines whether the current stream can time out. /// Gets a value that determines whether the current stream can time out.
/// </summary> /// </summary>
public override bool CanTimeout => BaseStream.CanTimeout; public override bool CanTimeout => baseStream.CanTimeout;
/// <summary> /// <summary>
/// When overridden in a derived class, gets the length in bytes of the stream. /// When overridden in a derived class, gets the length in bytes of the stream.
/// </summary> /// </summary>
public override long Length => BaseStream.Length; public override long Length => baseStream.Length;
/// <summary> /// <summary>
/// Gets a value indicating whether data is available. /// Gets a value indicating whether data is available.
...@@ -477,8 +482,8 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -477,8 +482,8 @@ namespace Titanium.Web.Proxy.Helpers
/// </summary> /// </summary>
public override long Position public override long Position
{ {
get => BaseStream.Position; get => baseStream.Position;
set => BaseStream.Position = value; set => baseStream.Position = value;
} }
/// <summary> /// <summary>
...@@ -486,8 +491,8 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -486,8 +491,8 @@ namespace Titanium.Web.Proxy.Helpers
/// </summary> /// </summary>
public override int ReadTimeout public override int ReadTimeout
{ {
get => BaseStream.ReadTimeout; get => baseStream.ReadTimeout;
set => BaseStream.ReadTimeout = value; set => baseStream.ReadTimeout = value;
} }
/// <summary> /// <summary>
...@@ -495,8 +500,8 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -495,8 +500,8 @@ namespace Titanium.Web.Proxy.Helpers
/// </summary> /// </summary>
public override int WriteTimeout public override int WriteTimeout
{ {
get => BaseStream.WriteTimeout; get => baseStream.WriteTimeout;
set => BaseStream.WriteTimeout = value; set => baseStream.WriteTimeout = value;
} }
/// <summary> /// <summary>
...@@ -521,7 +526,7 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -521,7 +526,7 @@ namespace Titanium.Web.Proxy.Helpers
bool result = false; bool result = false;
try try
{ {
int readBytes = BaseStream.Read(streamBuffer, bufferLength, streamBuffer.Length - bufferLength); int readBytes = baseStream.Read(streamBuffer, bufferLength, streamBuffer.Length - bufferLength);
result = readBytes > 0; result = readBytes > 0;
if (result) if (result)
{ {
...@@ -571,7 +576,7 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -571,7 +576,7 @@ namespace Titanium.Web.Proxy.Helpers
bool result = false; bool result = false;
try try
{ {
int readBytes = await BaseStream.ReadAsync(streamBuffer, bufferLength, bytesToRead, cancellationToken); int readBytes = await baseStream.ReadAsync(streamBuffer, bufferLength, bytesToRead, cancellationToken);
result = readBytes > 0; result = readBytes > 0;
if (result) if (result)
{ {
...@@ -579,6 +584,11 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -579,6 +584,11 @@ namespace Titanium.Web.Proxy.Helpers
bufferLength += readBytes; bufferLength += readBytes;
} }
} }
catch
{
if (!swallowException)
throw;
}
finally finally
{ {
if (!result) if (!result)
...@@ -785,7 +795,7 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -785,7 +795,7 @@ namespace Titanium.Web.Proxy.Helpers
idx += newLineChars; idx += newLineChars;
} }
await BaseStream.WriteAsync(buffer, 0, idx, cancellationToken); await baseStream.WriteAsync(buffer, 0, idx, cancellationToken);
} }
finally finally
{ {
...@@ -802,7 +812,7 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -802,7 +812,7 @@ namespace Titanium.Web.Proxy.Helpers
idx += newLineChars; idx += newLineChars;
} }
await BaseStream.WriteAsync(buffer, 0, idx, cancellationToken); await baseStream.WriteAsync(buffer, 0, idx, cancellationToken);
} }
} }
...@@ -831,20 +841,20 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -831,20 +841,20 @@ namespace Titanium.Web.Proxy.Helpers
/// <param name="cancellationToken">The cancellation token.</param> /// <param name="cancellationToken">The cancellation token.</param>
internal async Task WriteAsync(byte[] data, bool flush = false, CancellationToken cancellationToken = default) internal async Task WriteAsync(byte[] data, bool flush = false, CancellationToken cancellationToken = default)
{ {
await BaseStream.WriteAsync(data, 0, data.Length, cancellationToken); await baseStream.WriteAsync(data, 0, data.Length, cancellationToken);
if (flush) if (flush)
{ {
await BaseStream.FlushAsync(cancellationToken); await baseStream.FlushAsync(cancellationToken);
} }
} }
internal async Task WriteAsync(byte[] data, int offset, int count, bool flush, internal async Task WriteAsync(byte[] data, int offset, int count, bool flush,
CancellationToken cancellationToken = default) CancellationToken cancellationToken = default)
{ {
await BaseStream.WriteAsync(data, offset, count, cancellationToken); await baseStream.WriteAsync(data, offset, count, cancellationToken);
if (flush) if (flush)
{ {
await BaseStream.FlushAsync(cancellationToken); await baseStream.FlushAsync(cancellationToken);
} }
} }
...@@ -985,7 +995,7 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -985,7 +995,7 @@ namespace Titanium.Web.Proxy.Helpers
remainingBytes -= bytesRead; remainingBytes -= bytesRead;
await BaseStream.WriteAsync(buffer, 0, bytesRead, cancellationToken); await baseStream.WriteAsync(buffer, 0, bytesRead, cancellationToken);
onCopy?.Invoke(buffer, 0, bytesRead); onCopy?.Invoke(buffer, 0, bytesRead);
} }
...@@ -1024,7 +1034,7 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -1024,7 +1034,7 @@ namespace Titanium.Web.Proxy.Helpers
/// <returns>A task that represents the asynchronous write operation.</returns> /// <returns>A task that represents the asynchronous write operation.</returns>
public override ValueTask WriteAsync(ReadOnlyMemory<byte> buffer, CancellationToken cancellationToken = default) public override ValueTask WriteAsync(ReadOnlyMemory<byte> buffer, CancellationToken cancellationToken = default)
{ {
return BaseStream.WriteAsync(buffer, cancellationToken); return baseStream.WriteAsync(buffer, cancellationToken);
} }
#else #else
/// <summary> /// <summary>
...@@ -1037,7 +1047,7 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -1037,7 +1047,7 @@ namespace Titanium.Web.Proxy.Helpers
{ {
var buf = ArrayPool<byte>.Shared.Rent(buffer.Length); var buf = ArrayPool<byte>.Shared.Rent(buffer.Length);
buffer.CopyTo(buf); buffer.CopyTo(buf);
return BaseStream.WriteAsync(buf, 0, buf.Length, cancellationToken); return baseStream.WriteAsync(buf, 0, buf.Length, cancellationToken);
} }
#endif #endif
} }
......
...@@ -99,7 +99,7 @@ namespace Titanium.Web.Proxy.Network.Tcp ...@@ -99,7 +99,7 @@ namespace Titanium.Web.Proxy.Network.Tcp
// This way we can push tcp Time_Wait to server side when possible. // This way we can push tcp Time_Wait to server side when possible.
await Task.Delay(1000); await Task.Delay(1000);
proxyServer.UpdateServerConnectionCount(false); proxyServer.UpdateServerConnectionCount(false);
Stream.BaseStream?.Dispose(); Stream.Dispose();
TcpClient.CloseSocket(); TcpClient.CloseSocket();
}); });
......
...@@ -152,11 +152,6 @@ namespace Titanium.Web.Proxy ...@@ -152,11 +152,6 @@ namespace Titanium.Web.Proxy
{ {
sslStream?.Dispose(); sslStream?.Dispose();
clientStream.Dispose(); clientStream.Dispose();
if (!cancellationTokenSource.IsCancellationRequested)
{
cancellationTokenSource.Cancel();
}
} }
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment