MaxMessageSizeStream.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. //------------------------------------------------------------
  2. // Copyright (c) Microsoft Corporation. All rights reserved.
  3. //------------------------------------------------------------
  4. namespace System.ServiceModel.Channels
  5. {
  6. using System.IO;
  7. using System.ServiceModel;
  8. using System.Diagnostics;
  9. using System.ServiceModel.Diagnostics.Application;
  10. class MaxMessageSizeStream : DelegatingStream
  11. {
  12. long maxMessageSize;
  13. long totalBytesRead;
  14. long bytesWritten;
  15. public MaxMessageSizeStream(Stream stream, long maxMessageSize)
  16. : base(stream)
  17. {
  18. this.maxMessageSize = maxMessageSize;
  19. }
  20. public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state)
  21. {
  22. count = PrepareRead(count);
  23. return base.BeginRead(buffer, offset, count, callback, state);
  24. }
  25. public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state)
  26. {
  27. PrepareWrite(count);
  28. return base.BeginWrite(buffer, offset, count, callback, state);
  29. }
  30. public override int EndRead(IAsyncResult result)
  31. {
  32. return FinishRead(base.EndRead(result));
  33. }
  34. public override int Read(byte[] buffer, int offset, int count)
  35. {
  36. count = PrepareRead(count);
  37. return FinishRead(base.Read(buffer, offset, count));
  38. }
  39. public override int ReadByte()
  40. {
  41. PrepareRead(1);
  42. int i = base.ReadByte();
  43. if (i != -1)
  44. FinishRead(1);
  45. return i;
  46. }
  47. public override void Write(byte[] buffer, int offset, int count)
  48. {
  49. PrepareWrite(count);
  50. base.Write(buffer, offset, count);
  51. }
  52. public override void WriteByte(byte value)
  53. {
  54. PrepareWrite(1);
  55. base.WriteByte(value);
  56. }
  57. internal static Exception CreateMaxReceivedMessageSizeExceededException(long maxMessageSize)
  58. {
  59. string message = SR.GetString(SR.MaxReceivedMessageSizeExceeded, maxMessageSize);
  60. Exception inner = new QuotaExceededException(message);
  61. if (TD.MaxReceivedMessageSizeExceededIsEnabled())
  62. {
  63. TD.MaxReceivedMessageSizeExceeded(message);
  64. }
  65. return new CommunicationException(message, inner);
  66. }
  67. internal static Exception CreateMaxSentMessageSizeExceededException(long maxMessageSize)
  68. {
  69. string message = SR.GetString(SR.MaxSentMessageSizeExceeded, maxMessageSize);
  70. Exception inner = new QuotaExceededException(message);
  71. if (TD.MaxSentMessageSizeExceededIsEnabled())
  72. {
  73. TD.MaxSentMessageSizeExceeded(message);
  74. }
  75. return new CommunicationException(message, inner);
  76. }
  77. int PrepareRead(int bytesToRead)
  78. {
  79. if (totalBytesRead >= maxMessageSize)
  80. {
  81. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(CreateMaxReceivedMessageSizeExceededException(maxMessageSize));
  82. }
  83. long bytesRemaining = maxMessageSize - totalBytesRead;
  84. if (bytesRemaining > int.MaxValue)
  85. {
  86. return bytesToRead;
  87. }
  88. else
  89. {
  90. return Math.Min(bytesToRead, (int)(maxMessageSize - totalBytesRead));
  91. }
  92. }
  93. int FinishRead(int bytesRead)
  94. {
  95. totalBytesRead += bytesRead;
  96. return bytesRead;
  97. }
  98. void PrepareWrite(int bytesToWrite)
  99. {
  100. if (bytesWritten + bytesToWrite > maxMessageSize)
  101. {
  102. throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(CreateMaxSentMessageSizeExceededException(maxMessageSize));
  103. }
  104. bytesWritten += bytesToWrite;
  105. }
  106. }
  107. }