Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mtom fixes #5069

Merged
merged 2 commits into from
Mar 31, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System.Diagnostics.Contracts;
using System.Globalization;
using System.IdentityModel.Selectors;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
Expand Down Expand Up @@ -1030,6 +1031,16 @@ public async Task SendRequestAsync(Message message, TimeoutHelper timeoutHelper)
if (!suppressEntityBody)
{
httpRequestMessage.Content = MessageContent.Create(_factory, request, _timeoutHelper);
var contentType = httpRequestMessage.Content.Headers.ContentType;
if (contentType!= null &&
contentType.MediaType == "multipart/related" &&
contentType.Parameters.Contains(new NameValueHeaderValue("type", "\"application/xop+xml\"")))
{
// For MTOM messages, add a MIME version header
AddMimeVersion("1.0");
request.Properties.Add("System.ServiceModel.Channel.MtomMessageEncoder.WriteMessageHeaders", false);
}

}

if (Fx.IsUap)
Expand Down Expand Up @@ -1095,6 +1106,11 @@ public async Task SendRequestAsync(Message message, TimeoutHelper timeoutHelper)
}
}

private void AddMimeVersion(string version)
{
_httpRequestMessage.Headers.Add(HttpChannelUtilities.MIMEVersionHeader, version);
}

private void Cleanup()
{
s_cancelCts(_httpSendCts);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,17 @@ public SecurityTokenValidationException(string message) { }
public SecurityTokenValidationException(string message, System.Exception innerException) { }
protected SecurityTokenValidationException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) { }
}
public partial class UserNameSecurityToken : SecurityToken
{
public UserNameSecurityToken(string userName, string password) { }
public UserNameSecurityToken(string userName, string password, string id) { }
public override string Id => default;
public override System.Collections.ObjectModel.ReadOnlyCollection<SecurityKey> SecurityKeys => default;
public override DateTime ValidFrom => default;
public override DateTime ValidTo => default;
public string UserName => default;
public string Password => default;
}
public partial class X509SecurityToken : SecurityToken, IDisposable
{
public X509SecurityToken(System.Security.Cryptography.X509Certificates.X509Certificate2 certificate) { }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -423,12 +423,12 @@ public override Message ReadMessage(Stream stream, int maxSizeOfHeaders, string

public override ArraySegment<byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
{
return WriteMessageInternal(message, maxMessageSize, bufferManager, messageOffset, GenerateStartInfoString(), _boundary, MtomStartUri, writeMessageHeaders: true);
return WriteMessageInternal(message, maxMessageSize, bufferManager, messageOffset, GenerateStartInfoString(), _boundary, MtomStartUri);
}

public override ValueTask<ArraySegment<byte>> WriteMessageAsync(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
{
return new ValueTask<ArraySegment<byte>>(WriteMessageInternal(message, maxMessageSize, bufferManager, messageOffset, GenerateStartInfoString(), _boundary, MtomStartUri, writeMessageHeaders: true));
return new ValueTask<ArraySegment<byte>>(WriteMessageInternal(message, maxMessageSize, bufferManager, messageOffset, GenerateStartInfoString(), _boundary, MtomStartUri));
}

private string GetContentType(out string boundary)
Expand All @@ -446,8 +446,14 @@ internal string FormatContentType(string boundary, string startInfo)
MtomContentType, MtomStartUri, boundary, startInfo);
}

private ArraySegment<byte> WriteMessageInternal(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset, string startInfo, string boundary, string startUri, bool writeMessageHeaders)
private ArraySegment<byte> WriteMessageInternal(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset, string startInfo, string boundary, string startUri)
{
bool writeMessageHeaders = true;
if (message.Properties.TryGetValue("System.ServiceModel.Channel.MtomMessageEncoder.WriteMessageHeaders", out object boolAsObject) && boolAsObject is bool)
{
writeMessageHeaders = (bool)boolAsObject;
}

if (message == null)
throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull(nameof(message));
if (bufferManager == null)
Expand Down Expand Up @@ -517,7 +523,7 @@ public override void WriteMessage(Message message, Stream stream)

public override ValueTask WriteMessageAsync(Message message, Stream stream)
{
return WriteMessageInternalAsync(message, stream, GenerateStartInfoString(), _boundary, MtomStartUri, writeMessageHeaders: true);
return WriteMessageInternalAsync(message, stream, GenerateStartInfoString(), _boundary, MtomStartUri);
}

public override IAsyncResult BeginWriteMessage(Message message, Stream stream, AsyncCallback callback, object state)
Expand All @@ -530,8 +536,14 @@ public override void EndWriteMessage(IAsyncResult result)
result.ToApmEnd();
}

private async ValueTask WriteMessageInternalAsync(Message message, Stream stream, string startInfo, string boundary, string startUri, bool writeMessageHeaders)
private async ValueTask WriteMessageInternalAsync(Message message, Stream stream, string startInfo, string boundary, string startUri)
{
bool writeMessageHeaders = true;
if (message.Properties.TryGetValue("System.ServiceModel.Channel.MtomMessageEncoder.WriteMessageHeaders", out object boolAsObject) && boolAsObject is bool)
{
writeMessageHeaders = (bool)boolAsObject;
}

if (message == null)
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException(nameof(message)));
if (stream == null)
Expand Down