1

Closed

Bug: serialisation-deserialisation loses UserAgent.Count

description

When I deserialise-serialise-deserialise and compare request and request2 in code below, UserAgent header has the correct .ToString() value but count is 0. So my unit test was failing:
        var stream = new FileStream("Request.bin", FileMode.Open);
        var serializer = new MessageContentHttpMessageSerializer();
        var request = serializer.DeserializeToRequest(stream);

        var memoryStream = new MemoryStream();
        serializer.Serialize(request, memoryStream);

        memoryStream.Position = 0;
        var request2 = serializer.DeserializeToRequest(memoryStream);

file attachments

Closed Jun 6 at 5:48 PM by kirthik
Based on the comment, looks like this is fixed.

comments

aliostad wrote Aug 5, 2012 at 8:00 AM

This problem seems to not exist in current source and only in RTM. The code for HttpMessageContent has changed to allow dealing with UserAgent differently.

This is MessageContentHttpMessageSerializer:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;

namespace WebApiContrib.Serialization
{
public class MessageContentHttpMessageSerializer
{
    private bool _bufferContent;

    public MessageContentHttpMessageSerializer()
        : this(false)
    {

    }

    public MessageContentHttpMessageSerializer(bool bufferContent)
    {
        _bufferContent = bufferContent;
    }


    public void Serialize(HttpResponseMessage response, Stream stream)
    {
        byte[] assuranceBuffer = null;
        if (_bufferContent && response.Content != null)
            assuranceBuffer = response.Content.ReadAsByteArrayAsync().Result; // make sure it is buffered

        var httpMessageContent = new HttpMessageContent(response);
        var buffer = httpMessageContent.ReadAsByteArrayAsync().Result;
        stream.Write(buffer, 0, buffer.Length);
    }

    public void Serialize(HttpRequestMessage request, Stream stream)
    {
        byte[] assuranceBuffer = null;
        if (_bufferContent && request.Content != null)
            assuranceBuffer = request.Content.ReadAsByteArrayAsync().Result; // make sure it is buffered

        var httpMessageContent = new HttpMessageContent(request);
        var buffer = httpMessageContent.ReadAsByteArrayAsync().Result;
        stream.Write(buffer, 0, buffer.Length);
    }

    public HttpResponseMessage DeserializeToResponse(Stream stream)
    {
        var response = new HttpResponseMessage();
        var memoryStream = new MemoryStream();
        stream.CopyTo(memoryStream);
        response.Content = new ByteArrayContent(memoryStream.ToArray());
        response.Content.Headers.Add("Content-Type", "application/http;msgtype=response");
        return response.Content.ReadAsHttpResponseMessageAsync().Result;
    }

    public HttpRequestMessage DeserializeToRequest(Stream stream)
    {
        var request = new HttpRequestMessage();
        var memoryStream = new MemoryStream();
        stream.CopyTo(memoryStream);
        request.Content = new ByteArrayContent(memoryStream.ToArray());
        request.Content.Headers.Add("Content-Type", "application/http;msgtype=request");
        return request.Content.ReadAsHttpRequestMessageAsync().Result;
    }
}
}

aliostad wrote Aug 12, 2012 at 7:57 AM

This seems to have been fixed with the latest source code as range seems to have been handled differently.