You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

48 lines
1.5 KiB

4 years ago
4 years ago
  1. #if !NET20
  2. using System;
  3. namespace Apewer.WebSocket
  4. {
  5. internal class HandlerFactory
  6. {
  7. public static ComposableHandler BuildHandler(HttpRequest request, Action<string> onMessage, Action onClose, Action<byte[]> onBytes, Action<byte[]> onPing, Action<byte[]> onPong)
  8. {
  9. var version = GetVersion(request);
  10. switch (version)
  11. {
  12. case "76":
  13. return Draft76Handler.Create(request, onMessage);
  14. case "7":
  15. case "8":
  16. case "13":
  17. return Hybi13Handler.Create(request, onMessage, onClose, onBytes, onPing, onPong);
  18. case "policy-file-request":
  19. return FlashSocketPolicyRequestHandler.Create(request);
  20. }
  21. throw new WebSocketException(StatusCodes.UnsupportedDataType);
  22. }
  23. public static string GetVersion(HttpRequest request)
  24. {
  25. string version;
  26. if (request.Headers.TryGetValue("Sec-WebSocket-Version", out version))
  27. return version;
  28. if (request.Headers.TryGetValue("Sec-WebSocket-Draft", out version))
  29. return version;
  30. if (request.Headers.ContainsKey("Sec-WebSocket-Key1"))
  31. return "76";
  32. if ((request.Body != null) && request.Body.ToLower().Contains("policy-file-request"))
  33. return "policy-file-request";
  34. return "75";
  35. }
  36. }
  37. }
  38. #endif