Repository navigation
Remove msgtype requirement in HttpMessageContent #407
Description
HttpMessageContent serializes HTTP requests/responses inside a mulitpart/mixed body.
For requests, it sends the header Content-Type: application/http; msgtype=request.
For responses, it expects the header Content-Type: application/http; msgtype=response.
This is where msgtype=request is added in source:
| Headers.ContentType.Parameters.Add(new NameValueHeaderValue(MsgTypeParameter, DefaultRequestMsgType)); |
This is where msgtype=response is validated in source:
AspNetWebStack/src/System.Net.Http.Formatting/HttpMessageContent.cs
Lines 142 to 171 in 1231b77
| foreach (NameValueHeaderValue parameter in contentType.Parameters) | |
| { | |
| if (parameter.Name.Equals(MsgTypeParameter, StringComparison.OrdinalIgnoreCase)) | |
| { | |
| string msgType = FormattingUtilities.UnquoteToken(parameter.Value); | |
| if (!msgType.Equals(isRequest ? DefaultRequestMsgType : DefaultResponseMsgType, StringComparison.OrdinalIgnoreCase)) | |
| { | |
| if (throwOnError) | |
| { | |
| throw Error.Argument("content", Properties.Resources.HttpMessageInvalidMediaType, FormattingUtilities.HttpContentType.Name, isRequest ? DefaultRequestMediaType : DefaultResponseMediaType); | |
| } | |
| else | |
| { | |
| return false; | |
| } | |
| } | |
| return true; | |
| } | |
| } | |
| } | |
| if (throwOnError) | |
| { | |
| throw Error.Argument("content", Properties.Resources.HttpMessageInvalidMediaType, FormattingUtilities.HttpContentType.Name, isRequest ? DefaultRequestMediaType : DefaultResponseMediaType); | |
| } | |
| else | |
| { | |
| return false; | |
| } |
HttpMessageContent should be configurable to not sent a msgtype parameter, and accept responses without a msgtype (given Content-Type: application/http).
As a common real-world example, the OData specification uses Content-Type: application/http without any further msgtype in both its batched requests and responses, see:
https://www.odata.org/documentation/odata-version-2-0/batch-processing/
Inside Microsoft, Dataverse exposes OData services and its batching endpoint is unusable with HttpMessageContent because:
- Dataverse throws when a batch has
msgtype=requestin itsContent-Type; ReadAsHttpResponseMessageAsync()throws when parsing Dataverse response because it does not havemsgtype=response.
Activity
MackinnonBuck commentedon Aug 9, 2023
Thanks for reaching out. We are currently prioritizing critical bug fixes and security issues over new features in this repository. Putting this in the backlog to collect more feedback.