public virtual WebResponse OnPreprocess(Session session, WebSocketRequest request) { return(null); }
public IEnumerable <WebRequest> OnReceiveData(ArraySegment <byte> data) { if (buffer == null) { buffer = data.ToArray(); } else { buffer = buffer.Concat(data).ToArray(); } // 이번 패킷에 대해서 아직 헤더 파싱 안됨 if (header == null) { header = WebSocketParser.Parse( new ArraySegment <byte>(buffer)); contentBuffer = new byte[] { }; var maxPayloadSize = session.server.config.maxWebSocketPayloadSize; // 들어온 데이터가 헤더 만들기 충분하지 않음 if (header == null) { yield break; } if (contentBuffer.Length + header.payloadLength >= maxPayloadSize) { throw new PayloadTooBigException(); } header.Validate(); buffer = buffer.Skip(header.payloadOffset).ToArray(); } // 버퍼가 헤더의 payload 길이보다 충분함 // -> 데이터 다 받은 경우 if (buffer.Length >= header.payloadLength) { var payload = buffer.Take(header.payloadLength); buffer = buffer.Skip(header.payloadLength).ToArray(); if (header.fin) { var request = new WebSocketRequest(); IEnumerable <byte> content = null; if (header.IsControlFrame()) { request.content = Decode(payload).ToArray(); } else { if (contentBuffer.Length > 0) { content = contentBuffer.Concat(payload); } else { content = payload; } request.content = Decode(content).ToArray(); } request.opcode = (OpCode)header.opcode; header = null; yield return(request); } else { contentBuffer = contentBuffer.Concat(payload).ToArray(); } if (buffer.Length > 0) { foreach (var request in OnReceiveData(new ArraySegment <byte>())) { yield return(request); } } } }
public virtual void OnPostprocess(Session session, WebSocketRequest request, WebResponse response) { }