Ejemplo n.º 1
0
        /// <summary>
        /// Tries to read and handle a <see cref="Record"/> from inputStream and writes responses to outputStream.
        /// </summary>
        /// <remarks>
        /// Use <see cref="ProcessStream"/> to process all records on a stream.
        /// Returns true if a record was read, false otherwise.
        /// </remarks>
        public bool ProcessSingleRecord(Stream inputStream, Stream outputStream)
        {
            if (!inputStream.CanRead)
            {
                return(false);
            }

            Record r = Record.ReadRecord(inputStream);

            // No record found on the stream?
            if (r == null)
            {
                return(false);
            }

            if (r.Type == Record.RecordType.BeginRequest)
            {
                if (OpenRequests.ContainsKey(r.RequestId))
                {
                    OpenRequests.Remove(r.RequestId);
                }

                var content = new MemoryStream(r.ContentData);

                var role = Record.ReadInt16(content);
                // Todo: Refuse requests for other roles than FCGI_RESPONDER

                var flags     = content.ReadByte();
                var keepAlive = (flags & Constants.FCGI_KEEP_CONN) != 0;
                var request   = new Request(r.RequestId, outputStream, this, keepAlive: keepAlive);
                OpenRequests.Add(request.RequestId, request);
            }
            else if (r.Type == Record.RecordType.AbortRequest || r.Type == Record.RecordType.EndRequest)
            {
                OpenRequests.Remove(r.RequestId);
            }
            else if (r.Type == Record.RecordType.GetValues)
            {
                var getValuesResult = Record.CreateGetValuesResult(1, 1, false);
                getValuesResult.Send(outputStream);
            }
            else
            {
                if (OpenRequests.ContainsKey(r.RequestId))
                {
                    var  request      = OpenRequests[r.RequestId];
                    bool requestReady = request.HandleRecord(r);
                    if (requestReady)
                    {
                        var evh = OnRequestReceived;
                        if (evh != null)
                        {
                            OnRequestReceived(this, request);
                        }
                    }
                }
            }

            return(true);
        }