WebSocketSecKey3ReceiveFilter.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using SuperSocket.Common;
  6. using SuperSocket.SocketBase;
  7. using SuperSocket.SocketBase.Command;
  8. namespace SuperWebSocket.Protocol
  9. {
  10. class WebSocketSecKey3ReceiveFilter : WebSocketReceiveFilterBase
  11. {
  12. public WebSocketSecKey3ReceiveFilter(WebSocketReceiveFilterBase prevFilter)
  13. : base(prevFilter)
  14. {
  15. }
  16. public override IWebSocketFragment Filter(byte[] readBuffer, int offset, int length, bool isReusableBuffer, out int rest)
  17. {
  18. var webSocketSession = Session;
  19. int total = BufferSegments.Count + length;
  20. if (total == SecKey3Len)
  21. {
  22. byte[] key = new byte[SecKey3Len];
  23. BufferSegments.CopyTo(key);
  24. Array.Copy(readBuffer, offset, key, BufferSegments.Count, length);
  25. webSocketSession.Items[WebSocketConstant.SecWebSocketKey3] = key;
  26. BufferSegments.ClearSegements();
  27. rest = 0;
  28. if(Handshake(webSocketSession.AppServer.WebSocketProtocolProcessor, webSocketSession))
  29. return HandshakeRequestInfo;
  30. }
  31. else if (total > SecKey3Len)
  32. {
  33. byte[] key = new byte[8];
  34. BufferSegments.CopyTo(key);
  35. Array.Copy(readBuffer, offset, key, BufferSegments.Count, SecKey3Len - BufferSegments.Count);
  36. webSocketSession.Items[WebSocketConstant.SecWebSocketKey3] = key;
  37. BufferSegments.ClearSegements();
  38. rest = total - SecKey3Len;
  39. if(Handshake(webSocketSession.AppServer.WebSocketProtocolProcessor, webSocketSession))
  40. return HandshakeRequestInfo;
  41. }
  42. else
  43. {
  44. AddArraySegment(readBuffer, offset, length, isReusableBuffer);
  45. rest = 0;
  46. NextReceiveFilter = this;
  47. return null;
  48. }
  49. return null;
  50. }
  51. }
  52. }