Example #1
0
 public FastCGIConnection(FastCGIServer owner, TcpSocket socket)
 {
     _owner          = owner;
     _receiveState   = ReceiveState.Header;
     _socket         = socket;
     _socket.NoDelay = true;
     _socket.ReceiveBuffer(new ArraySegment <byte>(_headerBuffer));
     _socket.OnData += OnData;
     _socket.ReceiveStart();
 }
Example #2
0
        private void OnData(TcpSocket sender, ArraySegment <byte> data)
        {
            switch (_receiveState)
            {
            case ReceiveState.Header:
                if (_headerBuffer[0] != FCGI_VERSION_1)
                {
                    _socket.Destroy();
                    return;
                }
                var contentLength = _headerBuffer[4] << 8 | _headerBuffer[5];
                if (contentLength == 0)
                {
                    data = new ArraySegment <byte>(BufferData.EmptyBytes);
                    goto case ReceiveState.Body;
                }
                else
                {
                    _socket.ReceiveBuffer(new ArraySegment <byte>(new byte[contentLength]));
                    _receiveState = ReceiveState.Body;
                }
                break;

            case ReceiveState.Body:
                try {
                    var type      = (RecordType)_headerBuffer[1];
                    var requestId = (_headerBuffer[2] << 8) | _headerBuffer[3];
                    OnRecordReceived(type, requestId, data);
                }
                catch {
                    _socket.Destroy();
                    _socket = null;
                    return;
                }

                _receiveSkip = _headerBuffer[6];
                if (_receiveSkip > 0)
                {
                    data          = new ArraySegment <byte>();
                    _receiveState = ReceiveState.Padding;
                    goto case ReceiveState.Padding;
                }
                else
                {
                    _receiveState = ReceiveState.Header;
                    _socket.ReceiveBuffer(new ArraySegment <byte>(_headerBuffer));
                }
                break;

            case ReceiveState.Padding:
                _receiveSkip -= data.Count;
                if (_receiveSkip > 0)
                {
                    var len = Math.Min(_headerBuffer.Length, _receiveSkip);
                    _socket.ReceiveBuffer(new ArraySegment <byte>(_headerBuffer, 0, len));
                }
                else
                {
                    _receiveState = ReceiveState.Header;
                    _socket.ReceiveBuffer(new ArraySegment <byte>(_headerBuffer));
                }
                break;
            }
        }