StreamSecurityUpgradeAcceptorBase.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //-----------------------------------------------------------------------------
  4. namespace System.ServiceModel.Channels
  5. {
  6. using System.IO;
  7. using System.Runtime.Diagnostics;
  8. using System.ServiceModel.Security;
  9. abstract class StreamSecurityUpgradeAcceptorBase : StreamSecurityUpgradeAcceptor
  10. {
  11. SecurityMessageProperty remoteSecurity;
  12. bool securityUpgraded;
  13. string upgradeString;
  14. EventTraceActivity eventTraceActivity;
  15. protected StreamSecurityUpgradeAcceptorBase(string upgradeString)
  16. {
  17. this.upgradeString = upgradeString;
  18. }
  19. internal EventTraceActivity EventTraceActivity
  20. {
  21. get
  22. {
  23. if (this.eventTraceActivity == null)
  24. {
  25. this.eventTraceActivity = EventTraceActivity.GetFromThreadOrCreate();
  26. }
  27. return this.eventTraceActivity;
  28. }
  29. }
  30. public override Stream AcceptUpgrade(Stream stream)
  31. {
  32. if (stream == null)
  33. {
  34. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("stream");
  35. }
  36. Stream result = this.OnAcceptUpgrade(stream, out this.remoteSecurity);
  37. this.securityUpgraded = true;
  38. return result;
  39. }
  40. public override IAsyncResult BeginAcceptUpgrade(Stream stream, AsyncCallback callback, object state)
  41. {
  42. if (stream == null)
  43. {
  44. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("stream");
  45. }
  46. return this.OnBeginAcceptUpgrade(stream, callback, state);
  47. }
  48. public override bool CanUpgrade(string contentType)
  49. {
  50. if (this.securityUpgraded)
  51. {
  52. return false;
  53. }
  54. return (contentType == this.upgradeString);
  55. }
  56. public override Stream EndAcceptUpgrade(IAsyncResult result)
  57. {
  58. if (result == null)
  59. {
  60. throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("result");
  61. }
  62. Stream retValue = this.OnEndAcceptUpgrade(result, out this.remoteSecurity);
  63. this.securityUpgraded = true;
  64. return retValue;
  65. }
  66. public override SecurityMessageProperty GetRemoteSecurity()
  67. {
  68. // this could be null if upgrade not completed.
  69. return this.remoteSecurity;
  70. }
  71. protected abstract Stream OnAcceptUpgrade(Stream stream, out SecurityMessageProperty remoteSecurity);
  72. protected abstract IAsyncResult OnBeginAcceptUpgrade(Stream stream, AsyncCallback callback, object state);
  73. protected abstract Stream OnEndAcceptUpgrade(IAsyncResult result,
  74. out SecurityMessageProperty remoteSecurity);
  75. }
  76. }