Skip to content

Commit cb2c244

Browse files
afifi-insmconnew
authored andcommitted
Update XmlMtomWriter and Stream Formatter
1 parent 573bd76 commit cb2c244

File tree

2 files changed

+29
-118
lines changed

2 files changed

+29
-118
lines changed

src/System.ServiceModel.Primitives/src/Internals/System/Xml/XmlMtomWriter.cs

Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,25 @@ public override void WriteValue(IStreamProvider value)
286286
Writer.WriteValue(value);
287287
}
288288

289+
public override Task WriteValueAsync(IStreamProvider value)
290+
{
291+
if (value == null)
292+
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("value"));
293+
294+
if (Writer.WriteState == WriteState.Element)
295+
{
296+
if (_binaryDataChunks == null)
297+
{
298+
_binaryDataChunks = new List<MtomBinaryData>();
299+
_contentID = GenerateUriForMimePart((_mimeParts == null) ? 1 : _mimeParts.Count + 1);
300+
}
301+
_binaryDataChunks.Add(new MtomBinaryData(value));
302+
return Task.CompletedTask;
303+
}
304+
else
305+
return Task.FromResult(Writer.WriteValueAsync(value));
306+
}
307+
289308
public override void WriteBase64(byte[] buffer, int index, int count)
290309
{
291310
if (Writer.WriteState == WriteState.Element)
@@ -488,9 +507,7 @@ private void WriteXOPBinaryParts()
488507
{
489508
WriteMimeHeaders(part.contentID, part.contentType, part.contentTransferEncoding);
490509
Stream s = _mimeWriter.GetContentStream();
491-
int blockSize = 256;
492-
int bytesRead = 0;
493-
byte[] block = new byte[blockSize];
510+
int bufferSize = 65536;
494511
Stream stream = null;
495512
foreach (MtomBinaryData data in part.binaryData)
496513
{
@@ -499,20 +516,9 @@ private void WriteXOPBinaryParts()
499516
stream = data.provider.GetStream();
500517
if (stream == null)
501518
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new XmlException(SRP.XmlInvalidStream));
502-
while (true)
503-
{
504-
bytesRead = stream.Read(block, 0, blockSize);
505-
if (bytesRead > 0)
506-
s.Write(block, 0, bytesRead);
507-
else
508-
break;
509-
if (blockSize < 65536 && bytesRead == blockSize)
510-
{
511-
blockSize = blockSize * 16;
512-
block = new byte[blockSize];
513-
}
514-
}
515519

520+
stream.CopyTo(s, bufferSize);
521+
516522
data.provider.ReleaseStream(stream);
517523
}
518524
else
@@ -540,9 +546,7 @@ private async Task WriteXOPBinaryPartsAsync()
540546
{
541547
await WriteMimeHeadersAsync(part.contentID, part.contentType, part.contentTransferEncoding);
542548
Stream s = await _mimeWriter.GetContentStreamAsync();
543-
int blockSize = 256;
544-
int bytesRead = 0;
545-
byte[] block = new byte[blockSize];
549+
int bufferSize = 65536;
546550
Stream stream = null;
547551
foreach (MtomBinaryData data in part.binaryData)
548552
{
@@ -551,25 +555,14 @@ private async Task WriteXOPBinaryPartsAsync()
551555
stream = data.provider.GetStream();
552556
if (stream == null)
553557
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new XmlException(SRP.XmlInvalidStream));
554-
while (true)
555-
{
556-
bytesRead = stream.Read(block, 0, blockSize);
557-
if (bytesRead > 0)
558-
s.Write(block, 0, bytesRead);
559-
else
560-
break;
561-
if (blockSize < 65536 && bytesRead == blockSize)
562-
{
563-
blockSize = blockSize * 16;
564-
block = new byte[blockSize];
565-
}
566-
}
558+
559+
await stream.CopyToAsync(s, bufferSize);
567560

568561
data.provider.ReleaseStream(stream);
569562
}
570563
else
571564
{
572-
s.Write(data.chunk, 0, data.chunk.Length);
565+
await s.WriteAsync(data.chunk, 0, data.chunk.Length);
573566
}
574567
}
575568
}

