コード例 #1
0
        public async Task <FastcgiPacket> ReadFromAsync(Stream ClientStream)
        {
            var Header = new byte[8];
            await ClientStream.ReadAsync(Header, 0, Header.Length);

            var Version = Header[0];

            Type = (Fastcgi.PacketType)Header[1];
            //BitConverter.ToUInt16()
            RequestId = (ushort)((Header[2] << 8) | (Header[3] << 0));
            var ContentLength = (ushort)((Header[4] << 8) | (Header[5] << 0));
            var PaddingLength = Header[6];

            Content = new ArraySegment <byte>(new byte[ContentLength]);
            if (ContentLength + PaddingLength > 0)
            {
                await ClientStream.ReadAsync(Content.Array, 0, ContentLength);

                await ClientStream.ReadAsync(PaddingRead, 0, PaddingLength);
            }

            //await Console.Out.WriteLineAsync(String.Format("READ: Packet({0}): {1}({2}:{3})", RequestId, Type, ContentLength, PaddingLength));

            return(this);
        }
コード例 #2
0
        public async static Task WriteMemoryStreamToAsync(ushort RequestId, Fastcgi.PacketType PacketType, MemoryStream From, Stream ClientStream)
        {
            var Buffer           = From.GetBuffer();
            var BufferRealLength = (int)From.Length;

            for (int n = 0; n < BufferRealLength; n += ushort.MaxValue)
            {
                await new FastcgiPacket()
                {
                    RequestId = RequestId,
                    Type      = PacketType,
                    Content   = new ArraySegment <byte>(Buffer, n, Math.Min(ushort.MaxValue, BufferRealLength - n)),
                }.WriteToAsync(ClientStream);
            }
        }
コード例 #3
0
        public bool WritePacket(ushort RequestId, Fastcgi.PacketType Type, byte[] Contents, int ContentsOffset, int ContentsLength)
        {
            int PaddingLength = (8 - ContentsLength & 7) & 7;

            if (Debug)
            {
                Console.WriteLine("WritePacket(RequestId=" + RequestId + ", Type=" + Type + ", Contents=" + Contents.Length + ", Padding=" + PaddingLength + ")");
                if (Type == Fastcgi.PacketType.FCGI_STDOUT)
                {
                    Console.Write(Encoding.UTF8.GetString(Contents));
                }
            }

            Header[0] = 1;
            Header[1] = (byte)Type;
            Header[2] = (byte)((RequestId >> 8) & 0xFF);
            Header[3] = (byte)((RequestId >> 0) & 0xFF);
            Header[4] = (byte)((ContentsLength >> 8) & 0xFF);
            Header[5] = (byte)((ContentsLength >> 0) & 0xFF);
            Header[6] = (byte)PaddingLength;
            Header[7] = 0;

            try
            {
                FastcgiPipe.Write(Header, 0, 8);
                if (ContentsLength > 0)
                {
                    FastcgiPipe.Write(Contents, ContentsOffset, ContentsLength);
                }
                if (PaddingLength > 0)
                {
                    FastcgiPipe.Write(Padding, 0, PaddingLength);
                }
                return(true);
            }
            catch (Exception Exception)
            {
                if (Debug)
                {
                    Console.Error.WriteLine(Exception);
                }
                return(false);
            }
        }
コード例 #4
0
ファイル: FastcgiPacket.cs プロジェクト: soywiz/csharputils
		public async Task<FastcgiPacket> ReadFromAsync(Stream ClientStream)
		{
			var Header = new byte[8];
			await ClientStream.ReadAsync(Header, 0, Header.Length);
			var Version = Header[0];
			Type = (Fastcgi.PacketType)Header[1];
			//BitConverter.ToUInt16()
			RequestId = (ushort)((Header[2] << 8) | (Header[3] << 0));
			var ContentLength = (ushort)((Header[4] << 8) | (Header[5] << 0));
			var PaddingLength = Header[6];
			Content = new ArraySegment<byte>(new byte[ContentLength]);
			if (ContentLength + PaddingLength > 0)
			{
				await ClientStream.ReadAsync(Content.Array, 0, ContentLength);
				await ClientStream.ReadAsync(PaddingRead, 0, PaddingLength);
			}

			//await Console.Out.WriteLineAsync(String.Format("READ: Packet({0}): {1}({2}:{3})", RequestId, Type, ContentLength, PaddingLength));

			return this;
		}
コード例 #5
0
        bool Reader_HandlePacket(Fastcgi.PacketType Type, ushort RequestId, byte[] Content)
        {
            var Request = GetOrCreateFastcgiRequest(RequestId);

            if (Debug)
            {
                Console.WriteLine("Handling Packet (" + Type + ")");
            }

            switch (Type)
            {
            case Fastcgi.PacketType.FCGI_BEGIN_REQUEST:
                var Role  = (Fastcgi.Role)(Content[0] | (Content[1] << 8));
                var Flags = (Fastcgi.Flags)(Content[2]);
                break;

            case Fastcgi.PacketType.FCGI_PARAMS:
                if (Content.Length == 0)
                {
                    Request.ParamsStream.Finalized = true;
                }
                else
                {
                    Request.ParamsStream.Write(Content, 0, Content.Length);
                }
                break;

            case Fastcgi.PacketType.FCGI_STDIN:
                if (Content.Length == 0)
                {
                    Request.StdinStream.Finalized = true;
                    Request.FinalizedRequest      = true;
                }
                else
                {
                    Request.StdinStream.Write(Content, 0, Content.Length);
                }
                break;

            default:
                Console.Error.WriteLine("Unhandled packet type: '" + Type + "'");
                //throw (new Exception("Unhandled packet type: '" + Type + "'"));
                break;
            }

            if (Debug)
            {
                Console.WriteLine("     : FinalizedRequest(" + Request.FinalizedRequest + ")");
            }

            if (Request.ParamsStream.Finalized && Request.Processing == false)
            {
                Request.Processing = true;
                ThreadPool.QueueUserWorkItem(HandleRequest, Request);
            }


            if (Request.FinalizedRequest)
            {
                return(false);
            }
            else
            {
                return(true);
            }
        }
コード例 #6
0
        public bool ReadPacket()
        {
            byte[]             Content   = null;
            Fastcgi.PacketType Type      = Fastcgi.PacketType.FCGI_UNKNOWN_TYPE;
            ushort             RequestId = 0;

            try
            {
                int Readed = FastcgiPipe.Read(Header, 0, 8);
                if (Readed != 8)
                {
                    Console.WriteLine("Header not completed");
                    return(false);
                }

                var Version = Header[0];
                Type      = (Fastcgi.PacketType)Header[1];
                RequestId = (ushort)((Header[2] << 8) | (Header[3] << 0));
                var ContentLength = (Header[4] << 8) | (Header[5] << 0);
                var PaddingLength = Header[6];

                if (Version != 1)
                {
                    Console.Error.WriteLine("Unknown Version " + Version);
                    return(false);
                }

                Content = new byte[ContentLength];

                if (Debug)
                {
                    Console.WriteLine("ReadPacket(Version={0}, Type={1}, RequestId={2}, ContentLength={3}, PaddingLength={4})", Version, Type, RequestId, ContentLength, PaddingLength);
                }

                if (ContentLength > 0)
                {
                    Readed = FastcgiPipe.Read(Content, 0, ContentLength);
                    if (Readed != ContentLength)
                    {
                        Console.WriteLine("Content not completed");
                        return(false);
                    }
                }
                if (PaddingLength > 0)
                {
                    Readed = FastcgiPipe.Read(Padding, 0, PaddingLength);
                    if (Readed != PaddingLength)
                    {
                        Console.WriteLine("Padding not completed");
                        return(false);
                    }
                }
            }
            catch (Exception Exception)
            {
                if (Debug)
                {
                    Console.Error.WriteLine(Exception);
                    return(false);
                }
            }

            if (HandlePacket != null)
            {
                if (Debug)
                {
                    Console.WriteLine("Calling HandlePacket");
                }
                return(HandlePacket(Type, RequestId, Content));
            }

            return(true);
        }
コード例 #7
0
		public FascgiResponseOutputStream(FastcgiRequest FastcgiRequest, Fastcgi.PacketType PacketType)
		{
			this.FastcgiRequest = FastcgiRequest;
			this.PacketType = PacketType;
			this.Buffer = new MemoryStream();
		}
コード例 #8
0
 public FascgiResponseOutputStream(FastcgiRequest FastcgiRequest, Fastcgi.PacketType PacketType)
 {
     this.FastcgiRequest = FastcgiRequest;
     this.PacketType     = PacketType;
     this.Buffer         = new MemoryStream();
 }