From 86ff2d2d749a9b8340c71266dbc497490b95c8fa Mon Sep 17 00:00:00 2001 From: Julio Capote Date: Fri, 10 Jan 2014 12:27:51 -0800 Subject: [PATCH] routeParams are now properly urldecoded, fixes #68 --- .../scala/com/twitter/finatra/Router.scala | 10 +++++--- .../com/twitter/finatra/RouteParamsSpec.scala | 23 +++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 src/test/scala/com/twitter/finatra/RouteParamsSpec.scala diff --git a/src/main/scala/com/twitter/finatra/Router.scala b/src/main/scala/com/twitter/finatra/Router.scala index b950bbeaaf..b695c6f80b 100644 --- a/src/main/scala/com/twitter/finatra/Router.scala +++ b/src/main/scala/com/twitter/finatra/Router.scala @@ -1,11 +1,12 @@ package com.twitter.finatra import com.twitter.finagle.http.{Request => FinagleRequest, Response => FinagleResponse} -import org.jboss.netty.handler.codec.http.HttpMethod +import org.jboss.netty.handler.codec.http.{QueryStringDecoder, HttpMethod} import scala.collection.mutable.ListBuffer import scala.collection.Map import com.twitter.util.Future import com.twitter.app.App +import org.jboss.netty.util.CharsetUtil class Router(controller: Controller) extends App with Logging { @@ -34,8 +35,11 @@ class Router(controller: Controller) extends App with Logging { } } - def extractParams(request: Request, xs: Tuple2[_, _]): Map[String, String] = - request.routeParams += (xs._1.toString -> xs._2.asInstanceOf[ListBuffer[String]].head.toString) + def extractParams(request: Request, xs: Tuple2[_, _]): Map[String, String] = { + val decodedKey = QueryStringDecoder.decodeComponent(xs._1.toString, CharsetUtil.UTF_8) + val decodedValue = QueryStringDecoder.decodeComponent(xs._2.asInstanceOf[ListBuffer[String]].head.toString) + request.routeParams += (decodedKey -> decodedValue) + } def findRouteAndMatch(request: Request, method: HttpMethod): Option[(HttpMethod, PathPattern, (Request) => Future[ResponseBuilder])] = { diff --git a/src/test/scala/com/twitter/finatra/RouteParamsSpec.scala b/src/test/scala/com/twitter/finatra/RouteParamsSpec.scala new file mode 100644 index 0000000000..be85d0b2df --- /dev/null +++ b/src/test/scala/com/twitter/finatra/RouteParamsSpec.scala @@ -0,0 +1,23 @@ +package com.twitter.finatra + +import com.twitter.finatra.test.{FlatSpecHelper, SpecHelper} + +class RouteParamsSpec extends FlatSpecHelper { + + class ExampleApp extends Controller { + get("/:foo") { request => + val decoded = request.routeParams.get("foo").get + render.plain(decoded).toFuture + } + } + + val server = new FinatraServer + server.register(new ExampleApp) + + "Response" should "contain decoded params" in { + get("/hello%3Aworld") + response.body should equal("hello:world") + } + + +}