优化代理请求解析
This commit is contained in:
parent
849058bd9f
commit
65b5f8aa35
@ -26,56 +26,77 @@ namespace FastGithub.HttpServer.TcpMiddlewares
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task InvokeAsync(ConnectionDelegate next, ConnectionContext context)
|
public async Task InvokeAsync(ConnectionDelegate next, ConnectionContext context)
|
||||||
{
|
{
|
||||||
var result = await context.Transport.Input.ReadAsync();
|
var input = context.Transport.Input;
|
||||||
var httpRequest = this.GetHttpRequestHandler(result, out var consumed);
|
var output = context.Transport.Output;
|
||||||
|
var request = new HttpRequestHandler();
|
||||||
|
|
||||||
// 协议错误
|
while (context.ConnectionClosed.IsCancellationRequested == false)
|
||||||
if (consumed == 0L)
|
|
||||||
{
|
{
|
||||||
await context.Transport.Output.WriteAsync(this.http400, context.ConnectionClosed);
|
var result = await input.ReadAsync();
|
||||||
}
|
if (result.IsCanceled)
|
||||||
else
|
|
||||||
{
|
|
||||||
// 隧道代理连接请求
|
|
||||||
if (httpRequest.ProxyProtocol == ProxyProtocol.TunnelProxy)
|
|
||||||
{
|
{
|
||||||
var position = result.Buffer.GetPosition(consumed);
|
break;
|
||||||
context.Transport.Input.AdvanceTo(position);
|
|
||||||
await context.Transport.Output.WriteAsync(this.http200, context.ConnectionClosed);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var position = result.Buffer.Start;
|
|
||||||
context.Transport.Input.AdvanceTo(position);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
context.Features.Set<IHttpProxyFeature>(httpRequest);
|
try
|
||||||
await next(context);
|
{
|
||||||
|
if (this.ParseRequest(result, request, out var consumed))
|
||||||
|
{
|
||||||
|
if (request.ProxyProtocol == ProxyProtocol.TunnelProxy)
|
||||||
|
{
|
||||||
|
input.AdvanceTo(consumed);
|
||||||
|
await output.WriteAsync(this.http200, context.ConnectionClosed);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
input.AdvanceTo(result.Buffer.Start);
|
||||||
|
}
|
||||||
|
|
||||||
|
context.Features.Set<IHttpProxyFeature>(request);
|
||||||
|
await next(context);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
input.AdvanceTo(result.Buffer.Start, result.Buffer.End);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result.IsCompleted)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
await output.WriteAsync(this.http400, context.ConnectionClosed);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取http请求处理者
|
/// 解析http请求
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="result"></param>
|
/// <param name="result"></param>
|
||||||
|
/// <param name="requestHandler"></param>
|
||||||
/// <param name="consumed"></param>
|
/// <param name="consumed"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
private HttpRequestHandler GetHttpRequestHandler(ReadResult result, out long consumed)
|
private bool ParseRequest(ReadResult result, HttpRequestHandler request, out SequencePosition consumed)
|
||||||
{
|
{
|
||||||
var handler = new HttpRequestHandler();
|
|
||||||
var reader = new SequenceReader<byte>(result.Buffer);
|
var reader = new SequenceReader<byte>(result.Buffer);
|
||||||
|
if (this.httpParser.ParseRequestLine(request, ref reader) &&
|
||||||
if (this.httpParser.ParseRequestLine(handler, ref reader) &&
|
this.httpParser.ParseHeaders(request, ref reader))
|
||||||
this.httpParser.ParseHeaders(handler, ref reader))
|
|
||||||
{
|
{
|
||||||
consumed = reader.Consumed;
|
consumed = reader.Position;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
consumed = 0L;
|
consumed = default;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
return handler;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user