public void SelectResponseCharacterEncoding_SelectsEncoding(
            string acceptCharsetHeaders,
            string[] supportedEncodings,
            string expectedEncoding)
        {
            // Arrange
            var httpContext = new Mock<HttpContext>();
            var httpRequest = new DefaultHttpContext().Request;
            httpRequest.Headers[HeaderNames.AcceptCharset] = acceptCharsetHeaders;
            httpRequest.Headers[HeaderNames.Accept] = "application/acceptCharset";
            httpContext.SetupGet(o => o.Request).Returns(httpRequest);

            var formatter = new TestOutputFormatter();
            foreach (string supportedEncoding in supportedEncodings)
            {
                formatter.SupportedEncodings.Add(Encoding.GetEncoding(supportedEncoding));
            }

            var context = new OutputFormatterWriteContext(
                httpContext.Object,
                new TestHttpResponseStreamWriterFactory().CreateWriter,
                typeof(string),
                "someValue")
            {
                ContentType = new StringSegment(httpRequest.Headers[HeaderNames.Accept]),
            };

            // Act
            var actualEncoding = formatter.SelectCharacterEncoding(context);

            // Assert
            Assert.Equal(Encoding.GetEncoding(expectedEncoding), actualEncoding);
        }
        public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            string callback;
            if (IsJsonpRequest(context.HttpContext.Request, _callbackQueryParameter, out callback))
            {
                if (!CallbackValidator.IsValid(callback))
                {
                    throw new InvalidOperationException($"Callback '{callback}' is invalid!");
                }

                using (var writer = context.WriterFactory(context.HttpContext.Response.Body, selectedEncoding))
                {
                    // the /**/ is a specific security mitigation for "Rosetta Flash JSONP abuse"
                    // the typeof check is just to reduce client error noise
                    writer.Write("/**/ typeof " + callback + " === 'function' && " + callback + "(");
                    writer.Flush();
                    _jsonMediaTypeFormatter.WriteObject(writer, context.Object);
                    writer.Write(");");
                    await writer.FlushAsync();
                }
            }
            else
            {
                await _jsonMediaTypeFormatter.WriteResponseBodyAsync(context, selectedEncoding);
            }
        }
Esempio n. 3
0
        public void SelectFormatter_WithNoProvidedContentType_DoesConneg()
        {
            // Arrange
            var executor = CreateExecutor();

            var formatters = new List<IOutputFormatter>
            {
                new TestXmlOutputFormatter(),
                new TestJsonOutputFormatter(), // This will be chosen based on the accept header
            };

            var context = new OutputFormatterWriteContext(
                new DefaultHttpContext(),
                new TestHttpResponseStreamWriterFactory().CreateWriter,
                objectType: null,
                @object: null);

            context.HttpContext.Request.Headers[HeaderNames.Accept] = "application/json";

            // Act
            var formatter = executor.SelectFormatter(
                context,
                new MediaTypeCollection { "application/json" },
                formatters);

            // Assert
            Assert.Same(formatters[1], formatter);
            MediaTypeAssert.Equal("application/json", context.ContentType);
        }
Esempio n. 4
0
 public async Task WriteAsync(OutputFormatterWriteContext context)
 {
     using (var responceStream = new StreamWriter(context.HttpContext.Response.Body, Encoding.UTF8))
     {
         await responceStream.WriteAsync(JsonConvert.SerializeObject(context.Object, SerializerSettings));
     }
 }
Esempio n. 5
0
        public void CanWriteResult_ByDefault_ReturnsTrue_IfTheValueIsNull(
            object value,
            bool declaredTypeAsString,
            bool expected,
            bool useNonNullContentType)
        {
            // Arrange
            var type = declaredTypeAsString ? typeof(string) : typeof(object);
            var contentType = useNonNullContentType ? new StringSegment("text/plain") : new StringSegment();

            var context = new OutputFormatterWriteContext(
                new DefaultHttpContext(),
                new TestHttpResponseStreamWriterFactory().CreateWriter,
                type,
                value)
            {
                ContentType = contentType,
            };

            var formatter = new HttpNoContentOutputFormatter();

            // Act
            var result = formatter.CanWriteResult(context);

            // Assert
            Assert.Equal(expected, result);
        }
Esempio n. 6
0
		public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext context)
		{
			var response = context.HttpContext.Response;
			//var selectedEncoding = context.ContentType.Encoding == null ? Encoding.UTF8 : context.ContentType.Encoding;
			var selectedEncoding = Encoding.UTF8;

			var value = context.Object;
			if (value is IEdmModel || context.HttpContext.ODataProperties().Model == null)
			{
				using (var delegatingStream = new NonDisposableStream(response.Body))
				using (var writer = new StreamWriter(delegatingStream, selectedEncoding, 1024, leaveOpen: true))
				{
					if (value is IEdmModel)
					{
						WriteMetadata(writer, (IEdmModel)value);
					}

					using (var jsonWriter = CreateJsonWriter(writer))
					{
						var jsonSerializer = CreateJsonSerializer();
						jsonSerializer.Serialize(jsonWriter, value);
					}
				}
			}
			else
			{
				using (var delegatingStream = new NonDisposableStream(response.Body))
				{
					await WriteObjectAsync(delegatingStream, context);
				}
			}
		}
        public async Task WriteAsync(OutputFormatterWriteContext context)
        {
            var response = context.HttpContext.Response;

            var responseMessage = context.Object as HttpResponseMessage;
            if (responseMessage == null)
            {
                var message = Resources.FormatHttpResponseMessageFormatter_UnsupportedType(
                    nameof(HttpResponseMessageOutputFormatter),
                    nameof(HttpResponseMessage));

                throw new InvalidOperationException(message);
            }

            using (responseMessage)
            {
                response.StatusCode = (int)responseMessage.StatusCode;

                var responseFeature = context.HttpContext.Features.Get<IHttpResponseFeature>();
                if (responseFeature != null)
                {
                    responseFeature.ReasonPhrase = responseMessage.ReasonPhrase;
                }

                var responseHeaders = responseMessage.Headers;

                // Ignore the Transfer-Encoding header if it is just "chunked".
                // We let the host decide about whether the response should be chunked or not.
                if (responseHeaders.TransferEncodingChunked == true &&
                    responseHeaders.TransferEncoding.Count == 1)
                {
                    responseHeaders.TransferEncoding.Clear();
                }
                
                foreach (var header in responseHeaders)
                {
                    response.Headers.Append(header.Key, header.Value.ToArray());
                }

                if (responseMessage.Content != null)
                {
                    var contentHeaders = responseMessage.Content.Headers;
                    
                    // Copy the response content headers only after ensuring they are complete.
                    // We ask for Content-Length first because HttpContent lazily computes this
                    // and only afterwards writes the value into the content headers.
                    var unused = contentHeaders.ContentLength;
                    
                    foreach (var header in contentHeaders)
                    {
                        response.Headers.Append(header.Key, header.Value.ToArray());
                    }

                    await responseMessage.Content.CopyToAsync(response.Body);
                }
            }
        }
        /// <inheritdoc />
        public Task WriteAsync(OutputFormatterWriteContext context)
        {
            var response = context.HttpContext.Response;
            response.ContentLength = 0;

            if (response.StatusCode == StatusCodes.Status200OK)
            {
                response.StatusCode = StatusCodes.Status204NoContent;
            }

            return Task.FromResult(true);
        }
