public static MediaTypeFormatter CreateTracer(MediaTypeFormatter formatter, ITraceWriter traceWriter, HttpRequestMessage request) { // If we have been asked to wrap a tracer around a formatter, it could be // already wrapped, and there is nothing to do. But if we see it is a tracer // that is not associated with a request, we wrap it into a new tracer that // does have a request. The only formatter tracers without requests are the // ones in the default MediaTypeFormatterCollection in the HttpConfiguration. IFormatterTracer formatterTracer = formatter as IFormatterTracer; if (formatterTracer != null) { if (formatterTracer.Request == request) { return(formatter); } formatter = formatterTracer.InnerFormatter; } MediaTypeFormatter tracer = null; // We special-case Xml, Json and FormUrlEncoded formatters because we expect to be able // to find them with IsAssignableFrom in the MediaTypeFormatterCollection. if (formatter is XmlMediaTypeFormatter) { tracer = new XmlMediaTypeFormatterTracer(formatter, traceWriter, request); } else if (formatter is JsonMediaTypeFormatter) { tracer = new JsonMediaTypeFormatterTracer(formatter, traceWriter, request); } else if (formatter is FormUrlEncodedMediaTypeFormatter) { tracer = new FormUrlEncodedMediaTypeFormatterTracer(formatter, traceWriter, request); } else if (formatter is BufferedMediaTypeFormatter) { tracer = new BufferedMediaTypeFormatterTracer(formatter, traceWriter, request); } else { tracer = new MediaTypeFormatterTracer(formatter, traceWriter, request); } // Copy SupportedMediaTypes and MediaTypeMappings because they are publically visible tracer.SupportedMediaTypes.Clear(); foreach (MediaTypeHeaderValue mediaType in formatter.SupportedMediaTypes) { tracer.SupportedMediaTypes.Add(mediaType); } tracer.MediaTypeMappings.Clear(); foreach (MediaTypeMapping mapping in formatter.MediaTypeMappings) { tracer.MediaTypeMappings.Add(mapping); } return(tracer); }
public void CreateTracer_Returns_Tracing_Formatter(MediaTypeFormatter formatter) { // Arrange HttpRequestMessage request = new HttpRequestMessage(); // Act MediaTypeFormatter tracingFormatter = MediaTypeFormatterTracer.CreateTracer(formatter, new TestTraceWriter(), request); // Assert IFormatterTracer tracer = Assert.IsAssignableFrom <IFormatterTracer>(tracingFormatter); Assert.Same(formatter, tracer.InnerFormatter); }
public static MediaTypeFormatter CreateTracer(MediaTypeFormatter formatter, ITraceWriter traceWriter, HttpRequestMessage request) { // If we have been asked to wrap a tracer around a formatter, it could be // already wrapped, and there is nothing to do. But if we see it is a tracer // that is not associated with a request, we wrap it into a new tracer that // does have a request. The only formatter tracers without requests are the // ones in the default MediaTypeFormatterCollection in the HttpConfiguration. IFormatterTracer formatterTracer = formatter as IFormatterTracer; if (formatterTracer != null) { if (formatterTracer.Request == request) { return(formatter); } formatter = formatterTracer.InnerFormatter; } MediaTypeFormatter tracer = null; XmlMediaTypeFormatter xmlFormatter = formatter as XmlMediaTypeFormatter; JsonMediaTypeFormatter jsonFormatter = formatter as JsonMediaTypeFormatter; FormUrlEncodedMediaTypeFormatter formUrlFormatter = formatter as FormUrlEncodedMediaTypeFormatter; BufferedMediaTypeFormatter bufferedFormatter = formatter as BufferedMediaTypeFormatter; // We special-case Xml, Json and FormUrlEncoded formatters because we expect to be able // to find them with IsAssignableFrom in the MediaTypeFormatterCollection. if (xmlFormatter != null) { tracer = new XmlMediaTypeFormatterTracer(xmlFormatter, traceWriter, request); } else if (jsonFormatter != null) { tracer = new JsonMediaTypeFormatterTracer(jsonFormatter, traceWriter, request); } else if (formUrlFormatter != null) { tracer = new FormUrlEncodedMediaTypeFormatterTracer(formUrlFormatter, traceWriter, request); } else if (bufferedFormatter != null) { tracer = new BufferedMediaTypeFormatterTracer(bufferedFormatter, traceWriter, request); } else { tracer = new MediaTypeFormatterTracer(formatter, traceWriter, request); } return(tracer); }
public void GetPerRequestFormatterInstance_Calls_Inner_And_Wraps_Tracer_Around_It() { // Arrange HttpRequestMessage request = new HttpRequestMessage(); Type randomType = typeof(string); MediaTypeHeaderValue mediaType = new MediaTypeHeaderValue("plain/text"); Mock <TFormatter> mockFormatter = new Mock <TFormatter>() { CallBase = true }; MediaTypeFormatter formatterObject = mockFormatter.Object; mockFormatter .Setup(f => f.GetPerRequestFormatterInstance(randomType, request, mediaType)) .Returns(formatterObject) .Verifiable(); MediaTypeFormatter tracer = CreateTracer( mockFormatter.Object, request, new TestTraceWriter() ); // Act MediaTypeFormatter valueReturned = tracer.GetPerRequestFormatterInstance( randomType, request, mediaType ); // Assert IFormatterTracer tracerReturned = Assert.IsAssignableFrom <IFormatterTracer>( valueReturned ); Assert.Same(formatterObject, tracerReturned.InnerFormatter); mockFormatter.Verify(); }
public static MediaTypeFormatter ActualMediaTypeFormatter(MediaTypeFormatter formatter) { IFormatterTracer tracer = formatter as IFormatterTracer; return(tracer == null ? formatter : tracer.InnerFormatter); }