diff --git a/src/Nancy.Tests.Functional/Tests/JsonpTests.cs b/src/Nancy.Tests.Functional/Tests/JsonpTests.cs index 71e1aca1b5..5ded177276 100644 --- a/src/Nancy.Tests.Functional/Tests/JsonpTests.cs +++ b/src/Nancy.Tests.Functional/Tests/JsonpTests.cs @@ -57,7 +57,7 @@ public void Ensure_that_Jsonp_hook_does_not_affect_a_normal_json_response() Assert.Equal(HttpStatusCode.OK, result.StatusCode); Assert.Equal("true", result.Body.AsString()); - Assert.Equal("application/json", result.Context.Response.ContentType); + Assert.Equal("application/json; charset=utf8", result.Context.Response.ContentType); } [Fact] @@ -71,7 +71,7 @@ public void Ensure_that_Jsonp_hook_should_pad_a_json_response_when_callback_is_p Assert.Equal(HttpStatusCode.OK, result.StatusCode); Assert.Equal("myCallback(true);", result.Body.AsString()); - Assert.Equal("application/javascript", result.Context.Response.ContentType); + Assert.Equal("application/javascript; charset=utf8", result.Context.Response.ContentType); } } } diff --git a/src/Nancy.Tests/Unit/JsonFormatterExtensionsFixtures.cs b/src/Nancy.Tests/Unit/JsonFormatterExtensionsFixtures.cs index 8daa0f1a39..63a8a78c0b 100644 --- a/src/Nancy.Tests/Unit/JsonFormatterExtensionsFixtures.cs +++ b/src/Nancy.Tests/Unit/JsonFormatterExtensionsFixtures.cs @@ -1,9 +1,9 @@ namespace Nancy.Tests.Unit { - using System; using System.IO; using System.Text; using FakeItEasy; + using Nancy.Responses; using Nancy.Tests.Fakes; using Xunit; @@ -25,7 +25,7 @@ public JsonFormatterExtensionsFixtures() [Fact] public void Should_return_a_response_with_the_standard_json_content_type() { - response.ContentType.ShouldEqual("application/json"); + response.ContentType.ShouldEqual("application/json; charset=utf8"); } [Fact] diff --git a/src/Nancy/Json/JsonSettings.cs b/src/Nancy/Json/JsonSettings.cs index 2859c8adc8..f9686e74fe 100644 --- a/src/Nancy/Json/JsonSettings.cs +++ b/src/Nancy/Json/JsonSettings.cs @@ -18,12 +18,18 @@ public static class JsonSettings /// public static int MaxRecursions { get; set; } + /// + /// Default charset for json responses. + /// + public static string DefaultCharset { get; set; } + public static IList Converters { get; set; } static JsonSettings() { MaxJsonLength = 102400; MaxRecursions = 100; + DefaultCharset = "utf8"; Converters = new List { new TimeSpanConverter(), diff --git a/src/Nancy/Jsonp.cs b/src/Nancy/Jsonp.cs index 3cce184508..2564859863 100644 --- a/src/Nancy/Jsonp.cs +++ b/src/Nancy/Jsonp.cs @@ -1,12 +1,12 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Nancy.Bootstrapper; -using System.IO; - -namespace Nancy +namespace Nancy { + using System; + using System.IO; + using System.Linq; + + using Nancy.Json; + using Nancy.Bootstrapper; + public static class Jsonp { static PipelineItem> JsonpItem; @@ -56,7 +56,7 @@ private static void PrepareJsonp(NancyContext context) // set content type to application/javascript so browsers can handle it by default // http://stackoverflow.com/questions/111302/best-content-type-to-serve-jsonp - context.Response.ContentType = "application/javascript"; + context.Response.ContentType = "application/javascript" + (String.IsNullOrWhiteSpace(JsonSettings.DefaultCharset) ? "" : "; charset=" + JsonSettings.DefaultCharset); context.Response.Contents = stream => { // disposing of stream is handled elsewhere diff --git a/src/Nancy/Responses/JsonResponse.cs b/src/Nancy/Responses/JsonResponse.cs index bb6a603e32..99d8802e40 100644 --- a/src/Nancy/Responses/JsonResponse.cs +++ b/src/Nancy/Responses/JsonResponse.cs @@ -6,6 +6,14 @@ public class JsonResponse : Response { + private static string contentType + { + get + { + return "application/json" + (String.IsNullOrWhiteSpace(JsonSettings.DefaultCharset) ? "" : "; charset=" + JsonSettings.DefaultCharset); + } + } + public JsonResponse(TModel model, ISerializer serializer) { if (serializer == null) @@ -14,13 +22,13 @@ public JsonResponse(TModel model, ISerializer serializer) } this.Contents = GetJsonContents(model, serializer); - this.ContentType = "application/json"; + this.ContentType = contentType; this.StatusCode = HttpStatusCode.OK; } - + private static Action GetJsonContents(TModel model, ISerializer serializer) { - return stream => serializer.Serialize("application/json", model, stream); + return stream => serializer.Serialize(contentType, model, stream); } }