diff --git a/build.sbt b/build.sbt index 2b8b495..31855d0 100644 --- a/build.sbt +++ b/build.sbt @@ -4,7 +4,7 @@ organization := "com.mdialog" version := "2.1.0" -scalaVersion := "2.11.0" +scalaVersion := "2.10.4" scalacOptions ++= Seq( "-unchecked", diff --git a/src/main/scala/smoke/Request.scala b/src/main/scala/smoke/Request.scala index bba8b33..27199ca 100644 --- a/src/main/scala/smoke/Request.scala +++ b/src/main/scala/smoke/Request.scala @@ -1,6 +1,7 @@ package smoke import java.net.{ URI, URLDecoder } +import util.parsing.json.JSON trait Request extends Headers { val version: String @@ -44,6 +45,8 @@ trait Request extends Headers { lazy val formParams: Map[String, String] = contentType match { case Some("application/x-www-form-urlencoded") ⇒ parseParams(body) + case Some(s) if s startsWith "application/json" => parseParamsJson(body) + case _ ⇒ Map.empty } @@ -90,6 +93,15 @@ trait Request extends Headers { case _ ⇒ None }).toSeq.flatten toMap + protected def parseParamsJson( params :String) :Map[String,String] = { + JSON.parseFull( params ) match { + case None => Map.empty + case m1 => + val m = m1.get.asInstanceOf[Map[String,Any]] + m mapValues (_.toString) + } + } + protected def decode(s: String) = URLDecoder.decode(s, "UTF-8") } diff --git a/src/main/scala/smoke/StaticAssets.scala b/src/main/scala/smoke/StaticAssets.scala index 8d72b00..bd4cb92 100644 --- a/src/main/scala/smoke/StaticAssets.scala +++ b/src/main/scala/smoke/StaticAssets.scala @@ -25,10 +25,31 @@ trait StaticAssets { bytes } + def readFileFromStream( file :String ) :Array[Byte] = { + val is = getClass.getResourceAsStream( file ) + + val BUFFER_SIZE=64*1024 + val baos = new java.io.ByteArrayOutputStream(BUFFER_SIZE) + val buffer = new Array[Byte](BUFFER_SIZE) + var n = -1 + + n = is.read( buffer, 0, BUFFER_SIZE ) + while( n > 0 ) { + baos.write( buffer, 0, n ) + n = is.read( buffer, 0, BUFFER_SIZE ) + } + is.close + baos.toByteArray + } + private lazy val assetFolder = Option(this.getClass.getClassLoader.getResource(publicFolder)) match { - case Some(url) ⇒ url.toString.split("file:").last - case _ ⇒ throw new Exception("Error: static assets folder is not accessible") + case Some(url) ⇒ url.toString.split("file:").last.split("!").last + case x ⇒ throw new Exception("Error: static assets folder is not accessible: "+ x ) } + private lazy val bIsInJar = Option(getClass.getClassLoader.getResource(publicFolder)) match { + case Some(url) => url.toString .contains( "!/" ) + case _ => false + } private def loadAssets(folder: File): Seq[(String, Asset)] = folder.exists match { @@ -52,15 +73,24 @@ trait StaticAssets { else (path: String) ⇒ try { - val file = new File(s"$assetFolder$path") - val extension = getExtension(file.getName) - Some(Asset(MimeType(extension), readFile(file))) + + val fileToGet=s"$assetFolder$path" + val extension = getExtension(fileToGet) + + if( bIsInJar ) { + Some( Asset(MimeType(extension), readFileFromStream(fileToGet) ) ) + } else { + val file = new File(fileToGet) + Some( Asset(MimeType(extension), readFile(file))) + } + } catch { case e: FileNotFoundException ⇒ None } if (cacheAssetsPreload && cacheAssets) cachedAssets + def responseFromAsset(path: String): Response = { loadAsset(path) match { case Some(asset) ⇒ diff --git a/src/test/scala/smoke/RequestTest.scala b/src/test/scala/smoke/RequestTest.scala index ceed26c..5116a8f 100644 --- a/src/test/scala/smoke/RequestTest.scala +++ b/src/test/scala/smoke/RequestTest.scala @@ -385,6 +385,16 @@ class RequestTest extends FunSpecLike { headers = Seq("Content-Type" -> "application/x-www-form-urlencoded")) assert(request.formParams === Map("val" -> "some value")) } + it("should handle json post") { + val uri = "http://test.host" + val request = new test.TestRequest(uri, + body = """{ "a" : "1", "b" : "zzz" }""", + headers = Seq("Content-Type" -> "application/json")) + + assert(request.params === Map( + "a" -> "1", + "b" -> "zzz")) + } } describe("params") { @@ -398,6 +408,7 @@ class RequestTest extends FunSpecLike { "query val" -> "some value", "form val" -> "other value")) } + } }