diff --git a/runtime/src/main/scala/com/soundcloud/twinagle/TwirpEndpointFilter.scala b/runtime/src/main/scala/com/soundcloud/twinagle/TwirpEndpointFilter.scala index a24d07c..f89a362 100644 --- a/runtime/src/main/scala/com/soundcloud/twinagle/TwirpEndpointFilter.scala +++ b/runtime/src/main/scala/com/soundcloud/twinagle/TwirpEndpointFilter.scala @@ -4,7 +4,7 @@ import com.twitter.finagle.http.{MediaType, Request, Response, Status} import com.twitter.finagle.{Filter, Service} import com.twitter.io.Buf import com.twitter.util.Future -import scalapb.json4s.JsonFormat +import scalapb.json4s.{JsonFormat, Printer} import scalapb.{GeneratedMessage, GeneratedMessageCompanion} /** @@ -17,6 +17,9 @@ private[twinagle] class TwirpEndpointFilter[ Req <: GeneratedMessage: GeneratedMessageCompanion, Rep <: GeneratedMessage: GeneratedMessageCompanion ] extends Filter[Request, Response, Req, Rep] { + + val printer = new Printer().includingDefaultValueFields + override def apply( request: Request, service: Service[Req, Rep] @@ -26,7 +29,7 @@ private[twinagle] class TwirpEndpointFilter[ service(input).map { r => val response = Response(Status.Ok) response.contentType = MediaType.Json - response.contentString = JsonFormat.toJsonString(r) + response.contentString = printer.print(r) response } case Some("application/protobuf") => diff --git a/runtime/src/test/protobuf/test.proto b/runtime/src/test/protobuf/test.proto index 64a85b2..36b95b0 100644 --- a/runtime/src/test/protobuf/test.proto +++ b/runtime/src/test/protobuf/test.proto @@ -2,4 +2,8 @@ syntax = "proto3"; package com.soundcloud.twinagle.test; -message TestMessage {}; \ No newline at end of file +message TestMessage {}; + +message HasField { + int32 foo = 1; +} \ No newline at end of file diff --git a/runtime/src/test/scala/com/soundcloud/twinagle/TwirpEndpointFilterSpec.scala b/runtime/src/test/scala/com/soundcloud/twinagle/TwirpEndpointFilterSpec.scala index 91a3b3e..fa92174 100644 --- a/runtime/src/test/scala/com/soundcloud/twinagle/TwirpEndpointFilterSpec.scala +++ b/runtime/src/test/scala/com/soundcloud/twinagle/TwirpEndpointFilterSpec.scala @@ -1,6 +1,6 @@ package com.soundcloud.twinagle -import com.soundcloud.twinagle.test.TestMessage +import com.soundcloud.twinagle.test.{HasField,TestMessage} import com.twitter.finagle.Service import com.twitter.finagle.http.{Request, Status} import com.twitter.util.{Await, Future, Throw} @@ -57,6 +57,20 @@ class TwirpEndpointFilterSpec extends Specification { response.status ==== Status.Ok response.contentString ==== "{}" } + + "serializes default values" in { + val svc = new TwirpEndpointFilter[HasField, HasField] andThen + Service.mk[HasField, HasField](msg => Future.value(msg)) + + val request = Request() + request.contentType = "application/json; charset=UTF-8" + request.contentString = "{}" + + val response = Await.result(svc(request)) + + response.status ==== Status.Ok + response.contentString ==== """{"foo":0}""" + } } "un-supported content-type" in new Context { @@ -71,7 +85,7 @@ class TwirpEndpointFilterSpec extends Specification { } } - "unspecified" in new Context { + "unspecified content-type" in new Context { val request = Request() request.contentString = "{}"