Esempio n. 9
0
		public ODataJsonSerializer(OutputFormatterWriteContext context)
		{
			_context = context;
			_odataProperties = context.HttpContext.ODataProperties();
			_version = ODataProperties.DefaultODataVersion;
			MessageWriterSettings = new ODataMessageWriterSettings
			{
				Indent = true,
				DisableMessageStreamDisposal = true,
				MessageQuotas = new ODataMessageQuotas { MaxReceivedMessageSize = Int64.MaxValue },
				AutoComputePayloadMetadataInJson = true,
			};
		}
Esempio n. 10
0
        public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
        {
            var contact = (Contact)context.Object;

            var builder = new StringBuilder();
            builder.AppendLine("BEGIN:VCARD");
            builder.AppendFormat("FN:{0}", contact.Name);
            builder.AppendLine();
            builder.AppendLine("END:VCARD");

            await context.HttpContext.Response.WriteAsync(
                builder.ToString(),
                selectedEncoding);
        }
    public async Task WriteAsync(OutputFormatterWriteContext context)
    {
      if (context == null)
        throw new ArgumentNullException(nameof(context));

      var response = context.HttpContext.Response;

      using (var writer = context.WriterFactory(response.Body, Encoding.UTF8))
      {
        var responseJson = SerializationService.SerializeWithRoot(context.Object, _outputPayloadFormatOptions);

        await writer.WriteAsync(responseJson);

        await writer.FlushAsync();
      }
    }
        public async Task WriteAsync_Sets406NotAcceptable()
        {
            // Arrange
            var formatter = new HttpNotAcceptableOutputFormatter();

            var context = new OutputFormatterWriteContext(
                new DefaultHttpContext(),
                new TestHttpResponseStreamWriterFactory().CreateWriter,
                objectType: null,
                @object: null);

            // Act
             await formatter.WriteAsync(context);

            // Assert
            Assert.Equal(StatusCodes.Status406NotAcceptable, context.HttpContext.Response.StatusCode);
        }
Esempio n. 13
0
        public void CanWriteResult_ForNullContentType_UsesFirstEntryInSupportedContentTypes()
        {
            // Arrange
            var context = new OutputFormatterWriteContext(
                new DefaultHttpContext(),
                new TestHttpResponseStreamWriterFactory().CreateWriter,
                objectType: null,
                @object: null);

            var formatter = new TestOutputFormatter();

            // Act
            var result = formatter.CanWriteResult(context);

            // Assert
            Assert.True(result);
            Assert.Equal(formatter.SupportedMediaTypes[0].ToString(), context.ContentType.ToString());
        }
        public void CanWriteResult_OnlyActsOnStreams(Type type)
        {
            // Arrange
            var formatter = new StreamOutputFormatter();
            var @object = type != null ? Activator.CreateInstance(type) : null;

            var context = new OutputFormatterWriteContext(
                new DefaultHttpContext(),
                new TestHttpResponseStreamWriterFactory().CreateWriter,
                type,
                @object);

            // Act
            var result = formatter.CanWriteResult(context);

            // Assert
            Assert.False(result);
        }
Esempio n. 15
0
        public async Task WriteAsync(OutputFormatterWriteContext context) {
            string mediaType = context.ContentType.HasValue ? context.ContentType.Value : null;

            object value = null;
            var halResponse = ((HALResponse)context.Object);

            // If it is a HAL response but set to application/json - convert to a plain response
            var serializer = JsonSerializer.Create();

            if(!halResponse.Config.ForceHAL && !halJsonMediaTypes.Contains(mediaType)) {
                value = halResponse.ToPlainResponse(serializer);
            } else {
                value = halResponse.ToJObject(serializer);
            }

            var jsonContext = new OutputFormatterWriteContext(context.HttpContext, context.WriterFactory, value.GetType(), value);

            await jsonFormatter.WriteAsync(jsonContext);
        }
        public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            if (selectedEncoding == null)
            {
                throw new ArgumentNullException(nameof(selectedEncoding));
            }

            var response = context.HttpContext.Response;
            using (var bsonWriter = new BsonWriter(response.Body) { CloseOutput = false })
            {
                var jsonSerializer = CreateJsonSerializer();
                jsonSerializer.Serialize(bsonWriter, context.Object);
                bsonWriter.Flush();
            }
        }
