-
Notifications
You must be signed in to change notification settings - Fork 355
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.