Exemple #1
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);
			}
		}
		public bool WritePacketEndRequest(ushort RequestId, int AppStatus, Fastcgi.ProtocolStatus ProtocolStatus)
		{
            TempContents[0] = (byte)((AppStatus >> 24) & 0xFF);
            TempContents[1] = (byte)((AppStatus >> 16) & 0xFF);
            TempContents[2] = (byte)((AppStatus >> 8) & 0xFF);
            TempContents[3] = (byte)((AppStatus >> 0) & 0xFF);
            TempContents[4] = (byte)(ProtocolStatus);
            TempContents[5] = 0;
            TempContents[6] = 0;
            TempContents[7] = 0;

            if (Debug)
            {
                Console.WriteLine("WritePacketEndRequest(" + TempContents.Implode(",") + ")");
            }

            return WritePacket(RequestId, Fastcgi.PacketType.FCGI_END_REQUEST, TempContents, 0, 8);
		}
		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;
            }
		}
		public FascgiResponseOutputStream(FastcgiRequest FastcgiRequest, Fastcgi.PacketType PacketType)
		{
			this.FastcgiRequest = FastcgiRequest;
			this.PacketType = PacketType;
			this.Buffer = new MemoryStream();
		}
Exemple #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;
			}
		}