コード例 #1
0
 public virtual WebResponse OnPreprocess(Session session, WebSocketRequest request)
 {
     return(null);
 }
コード例 #2
0
        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);
                    }
                }
            }
        }
コード例 #3
0
 public virtual void OnPostprocess(Session session, WebSocketRequest request, WebResponse response)
 {
 }