Skip to content

Remove msgtype requirement in HttpMessageContent  #407

Open
@jods4

Description

@jods4

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:

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=request in its Content-Type;
  • ReadAsHttpResponseMessageAsync() throws when parsing Dataverse response because it does not have msgtype=response.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions