Exemple #1
0
        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);
                }
            }
        }
Exemple #2
0
 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);
         }
     }
 }
Exemple #3
0
        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);
                }
            }
        }
Exemple #4
0
        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);
                }
            }
        }
Exemple #5
0
 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);
 }