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