WebSocketConnectionHandler.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // <copyright>
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. // </copyright>
  4. namespace System.ServiceModel.Channels
  5. {
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Net;
  10. using System.Net.Http;
  11. using System.Runtime;
  12. using System.Threading;
  13. using System.Threading.Tasks;
  14. abstract class WebSocketConnectionHandler : HttpMessageHandler
  15. {
  16. protected internal virtual HttpResponseMessage AcceptWebSocket(HttpRequestMessage request, CancellationToken cancellationToken)
  17. {
  18. if (this.AcceptWebSocket(request))
  19. {
  20. return GetWebSocketAcceptedResponseMessage(request);
  21. }
  22. else
  23. {
  24. return GetUpgradeRequiredResponseMessage(request);
  25. }
  26. }
  27. protected internal virtual bool AcceptWebSocket(HttpRequestMessage request)
  28. {
  29. return true;
  30. }
  31. protected static HttpResponseMessage GetUpgradeRequiredResponseMessage(HttpRequestMessage request)
  32. {
  33. HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.UpgradeRequired);
  34. response.RequestMessage = request;
  35. return response;
  36. }
  37. protected static HttpResponseMessage GetBadRequestResponseMessage(HttpRequestMessage request)
  38. {
  39. HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.BadRequest);
  40. response.RequestMessage = request;
  41. return response;
  42. }
  43. protected static HttpResponseMessage GetWebSocketAcceptedResponseMessage(HttpRequestMessage request)
  44. {
  45. HttpResponseMessage message = new HttpResponseMessage(HttpStatusCode.SwitchingProtocols);
  46. message.RequestMessage = request;
  47. return message;
  48. }
  49. protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
  50. {
  51. if (request == null)
  52. {
  53. throw FxTrace.Exception.ArgumentNull("request");
  54. }
  55. return Task.Factory.StartNew(
  56. () => { return this.AcceptWebSocket(request, cancellationToken); },
  57. cancellationToken);
  58. }
  59. }
  60. }