Esempio n. 17
0
        public void CanWriteResult_ReturnsTrue_IfReturnTypeIsVoidOrTask(Type declaredType)
        {
            // Arrange
            var context = new OutputFormatterWriteContext(
                new DefaultHttpContext(),
                new TestHttpResponseStreamWriterFactory().CreateWriter,
                declaredType,
                "Something non null.")
            {
                ContentType = new StringSegment("text/plain"),
            };

            var formatter = new HttpNoContentOutputFormatter();

            // Act
            var result = formatter.CanWriteResult(context);

            // Assert
            Assert.True(result);
        }
        public void CanWriteResult_ReturnsTrue_WhenConnegHasFailed()
        {
            // Arrange
            var formatter = new HttpNotAcceptableOutputFormatter();

            var context = new OutputFormatterWriteContext(
                new DefaultHttpContext(),
                new TestHttpResponseStreamWriterFactory().CreateWriter,
                objectType: null,
                @object: null)
            {
                FailedContentNegotiation = true,
            };

            // Act
            var result = formatter.CanWriteResult(context);

            // Assert
            Assert.True(result);
        }
        public void CanWriteResult_ReturnsTrue_ForStreams(Type type, string contentType)
        {
            // Arrange
            var formatter = new StreamOutputFormatter();
            var contentTypeHeader = new StringSegment(contentType);

            var context = new OutputFormatterWriteContext(
                new DefaultHttpContext(),
                new TestHttpResponseStreamWriterFactory().CreateWriter,
                type,
                new MemoryStream())
            {
                ContentType = contentTypeHeader,
            };

            // Act
            var canWrite = formatter.CanWriteResult(context);

            // Assert
            Assert.True(canWrite);
        }
        public void CanWriteResult_OnlyActsOnStreams_IgnoringContentType(Type type, string contentType)
        {
            // Arrange
            var formatter = new StreamOutputFormatter();
            var contentTypeHeader = contentType == null ? new StringSegment() : new StringSegment(contentType);

            var context = new OutputFormatterWriteContext(
                new DefaultHttpContext(),
                new TestHttpResponseStreamWriterFactory().CreateWriter,
                type,
                new SimplePOCO())
            {
                ContentType = contentTypeHeader,
            };

            // Act
            var canWrite = formatter.CanWriteResult(context);

            // Assert
            Assert.False(canWrite);
        }
Esempio n. 21
0
        /// <inheritdoc />
        public async Task WriteAsync(OutputFormatterWriteContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            using (var valueAsStream = ((Stream)context.Object))
            {
                var response = context.HttpContext.Response;

                if (context.ContentType != null)
                {
                    response.ContentType = context.ContentType.ToString();
                }

                var bufferingFeature = context.HttpContext.Features.Get<IHttpBufferingFeature>();
                bufferingFeature?.DisableResponseBuffering();

                await valueAsStream.CopyToAsync(response.Body);
            }
        }
Esempio n. 22
0
        public void CanWrite_ReturnsFalse_ForUnsupportedType()
        {
            // Arrange
            var formatter = new TypeSpecificFormatter();
            formatter.SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("application/json"));
            formatter.SupportedTypes.Add(typeof(int));

            var context = new OutputFormatterWriteContext(
                new DefaultHttpContext(),
                new TestHttpResponseStreamWriterFactory().CreateWriter,
                typeof(string),
                "Hello, world!")
            {
                ContentType = new StringSegment(formatter.SupportedMediaTypes[0].ToString()),
            };

            // Act
            var result = formatter.CanWriteResult(context);

            // Assert
            Assert.False(result);
        }
Esempio n. 23
0
        /// <summary>
        /// Selects the <see cref="IOutputFormatter"/> to write the response.
        /// </summary>
        /// <param name="formatterContext">The <see cref="OutputFormatterWriteContext"/>.</param>
        /// <param name="contentTypes">
        /// The list of content types provided by <see cref="ObjectResult.ContentTypes"/>.
        /// </param>
        /// <param name="formatters">
        /// The list of <see cref="IOutputFormatter"/> instances to consider.
        /// </param>
        /// <returns>
        /// The selected <see cref="IOutputFormatter"/> or <c>null</c> if no formatter can write the response.
        /// </returns>
        protected virtual IOutputFormatter SelectFormatter(
            OutputFormatterWriteContext formatterContext,
            MediaTypeCollection contentTypes,
            IList <IOutputFormatter> formatters)
        {
            if (formatterContext == null)
            {
                throw new ArgumentNullException(nameof(formatterContext));
            }

            if (contentTypes == null)
            {
                throw new ArgumentNullException(nameof(contentTypes));
            }

            if (formatters == null)
            {
                throw new ArgumentNullException(nameof(formatters));
            }

            var request = formatterContext.HttpContext.Request;
            var acceptableMediaTypes = GetAcceptableMediaTypes(request);
            var selectFormatterWithoutRegardingAcceptHeader = false;
            IOutputFormatter selectedFormatter = null;

            if (acceptableMediaTypes.Count == 0)
            {
                // There is either no Accept header value, or it contained */* and we
                // are not currently respecting the 'browser accept header'.
                Logger.NoAcceptForNegotiation();

                selectFormatterWithoutRegardingAcceptHeader = true;
            }
            else
            {
                if (contentTypes.Count == 0)
                {
                    // Use whatever formatter can meet the client's request
                    selectedFormatter = SelectFormatterUsingSortedAcceptHeaders(
                        formatterContext,
                        formatters,
                        acceptableMediaTypes);
                }
                else
                {
                    // Verify that a content type from the context is compatible with the client's request
                    selectedFormatter = SelectFormatterUsingSortedAcceptHeadersAndContentTypes(
                        formatterContext,
                        formatters,
                        acceptableMediaTypes,
                        contentTypes);
                }

                if (selectedFormatter == null && !ReturnHttpNotAcceptable)
                {
                    Logger.NoFormatterFromNegotiation(acceptableMediaTypes);

                    selectFormatterWithoutRegardingAcceptHeader = true;
                }
            }

            if (selectFormatterWithoutRegardingAcceptHeader)
            {
                if (contentTypes.Count == 0)
                {
                    selectedFormatter = SelectFormatterNotUsingContentType(
                        formatterContext,
                        formatters);
                }
                else
                {
                    selectedFormatter = SelectFormatterUsingAnyAcceptableContentType(
                        formatterContext,
                        formatters,
                        contentTypes);
                }
            }

            return(selectedFormatter);
        }
 public override Encoding SelectCharacterEncoding(OutputFormatterWriteContext context)
 {
     return _encoding;
 }
        public void WriteResponseContentHeaders_NoSupportedEncodings_NoEncodingIsSet()
        {
            // Arrange
            var formatter = new TestOutputFormatter();

            var testContentType = new StringSegment("text/json");

            formatter.SupportedEncodings.Clear();
            formatter.SupportedMediaTypes.Clear();
            formatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/json"));

            var context = new OutputFormatterWriteContext(
                new DefaultHttpContext(),
                new TestHttpResponseStreamWriterFactory().CreateWriter,
                objectType: null,
                @object: null)
            {
                ContentType = testContentType,
            };

            // Act
            formatter.WriteResponseHeaders(context);

            // Assert
            Assert.Null(MediaTypeHeaderValue.Parse(context.ContentType.Value).Encoding);
            Assert.Equal(testContentType, context.ContentType);

            // If we had set an encoding, it would be part of the content type header
            Assert.Equal(MediaTypeHeaderValue.Parse(testContentType.Value), context.HttpContext.Response.GetTypedHeaders().ContentType);
        }
