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