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); }
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 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 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; }
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); } }
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); }
public FascgiResponseOutputStream(FastcgiRequest FastcgiRequest, Fastcgi.PacketType PacketType) { this.FastcgiRequest = FastcgiRequest; this.PacketType = PacketType; this.Buffer = new MemoryStream(); }