Esempio n. 26
0
 private IHtmlElement[] CookieInformation(OutputFormatterWriteContext ctx)
 {
     return(ctx.HttpContext.Request.Cookies
            .Select(c => new Span($"{c.Key}={c.Value}"))
            .Cast <IHtmlElement>().ToArray());
 }
 /// <summary>
 /// Called during serialization to create the <see cref="JsonSerializer"/>.The formatter context
 /// that is passed gives an ability to create serializer specific to the context.
 /// </summary>
 /// <param name="context">A context object for <see cref="IOutputFormatter.WriteAsync(OutputFormatterWriteContext)"/>.</param>
 /// <returns>The <see cref="JsonSerializer"/> used during serialization and deserialization.</returns>
 protected virtual JsonSerializer CreateJsonSerializer(OutputFormatterWriteContext context)
 {
     return(CreateJsonSerializer());
 }
Esempio n. 28
0
        public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
        {
            EnsureArg.IsNotNull(context, nameof(context));
            EnsureArg.IsNotNull(selectedEncoding, nameof(selectedEncoding));

            context.HttpContext.AllowSynchronousIO();

            var elementsSearchParameter = context.HttpContext.GetElementsOrDefault();
            var hasElements             = elementsSearchParameter?.Any() == true;
            var summaryProvider         = _modelInfoProvider.StructureDefinitionSummaryProvider;
            var additionalElements      = new HashSet <string>();

            Resource resourceObject = null;

            if (typeof(RawResourceElement).IsAssignableFrom(context.ObjectType))
            {
                resourceObject = _deserializer.Deserialize(context.Object as RawResourceElement).ToPoco <Resource>();
                if (hasElements)
                {
                    var typeinfo = summaryProvider.Provide(resourceObject.TypeName);
                    var required = typeinfo.GetElements().Where(e => e.IsRequired).ToList();
                    additionalElements.UnionWith(required.Select(x => x.ElementName));
                }
            }
            else if (typeof(Hl7.Fhir.Model.Bundle).IsAssignableFrom(context.ObjectType))
            {
                // Need to set Resource property for resources in entries
                var bundle = context.Object as Hl7.Fhir.Model.Bundle;

                foreach (var entry in bundle.Entry.Where(x => x is RawBundleEntryComponent))
                {
                    var rawResource = entry as RawBundleEntryComponent;
                    entry.Resource = _deserializer.Deserialize(rawResource.ResourceElement).ToPoco <Resource>();
                    if (hasElements)
                    {
                        var typeinfo = summaryProvider.Provide(entry.Resource.TypeName);
                        var required = typeinfo.GetElements().Where(e => e.IsRequired).ToList();
                        additionalElements.UnionWith(required.Select(x => x.ElementName));
                    }
                }

                resourceObject = bundle;
            }
            else
            {
                resourceObject = (Resource)context.Object;
                if (hasElements)
                {
                    var typeinfo = summaryProvider.Provide(resourceObject.TypeName);
                    var required = typeinfo.GetElements().Where(e => e.IsRequired).ToList();
                    additionalElements.UnionWith(required.Select(x => x.ElementName));
                }
            }

            if (hasElements)
            {
                additionalElements.UnionWith(elementsSearchParameter);
                additionalElements.Add("meta");
            }

            HttpResponse response = context.HttpContext.Response;

            using (TextWriter textWriter = context.WriterFactory(response.Body, selectedEncoding))
                using (var writer = new XmlTextWriter(textWriter))
                {
                    if (context.HttpContext.GetPrettyOrDefault())
                    {
                        writer.Formatting = Formatting.Indented;
                    }

                    _fhirXmlSerializer.Serialize(resourceObject, writer, context.HttpContext.GetSummaryTypeOrDefault(), elements: hasElements ? additionalElements.ToArray() : null);
                }

            return(Task.CompletedTask);
        }
Esempio n. 29
0
 public Task WriteAsync(OutputFormatterWriteContext context)
 {
     throw new NotImplementedException();
 }
 public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context)
 {
     return(MessagePackSerializer.SerializeAsync(context.HttpContext.Response.Body, context.Object));
 }
        public void WriteResponse_GetMediaTypeWithCharsetReturnsMediaTypeFromCache_IfEncodingIsUtf8()
        {
            // Arrange
            var formatter = new TestOutputFormatter();

            var formatterContext = new OutputFormatterWriteContext(
                new DefaultHttpContext(),
                new TestHttpResponseStreamWriterFactory().CreateWriter,
                objectType: null,
                @object: null)
            {
                ContentType = new StringSegment("application/json"),
            };

            formatter.SupportedMediaTypes.Add("application/json");
            formatter.SupportedEncodings.Add(Encoding.UTF8);

            // Act
            formatter.WriteAsync(formatterContext);
            var firstContentType = formatterContext.ContentType;

            formatterContext.ContentType = new StringSegment("application/json");

            formatter.WriteAsync(formatterContext);
            var secondContentType = formatterContext.ContentType;

            // Assert
            Assert.Same(firstContentType.Buffer, secondContentType.Buffer);
        }