src/System.ServiceModel.Primitives/src/System/ServiceModel/Dispatcher/StreamFormatter.cs

Lines changed: 3 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,15 @@ internal void Serialize(XmlDictionaryWriter writer, object[] parameters, object
5757
{
5858
Stream streamValue = GetStreamAndWriteStartWrapperIfNecessary(writer, parameters, returnValue);
5959
var streamProvider = new OperationStreamProvider(streamValue);
60-
StreamFormatterHelper.WriteValue(writer, streamProvider);
60+
writer.WriteValue(streamProvider);
6161
WriteEndWrapperIfNecessary(writer);
6262
}
6363

6464
internal async Task SerializeAsync(XmlDictionaryWriter writer, object[] parameters, object returnValue)
6565
{
6666
Stream streamValue = await GetStreamAndWriteStartWrapperIfNecessaryAsync(writer, parameters, returnValue);
6767
var streamProvider = new OperationStreamProvider(streamValue);
68-
await StreamFormatterHelper.WriteValueAsync(writer, streamProvider);
68+
await writer.WriteValueAsync(streamProvider);
6969
await WriteEndWrapperIfNecessaryAsync(writer);
7070
}
7171

@@ -451,7 +451,7 @@ public override long Length
451451
public override void Write(byte[] buffer, int offset, int count) { throw TraceUtility.ThrowHelperError(new NotSupportedException(), _message); }
452452
}
453453

454-
internal class OperationStreamProvider
454+
internal class OperationStreamProvider : IStreamProvider
455455
{
456456
private Stream _stream;
457457

@@ -469,87 +469,5 @@ public void ReleaseStream(Stream stream)
469469
//Noop
470470
}
471471
}
472-
473-
internal class StreamFormatterHelper
474-
{
475-
// The method was duplicated from the desktop implementation of
476-
// System.Xml.XmlDictionaryWriter.WriteValue(IStreamProvider)
477-
public static void WriteValue(XmlDictionaryWriter writer, OperationStreamProvider value)
478-
{
479-
if (value == null)
480-
{
481-
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException(nameof(value)));
482-
}
483-
484-
Stream stream = value.GetStream();
485-
if (stream == null)
486-
{
487-
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new XmlException(SRP.Format(SRP.XmlInvalidStream)));
488-
}
489-
490-
int blockSize = 256;
491-
int bytesRead = 0;
492-
byte[] block = new byte[blockSize];
493-
while (true)
494-
{
495-
bytesRead = stream.Read(block, 0, blockSize);
496-
if (bytesRead > 0)
497-
{
498-
writer.WriteBase64(block, 0, bytesRead);
499-
}
500-
else
501-
{
502-
break;
503-
}
504-
505-
if (blockSize < 65536 && bytesRead == blockSize)
506-
{
507-
blockSize = blockSize * 16;
508-
block = new byte[blockSize];
509-
}
510-
}
511-
512-
value.ReleaseStream(stream);
513-
}
514-
515-
public static async Task WriteValueAsync(XmlDictionaryWriter writer, OperationStreamProvider value)
516-
{
517-
if (value == null)
518-
{
519-
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException(nameof(value)));
520-
}
521-
522-
Stream stream = value.GetStream();
523-
if (stream == null)
524-
{
525-
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new XmlException(SRP.Format(SRP.XmlInvalidStream)));
526-
}
527-
528-
int blockSize = 256;
529-
int bytesRead = 0;
530-
byte[] block = new byte[blockSize];
531-
while (true)
532-
{
533-
bytesRead = await stream.ReadAsync(block, 0, blockSize);
534-
if (bytesRead > 0)
535-
{
536-
// XmlDictionaryWriter has not implemented WriteBase64Async() yet.
537-
writer.WriteBase64(block, 0, bytesRead);
538-
}
539-
else
540-
{
541-
break;
542-
}
543-
544-
if (blockSize < 65536 && bytesRead == blockSize)
545-
{
546-
blockSize = blockSize * 16;
547-
block = new byte[blockSize];
548-
}
549-
}
550-
551-
value.ReleaseStream(stream);
552-
}
553-
}
554472
}
555473
}

0 commit comments

Comments
 (0)