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(); }
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; } }