Esempio n. 32
0
        /// <summary>
        /// Selects the <see cref="IOutputFormatter"/> to write the response.
        /// </summary>
        /// <param name="formatterContext">The <see cref="OutputFormatterWriteContext"/>.</param>
        /// <param name="contentTypes">
        /// The list of content types provided by <see cref="ObjectResult.ContentTypes"/>.
        /// </param>
        /// <param name="formatters">
        /// The list of <see cref="IOutputFormatter"/> instances to consider.
        /// </param>
        /// <returns>
        /// The selected <see cref="IOutputFormatter"/> or <c>null</c> if no formatter can write the response.
        /// </returns>
        protected virtual IOutputFormatter SelectFormatter(
            OutputFormatterWriteContext formatterContext,
            IList <MediaTypeHeaderValue> contentTypes,
            IEnumerable <IOutputFormatter> formatters)
        {
            if (formatterContext == null)
            {
                throw new ArgumentNullException(nameof(formatterContext));
            }

            if (contentTypes == null)
            {
                throw new ArgumentNullException(nameof(contentTypes));
            }

            if (formatters == null)
            {
                throw new ArgumentNullException(nameof(formatters));
            }

            // Check if any content-type was explicitly set (for example, via ProducesAttribute
            // or URL path extension mapping). If yes, then ignore content-negotiation and use this content-type.
            if (contentTypes.Count == 1)
            {
                Logger.LogVerbose(
                    "Skipped content negotiation as content type '{ContentType}' is explicitly set for the response.",
                    contentTypes[0]);

                return(SelectFormatterUsingAnyAcceptableContentType(formatterContext, formatters, contentTypes));
            }

            var sortedAcceptHeaderMediaTypes = GetSortedAcceptHeaderMediaTypes(formatterContext);

            IOutputFormatter selectedFormatter = null;

            if (contentTypes == null || contentTypes.Count == 0)
            {
                // Check if we have enough information to do content-negotiation, otherwise get the first formatter
                // which can write the type. Let the formatter choose the Content-Type.
                if (!sortedAcceptHeaderMediaTypes.Any())
                {
                    Logger.LogVerbose("No information found on request to perform content negotiation.");

                    return(SelectFormatterNotUsingAcceptHeaders(formatterContext, formatters));
                }

                //
                // Content-Negotiation starts from this point on.
                //

                // 1. Select based on sorted accept headers.
                selectedFormatter = SelectFormatterUsingSortedAcceptHeaders(
                    formatterContext,
                    formatters,
                    sortedAcceptHeaderMediaTypes);

                // 2. No formatter was found based on Accept header. Fallback to the first formatter which can write
                // the type. Let the formatter choose the Content-Type.
                if (selectedFormatter == null)
                {
                    Logger.LogVerbose("Could not find an output formatter based on content negotiation.");

                    // Set this flag to indicate that content-negotiation has failed to let formatters decide
                    // if they want to write the response or not.
                    formatterContext.FailedContentNegotiation = true;

                    return(SelectFormatterNotUsingAcceptHeaders(formatterContext, formatters));
                }
            }
            else
            {
                if (sortedAcceptHeaderMediaTypes.Any())
                {
                    // Filter and remove accept headers which cannot support any of the user specified content types.
                    // That is, confirm this result supports a more specific media type than requested e.g. OK if
                    // "text/*" requested and result supports "text/plain".
                    var filteredAndSortedAcceptHeaders = sortedAcceptHeaderMediaTypes
                                                         .Where(acceptHeader => contentTypes.Any(contentType => contentType.IsSubsetOf(acceptHeader)));

                    selectedFormatter = SelectFormatterUsingSortedAcceptHeaders(
                        formatterContext,
                        formatters,
                        filteredAndSortedAcceptHeaders);
                }

                if (selectedFormatter == null)
                {
                    // Either there were no acceptHeaders that were present OR
                    // There were no accept headers which matched OR
                    // There were acceptHeaders which matched but there was no formatter
                    // which supported any of them.
                    // In any of these cases, if the user has specified content types,
                    // do a last effort to find a formatter which can write any of the user specified content type.
                    selectedFormatter = SelectFormatterUsingAnyAcceptableContentType(
                        formatterContext,
                        formatters,
                        contentTypes);
                }
            }

            return(selectedFormatter);
        }
Esempio n. 33
0
 public abstract Task WriteAsync(OutputFormatterWriteContext context);
 public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context) => Task.CompletedTask;
 public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
 {
     return(context.HttpContext.Response.WriteAsync(this.ToHtml(context)));
 }
    /// <inheritdoc />
    public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
    {
        if (context == null)
        {
            throw new ArgumentNullException(nameof(context));
        }

        if (selectedEncoding == null)
        {
            throw new ArgumentNullException(nameof(selectedEncoding));
        }

        // Compat mode for derived options
        _jsonOptions ??= context.HttpContext.RequestServices.GetRequiredService <IOptions <MvcNewtonsoftJsonOptions> >().Value;

        var response = context.HttpContext.Response;

        var responseStream = response.Body;
        FileBufferingWriteStream?fileBufferingWriteStream = null;

        if (!_mvcOptions.SuppressOutputFormatterBuffering)
        {
            fileBufferingWriteStream = new FileBufferingWriteStream(_jsonOptions.OutputFormatterMemoryBufferThreshold);
            responseStream           = fileBufferingWriteStream;
        }

        var value = context.Object;

        if (value is not null && _asyncEnumerableReaderFactory.TryGetReader(value.GetType(), out var reader))
        {
            var logger = context.HttpContext.RequestServices.GetRequiredService <ILogger <NewtonsoftJsonOutputFormatter> >();
            Log.BufferingAsyncEnumerable(logger, value);
            try
            {
                value = await reader(value, context.HttpContext.RequestAborted);
            }
            catch (OperationCanceledException) when(context.HttpContext.RequestAborted.IsCancellationRequested)
            {
            }

            if (context.HttpContext.RequestAborted.IsCancellationRequested)
            {
                return;
            }
        }

        try
        {
            await using (var writer = context.WriterFactory(responseStream, selectedEncoding))
            {
                using var jsonWriter = CreateJsonWriter(writer);
                var jsonSerializer = CreateJsonSerializer(context);
                jsonSerializer.Serialize(jsonWriter, value);
            }

            if (fileBufferingWriteStream != null)
            {
                response.ContentLength = fileBufferingWriteStream.Length;
                await fileBufferingWriteStream.DrainBufferAsync(response.BodyWriter);
            }
        }
        finally
        {
            if (fileBufferingWriteStream != null)
            {
                await fileBufferingWriteStream.DisposeAsync();
            }
        }
    }
Esempio n. 37
0
 public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
 {
     return(jsonOutputFormatter.WriteResponseBodyAsync(context, selectedEncoding));
 }
