private void ResponseHeader(PipeStream pipeStream) { if (Request.Server.EnableLog(BeetleX.EventArgs.LogType.Info)) { Request.Server.Log(BeetleX.EventArgs.LogType.Info, $"gateway {Request.RemoteIPAddress} {Request.Method} {Request.Url} request {Server.Host}:{Server.Port} netstream receiving"); } PipeStream agentStream = GetRequestStream(); if (Status == RequestStatus.RespondingHeader) { var indexof = pipeStream.IndexOf(HeaderTypeFactory.LINE_BYTES); while (indexof.End != null) { pipeStream.Read(mBuffer, 0, indexof.Length); if (indexof.Length == 2) { if (Request.VersionNumber == "1.0" && Request.KeepAlive) { agentStream.Write(Gateway.KEEP_ALIVE, 0, Gateway.KEEP_ALIVE.Length); } UrlRoute.Pluginer.HeaderWriting(Request, Response, mResultHeader); mResultHeader.Write(agentStream); agentStream.Write(mBuffer, 0, indexof.Length); Status = RequestStatus.RespondingBody; if (Request.Server.EnableLog(BeetleX.EventArgs.LogType.Info)) { Request.Server.Log(BeetleX.EventArgs.LogType.Info, $"gateway {Request.RemoteIPAddress} {Request.Method} {Request.Url} request {Server.Host}:{Server.Port} netstream header received"); } return; } else { var header = HttpParse.AnalyzeHeader(new ReadOnlySpan <byte>(mBuffer, 0, indexof.Length - 2)); if (string.Compare(header.Item1, HeaderTypeFactory.TRANSFER_ENCODING, true) == 0 && string.Compare(header.Item2, "chunked", true) == 0) { mTransferEncoding = true; } if (string.Compare(header.Item1, HeaderTypeFactory.CONTENT_LENGTH, true) == 0) { mRequestLength = int.Parse(header.Item2); } if (string.Compare(header.Item1, HeaderTypeFactory.SERVER, true) == 0) { //agentStream.Write(Gateway.GATEWAY_SERVER_HEDER, 0, Gateway.GATEWAY_SERVER_HEDER.Length); mResultHeader.Add(HeaderTypeFactory.SERVER, "Bumblebee(BeetleX)"); } else { mResultHeader.Add(header.Item1, header.Item2); //if (UrlRoute.Gateway.OnHeaderWriting(Request, Response, agentStream, Server, header.Item1, header.Item2)) //{ // agentStream.Write(mBuffer, 0, indexof.Length); //} } } indexof = pipeStream.IndexOf(HeaderTypeFactory.LINE_BYTES); } } }
private void ResponseHeader(PipeStream pipeStream) { if (Status == RequestStatus.RespondingHeader) { var indexof = pipeStream.IndexOf(HeaderTypeFactory.LINE_BYTES); while (indexof.End != null) { pipeStream.Read(mBuffer, 0, indexof.Length); if (indexof.Length == 2) { Status = RequestStatus.RespondingBody; return; } else { var header = HttpParse.AnalyzeHeader(new ReadOnlySpan <byte>(mBuffer, 0, indexof.Length - 2)); Header.Add(new Property { Name = header.Item1, Value = header.Item2 }); if (string.Compare(header.Item1, HeaderTypeFactory.TRANSFER_ENCODING, true) == 0 && string.Compare(header.Item2, "chunked", true) == 0) { mTransferEncoding = true; } if (string.Compare(header.Item1, HeaderTypeFactory.CONTENT_LENGTH, true) == 0) { mRequestLength = int.Parse(header.Item2); } } indexof = pipeStream.IndexOf(HeaderTypeFactory.LINE_BYTES); } } }
private void OnReadResponseHeader(PipeStream pipeStream) { if (Request.Server.EnableLog(BeetleX.EventArgs.LogType.Info)) { Request.Server.Log(BeetleX.EventArgs.LogType.Info, $"Gateway {Request.ID} {Request.RemoteIPAddress} {Request.Method} {Request.Url} -> {Server.Host}:{Server.Port} response stream reading"); } PipeStream agentStream = GetRequestStream(); if (Status == RequestStatus.RespondingHeader) { mClientAgent.Status = TcpClientAgentStatus.ResponseReciveHeader; var indexof = pipeStream.IndexOf(HeaderTypeFactory.LINE_BYTES); while (indexof.End != null) { pipeStream.Read(mBuffer, 0, indexof.Length); if (indexof.Length == 2) { if (Request.VersionNumber == "1.0" && Request.KeepAlive) { agentStream.Write(Gateway.KEEP_ALIVE, 0, Gateway.KEEP_ALIVE.Length); } UrlRoute.Pluginer.HeaderWriting(Request, Response, mResponseHeader); mResponseHeader.Write(agentStream); if (Server.Gateway.OutputServerAddress) { agentStream.Write("Logic-Server: " + Server.ServerName + "\r\n"); } agentStream.Write(mBuffer, 0, indexof.Length); Status = RequestStatus.RespondingBody; if (Request.Server.EnableLog(BeetleX.EventArgs.LogType.Info)) { Request.Server.Log(BeetleX.EventArgs.LogType.Info, $"gateway {Request.ID} {Request.RemoteIPAddress} {Request.Method} {Request.Url} -> {Server.Host}:{Server.Port} response stream read header "); } return; } else { var header = HttpParse.AnalyzeHeader(new ReadOnlySpan <byte>(mBuffer, 0, indexof.Length - 2)); if (string.Compare(header.Item1, HeaderTypeFactory.TRANSFER_ENCODING, true) == 0 && string.Compare(header.Item2, "chunked", true) == 0) { mTransferEncoding = true; } if (string.Compare(header.Item1, HeaderTypeFactory.CONTENT_LENGTH, true) == 0) { mRequestLength = int.Parse(header.Item2); } if (string.Compare(header.Item1, HeaderTypeFactory.SERVER, true) == 0) { mResponseHeader.Add(HeaderTypeFactory.SERVER, "Bumblebee(BeetleX)"); } else { mResponseHeader.Add(header.Item1, header.Item2); } } indexof = pipeStream.IndexOf(HeaderTypeFactory.LINE_BYTES); } } }
private void ResponseHeader(PipeStream pipeStream) { PipeStream agentStream = GetRequestStream(); if (Status == RequestStatus.RespondingHeader) { var indexof = pipeStream.IndexOf(HeaderTypeFactory.LINE_BYTES); while (indexof.End != null) { pipeStream.Read(mBuffer, 0, indexof.Length); if (indexof.Length == 2) { if (Request.VersionNumber == "1.0" && Request.KeepAlive) { agentStream.Write(Gateway.KEEP_ALIVE, 0, Gateway.KEEP_ALIVE.Length); } UrlRoute.Gateway.OnHeaderWrited(Request, Response, agentStream, Server); agentStream.Write(mBuffer, 0, indexof.Length); Status = RequestStatus.RespondingBody; return; } else { var header = HttpParse.AnalyzeHeader(new ReadOnlySpan <byte>(mBuffer, 0, indexof.Length - 2)); if (string.Compare(header.Item1, HeaderTypeFactory.TRANSFER_ENCODING, true) == 0 && string.Compare(header.Item2, "chunked", true) == 0) { mTransferEncoding = true; } if (string.Compare(header.Item1, HeaderTypeFactory.CONTENT_LENGTH, true) == 0) { mRequestLength = int.Parse(header.Item2); } if (string.Compare(header.Item1, HeaderTypeFactory.SERVER, true) == 0) { agentStream.Write(Gateway.GATEWAY_SERVER_HEDER, 0, Gateway.GATEWAY_SERVER_HEDER.Length); } else { if (UrlRoute.Gateway.OnHeaderWriting(Request, Response, agentStream, Server, header.Item1, header.Item2)) { agentStream.Write(mBuffer, 0, indexof.Length); } } } indexof = pipeStream.IndexOf(HeaderTypeFactory.LINE_BYTES); } } }
public bool Read(PipeStream stream) { while (stream.TryReadLine(out string line)) { if (string.IsNullOrEmpty(line)) { return(true); } if (Code == null) { var result = HttpParse.AnalyzeResponseLine(line.AsSpan()); Code = result.Item2; HttpVersion = result.Item1; Message = result.Item3; } else { var header = HttpParse.AnalyzeHeader(line.AsSpan()); Headers[header.Item1] = header.Item2; } } return(false); }