diff --git a/src/main/kotlin/daikon/HttpResponse.kt b/src/main/kotlin/daikon/HttpResponse.kt index ae2129b..f26e207 100644 --- a/src/main/kotlin/daikon/HttpResponse.kt +++ b/src/main/kotlin/daikon/HttpResponse.kt @@ -1,6 +1,9 @@ package daikon import java.io.StringWriter +import java.nio.charset.Charset +import java.nio.charset.StandardCharsets +import java.nio.charset.StandardCharsets.UTF_8 import javax.servlet.http.HttpServletResponse class HttpResponse(private val response: HttpServletResponse) : Response { @@ -29,6 +32,7 @@ class HttpResponse(private val response: HttpServletResponse) : Response { override fun write(text: String) { writer.write(text) + response.characterEncoding = UTF_8.name() response.writer.write(text) } } \ No newline at end of file diff --git a/src/test/kotlin/daikon/CharacterEncodingTest.kt b/src/test/kotlin/daikon/CharacterEncodingTest.kt new file mode 100644 index 0000000..c4786e4 --- /dev/null +++ b/src/test/kotlin/daikon/CharacterEncodingTest.kt @@ -0,0 +1,58 @@ +package daikon + +import daikon.Localhost.get +import daikon.Localhost.post +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import java.net.URLEncoder +import java.nio.charset.StandardCharsets.UTF_8 + +class CharacterEncodingTest { + + @Test + fun `body supports utf8`() { + HttpServer() + .get("/") { _, res -> res.write("%&è") } + .start().use { + assertThat(get("/").text).isEqualTo("%&è") + } + } + + @Test + fun `query string parameter supports utf8`() { + HttpServer() + .get("/") { req, res -> res.write(req.param("name")) } + .start().use { + assertThat(get("/?name=è$%26").text).isEqualTo("è$&") + } + } + + @Test + fun `path parameters supports utf8`() { + HttpServer() + .get("/:name") { req, res -> res.write(req.param(":name")) } + .start().use { + assertThat(get("/è%24%26").text).isEqualTo(URLEncoder.encode("è$&", UTF_8.name())) + } + } + + @Test + fun `post data supports utf8`() { + HttpServer() + .post("/") { req, res -> res.write(req.param("name")) } + .start().use { + val response = post("/", data = mapOf("name" to "è$&")) + assertThat(response.text).isEqualTo("è$&") + } + } + + @Test + fun `header does not supports utf8`() { + HttpServer() + .get("/") { req, res -> res.write(req.header("name")) } + .start().use { + val response = get("/", headers = mapOf("name" to "è$&")) + assertThat(response.text).isEqualTo("è$&") + } + } +} \ No newline at end of file