Esempio n. 38
0
 public override void WriteResponseHeaders(OutputFormatterWriteContext context)
 {
     context.ContentType = "text/plain; charset=utf-8";
     base.WriteResponseHeaders(context);
 }
 public static void NoFormatter(
     this ILogger logger,
     OutputFormatterWriteContext formatterContext)
 {
     _noFormatter(logger, Convert.ToString(formatterContext.ContentType), null);
 }
Esempio n. 40
0
 // In the future, should convert to ODataEntry and use ODL to write out.
 // Or use ODL to build a JObject and use Json.NET to write out.
 public void WriteObject(Stream stream, OutputFormatterWriteContext context)
 {
     new ODataJsonSerializer(context).WriteJson(context.Object, stream);
 }
Esempio n. 41
0
        public static IOutputFormatter SelectFormatter(this HttpContext context, OutputFormatterWriteContext writeContext)
        {
            var outputFormatterSelector = context.RequestServices.GetRequiredService <OutputFormatterSelector>();

            return(outputFormatterSelector.SelectFormatter(writeContext, Array.Empty <IOutputFormatter>(), new MediaTypeCollection()));
        }
Esempio n. 42
0
 public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding) =>
 // ReSharper disable once PossibleNullReferenceException
 context.HttpContext.Response.WriteAsync(
     JsonConvert.SerializeObject(context.Object, _jsonSerializerSettings));
Esempio n. 43
0
 /// <summary>
 /// Writes the response body.
 /// </summary>
 /// <param name="context">The formatter context associated with the call.</param>
 /// <param name="selectedEncoding">Encoding.</param>
 /// <returns>
 /// A task which can write the response body.
 /// </returns>
 /// <inheritdoc />
 public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
 {
     await base.WriteResponseBodyAsync(context, selectedEncoding);
 }
Esempio n. 44
0
        /// <summary>
        /// Executes the <see cref="ObjectResult"/>.
        /// </summary>
        /// <param name="context">The <see cref="ActionContext"/> for the current request.</param>
        /// <param name="result">The <see cref="ObjectResult"/>.</param>
        /// <returns>
        /// A <see cref="Task"/> which will complete once the <see cref="ObjectResult"/> is written to the response.
        /// </returns>
        public virtual Task ExecuteAsync(ActionContext context, ObjectResult result)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            if (result == null)
            {
                throw new ArgumentNullException(nameof(result));
            }

            // If the user sets the content type both on the ObjectResult (example: by Produces) and Response object,
            // then the one set on ObjectResult takes precedence over the Response object
            if (result.ContentTypes == null || result.ContentTypes.Count == 0)
            {
                var responseContentType = context.HttpContext.Response.ContentType;
                if (!string.IsNullOrEmpty(responseContentType))
                {
                    if (result.ContentTypes == null)
                    {
                        result.ContentTypes = new MediaTypeCollection();
                    }

                    result.ContentTypes.Add(responseContentType);
                }
            }

            ValidateContentTypes(result.ContentTypes);

            var formatters = result.Formatters;

            if (formatters == null || formatters.Count == 0)
            {
                formatters = OptionsFormatters;

                // Complain about MvcOptions.OutputFormatters only if the result has an empty Formatters.
                Debug.Assert(formatters != null, "MvcOptions.OutputFormatters cannot be null.");
                if (formatters.Count == 0)
                {
                    throw new InvalidOperationException(Resources.FormatOutputFormattersAreRequired(
                                                            typeof(MvcOptions).FullName,
                                                            nameof(MvcOptions.OutputFormatters),
                                                            typeof(IOutputFormatter).FullName));
                }
            }

            var objectType = result.DeclaredType;

            if (objectType == null || objectType == typeof(object))
            {
                objectType = result.Value?.GetType();
            }

            var formatterContext = new OutputFormatterWriteContext(
                context.HttpContext,
                WriterFactory,
                objectType,
                result.Value);

            var selectedFormatter = SelectFormatter(formatterContext, result.ContentTypes, formatters);

            if (selectedFormatter == null)
            {
                // No formatter supports this.
                Logger.NoFormatter(formatterContext);

                context.HttpContext.Response.StatusCode = StatusCodes.Status406NotAcceptable;
                return(Task.CompletedTask);
            }

            Logger.FormatterSelected(selectedFormatter, formatterContext);
            Logger.ObjectResultExecuting(context);

            result.OnFormatting(context);
            return(selectedFormatter.WriteAsync(formatterContext));
        }
Esempio n. 45
0
 public async Task WriteAsync(OutputFormatterWriteContext context)
 {
     var response = context.HttpContext.Response;
     await response.WriteAsync("barfoo");
 }
        public async override Task WriteResponseBodyAsync(OutputFormatterWriteContext context)
        {
            var response = context.HttpContext.Response;

            Type type = context.Object.GetType();
            Type itemType;

            if (type.GetGenericArguments().Length > 0)
            {
                itemType = type.GetGenericArguments()[0];
            }
            else
            {
                itemType = type.GetElementType();
            }

            StringWriter _stringWriter = new StringWriter();

            if (_options.UseSingleLineHeaderInCsv)
            {
                _stringWriter.WriteLine(
                    string.Join <string>(
                        _options.CsvDelimiter, itemType.GetProperties().Select(x => x.Name)
                        )
                    );
            }


            foreach (var obj in (IEnumerable <object>)context.Object)
            {
                var vals = obj.GetType().GetProperties().Select(
                    pi => new {
                    Value = pi.GetValue(obj, null),
                    Type  = pi.PropertyType    // ここ追加して
                }
                    );

                string _valueLine = string.Empty;

                foreach (var val in vals)
                {
                    if (val.Value != null)
                    {
                        var _val = val.Value.ToString();

                        //Check if the value contans a comma and place it in quotes if so
                        //if (val.Type == typeof(string) || _val.Contains(","))

                        // val.Type == typeof(string) を判定に追加
                        if (val.Type == typeof(string) || _val.Contains(","))
                        {
                            _val = string.Concat("\"", _val, "\"");
                        }

                        //Replace any \r or \n special characters from a new line with a space
                        if (_val.Contains("\r"))
                        {
                            _val = _val.Replace("\r", " ");
                        }
                        if (_val.Contains("\n"))
                        {
                            _val = _val.Replace("\n", " ");
                        }



                        _valueLine = string.Concat(_valueLine, _val, _options.CsvDelimiter);
                    }
                    else
                    {
                        _valueLine = string.Concat(_valueLine, string.Empty, _options.CsvDelimiter);
                    }
                }

                _stringWriter.WriteLine(_valueLine.TrimEnd(_options.CsvDelimiter.ToCharArray()));
            }

            // var streamWriter = new StreamWriter(response.Body); // ここを以下に

            // UTF-8
            // var streamWriter = new StreamWriter(response.Body, new UTF8Encoding(true));

            // SHIFT-JIS
            var streamWriter = new StreamWriter(
                response.Body,
                Encoding.GetEncoding("shift_jis",
                                     new EncoderReplacementFallback("□"),
                                     DecoderFallback.ReplacementFallback));

            await streamWriter.WriteAsync(_stringWriter.ToString());

            await streamWriter.FlushAsync();
        }
 public override Task WriteResponseBodyAsync
     (OutputFormatterWriteContext context,
     Encoding selectedEncoding)
 {
     throw new NotImplementedException();
 }
Esempio n. 48
0
        public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
        {
            var query = (IQueryable)context.Object;

            var queryString = context.HttpContext.Request.QueryString;
            var columns     = queryString.Value.Contains("$select") ?
                              OutputFormatter.GetPropertiesFromSelect(queryString.Value, query.ElementType) :
                              OutputFormatter.GetProperties(query.ElementType);


            var stream = new MemoryStream();

            using (var document = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook))
            {
                var workbookPart = document.AddWorkbookPart();
                workbookPart.Workbook = new Workbook();

                var worksheetPart = workbookPart.AddNewPart <WorksheetPart>();
                worksheetPart.Worksheet = new Worksheet();

                var workbookStylesPart = workbookPart.AddNewPart <WorkbookStylesPart>();
                GenerateWorkbookStylesPartContent(workbookStylesPart);

                var sheets = workbookPart.Workbook.AppendChild(new Sheets());
                var sheet  = new Sheet()
                {
                    Id = workbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Sheet1"
                };
                sheets.Append(sheet);

                workbookPart.Workbook.Save();

                var sheetData = worksheetPart.Worksheet.AppendChild(new SheetData());

                var headerRow = new Row();

                foreach (var column in columns)
                {
                    headerRow.Append(new Cell()
                    {
                        CellValue = new CellValue(column.Key),
                        DataType  = new EnumValue <CellValues>(CellValues.String)
                    });
                }

                sheetData.AppendChild(headerRow);

                foreach (var item in query)
                {
                    var row = new Row();

                    foreach (var column in columns)
                    {
                        var value       = OutputFormatter.GetValue(item, column.Key);
                        var stringValue = value.ToString();

                        var cell = new Cell();

                        var underlyingType = column.Value.IsGenericType &&
                                             column.Value.GetGenericTypeDefinition() == typeof(Nullable <>) ?
                                             Nullable.GetUnderlyingType(column.Value) : column.Value;

                        var typeCode = Type.GetTypeCode(underlyingType);

                        if (typeCode == TypeCode.DateTime)
                        {
                            if (stringValue != string.Empty)
                            {
                                cell.CellValue = new CellValue()
                                {
                                    Text = DateTime.Parse(stringValue).ToOADate().ToString()
                                };
                                cell.StyleIndex = (UInt32Value)1U;
                            }
                        }
                        else if (typeCode == TypeCode.Boolean)
                        {
                            cell.CellValue = new CellValue(stringValue.ToLower());
                            cell.DataType  = new EnumValue <CellValues>(CellValues.Boolean);
                        }
                        else if (IsNumeric(typeCode))
                        {
                            cell.CellValue = new CellValue(stringValue);
                            cell.DataType  = new EnumValue <CellValues>(CellValues.Number);
                        }
                        else
                        {
                            cell.CellValue = new CellValue(stringValue);
                            cell.DataType  = new EnumValue <CellValues>(CellValues.String);
                        }

                        row.Append(cell);
                    }

                    sheetData.AppendChild(row);
                }


                workbookPart.Workbook.Save();
            }

            if (stream?.Length > 0)
            {
                stream.Seek(0, SeekOrigin.Begin);
            }

            return(stream.CopyToAsync(context.HttpContext.Response.Body));
        }
        public void WriteResponse_GetMediaTypeWithCharsetReturnsSameString_IfCharsetEqualToEncoding()
        {
            // Arrange
            var formatter = new TestOutputFormatter();

            var contentType = "application/json; charset=utf-16";
            var formatterContext = new OutputFormatterWriteContext(
                new DefaultHttpContext(),
                new TestHttpResponseStreamWriterFactory().CreateWriter,
                objectType: null,
                @object: null)
            {
                ContentType = new StringSegment(contentType),
            };

            formatter.SupportedMediaTypes.Add("application/json");
            formatter.SupportedEncodings.Add(Encoding.Unicode);

            // Act
            formatter.WriteAsync(formatterContext);

            // Assert
            Assert.Same(contentType, formatterContext.ContentType.Buffer);
        }
Esempio n. 50
0
        public async override Task WriteResponseBodyAsync(OutputFormatterWriteContext context)
        {
            var response = context.HttpContext.Response;

            Type type = context.Object.GetType();
            Type itemType;

            if (type.GetGenericArguments().Length > 0)
            {
                itemType = type.GetGenericArguments()[0];
            }
            else
            {
                itemType = type.GetElementType();
            }

            var streamWriter = new StreamWriter(response.Body, Encoding.GetEncoding(_options.Encoding));

            if (_options.UseSingleLineHeaderInCsv)
            {
                await streamWriter.WriteLineAsync(
                    string.Join(
                        _options.CsvDelimiter, itemType.GetProperties().Select(x => x.GetCustomAttribute <DisplayAttribute>(false)?.Name ?? x.Name)
                        )
                    );
            }

            foreach (var obj in (IEnumerable <object>)context.Object)
            {
                var vals = obj.GetType().GetProperties().Select(
                    pi => new
                {
                    Value = pi.GetValue(obj, null)
                }
                    );

                string valueLine = string.Empty;

                foreach (var val in vals)
                {
                    if (val.Value != null)
                    {
                        var _val = val.Value.ToString();

                        //Escape quotas
                        _val = _val.Replace("\"", "\"\"");

                        //Check if the value contans a delimiter and place it in quotes if so
                        if (_val.Contains(_options.CsvDelimiter))
                        {
                            _val = string.Concat("\"", _val, "\"");
                        }

                        //Replace any \r or \n special characters from a new line with a space
                        if (_val.Contains("\r"))
                        {
                            _val = _val.Replace("\r", " ");
                        }
                        if (_val.Contains("\n"))
                        {
                            _val = _val.Replace("\n", " ");
                        }

                        valueLine = string.Concat(valueLine, _val, _options.CsvDelimiter);
                    }
                    else
                    {
                        valueLine = string.Concat(valueLine, string.Empty, _options.CsvDelimiter);
                    }
                }

                await streamWriter.WriteLineAsync(valueLine.TrimEnd(_options.CsvDelimiter.ToCharArray()));
            }

            await streamWriter.FlushAsync();
        }
        public async Task WriteAsync_ReturnsNotAcceptable_IfSelectCharacterEncodingReturnsNull()
        {
            // Arrange
            var formatter = new OverrideEncodingFormatter(encoding: null);

            var testContentType = new StringSegment("text/json");
            formatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/json"));

            var context = new OutputFormatterWriteContext(
                new DefaultHttpContext(),
                new TestHttpResponseStreamWriterFactory().CreateWriter,
                objectType: null,
                @object: null)
            {
                ContentType = testContentType,
            };

            // Act
            await formatter.WriteAsync(context);

            // Assert
            Assert.Equal(StatusCodes.Status406NotAcceptable, context.HttpContext.Response.StatusCode);
        }
Esempio n. 52
0
 public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
 {
     return(Task.FromResult(0));
 }
 public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
 {
     return Task.FromResult(true);
 }
Esempio n. 54
0
 public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context)
 {
     return(Task.FromResult(0));
 }
        public void WriteResponse_OverridesCharset_IfDifferentFromContentTypeCharset(
            string contentType,
            string expectedContentType)
        {
            // Arrange
            var formatter = new OverrideEncodingFormatter(Encoding.UTF32);

            var formatterContext = new OutputFormatterWriteContext(
                new DefaultHttpContext(),
                new TestHttpResponseStreamWriterFactory().CreateWriter,
                objectType: null,
                @object: null)
            {
                ContentType = new StringSegment(contentType),
            };

            // Act
            formatter.WriteAsync(formatterContext);

            // Assert
            Assert.Equal(new StringSegment(expectedContentType), formatterContext.ContentType);
        }
Esempio n. 56
0
 public Task WriteAsync(OutputFormatterWriteContext context)
 {
     return(Task.FromResult(0));
 }
 public Task WriteAsync(OutputFormatterWriteContext context)
 {
     return Task.FromResult(true);
 }
 private T GetService <T>(OutputFormatterWriteContext context)
 {
     return(context.HttpContext.RequestServices.GetService <T>());
 }
Esempio n. 59
0
        public async override Task WriteResponseBodyAsync(OutputFormatterWriteContext context)
        {
            var response = context.HttpContext.Response;

            Type type = context.Object.GetType();
            Type itemType;

            if (type.GetGenericArguments().Length > 0)
            {
                itemType = type.GetGenericArguments()[0];
            }
            else
            {
                itemType = type.GetElementType();
            }

            var streamWriter = new StreamWriter(response.Body, Encoding.GetEncoding(_options.Encoding));

            if (_options.IncludeExcelDelimiterHeader)
            {
                await streamWriter.WriteLineAsync($"sep ={_options.CsvDelimiter}");
            }

            if (_options.UseSingleLineHeaderInCsv)
            {
                var values = useJsonAttributes
                    ? itemType.GetProperties().Where(pi => !pi.GetCustomAttributes <JsonIgnoreAttribute>(false).Any())    // Only get the properties that do not define JsonIgnore
                             .Select(pi => new
                {
                    Order = pi.GetCustomAttribute <JsonPropertyAttribute>(false)?.Order ?? 0,
                    Prop  = pi
                }).OrderBy(d => d.Order).Select(d => GetDisplayNameFromNewtonsoftJsonAnnotations(d.Prop))
                    : itemType.GetProperties().Select(pi => pi.GetCustomAttribute <DisplayAttribute>(false)?.Name ?? pi.Name);

                await streamWriter.WriteLineAsync(string.Join(_options.CsvDelimiter, values));
            }


            foreach (var obj in (IEnumerable <object>)context.Object)
            {
                var vals = useJsonAttributes
                    ? obj.GetType().GetProperties()
                           .Where(pi => !pi.GetCustomAttributes <JsonIgnoreAttribute>().Any())
                           .Select(pi => new
                {
                    Order = pi.GetCustomAttribute <JsonPropertyAttribute>(false)?.Order ?? 0,
                    Value = pi.GetValue(obj, null)
                }).OrderBy(d => d.Order).Select(d => new { d.Value })
                    : obj.GetType().GetProperties().Select(
                    pi => new
                {
                    Value = pi.GetValue(obj, null)
                });

                string valueLine = string.Empty;

                foreach (var val in vals)
                {
                    if (val.Value != null)
                    {
                        var _val = val.Value.ToString();

                        //Escape quotas
                        _val = _val.Replace("\"", "\"\"");

                        //Check if the value contans a delimiter and place it in quotes if so
                        if (_val.Contains(_options.CsvDelimiter))
                        {
                            _val = string.Concat("\"", _val, "\"");
                        }

                        //Replace any \r or \n special characters from a new line with a space
                        if (_val.Contains("\r"))
                        {
                            _val = _val.Replace("\r", " ");
                        }
                        if (_val.Contains("\n"))
                        {
                            _val = _val.Replace("\n", " ");
                        }

                        valueLine = string.Concat(valueLine, _val, _options.CsvDelimiter);
                    }
                    else
                    {
                        valueLine = string.Concat(valueLine, string.Empty, _options.CsvDelimiter);
                    }
                }

                await streamWriter.WriteLineAsync(valueLine.Remove(valueLine.Length - _options.CsvDelimiter.Length));
            }

            await streamWriter.FlushAsync();
        }
Esempio n. 60
0
 public override Encoding SelectCharacterEncoding(OutputFormatterWriteContext context)
 {
     return(_encoding);
 }