{"action":"created","comment":{"url":"https://api.github.com/repos/xitrum-framework/xitrum/pulls/comments/34436109","id":34436109,"diff_hunk":"@@ -0,0 +1,124 @@\n+package xitrum.params\n+\n+import org.scalatest.BeforeAndAfter\n+import org.scalatest.FlatSpec\n+import org.scalatest.Matchers\n+import xitrum.Action\n+import xitrum.Server\n+import xitrum.annotation.GET\n+import xitrum.annotation.POST\n+import com.m3.curly.scala.HTTP\n+import org.json4s._\n+import org.json4s.jackson.JsonMethods._\n+import org.json4s.jackson.Serialization\n+import org.json4s.jackson.Serialization.{ read }\n+import xitrum.SkipCsrfCheck\n+import com.m3.curly.scala.Response\n+import io.netty.handler.codec.http.HttpHeaders\n+import com.m3.curly.scala.Request\n+\n+case class ParamsPathResponse(path: String)\n+case class ParamsQueryResponse(key: Int, keys: Seq[Int])\n+case class ParamsPayloadResponse(key: Int, keys: Seq[Int], locale: String, optional: Option[String])\n+\n+@GET(\"/test/params/path/:path\")\n+@POST(\"/test/params/path/:path\")\n+class ParamsPathTestAction extends Action with SkipCsrfCheck {\n+\n+  def execute {\n+    respondJson(ParamsPathResponse(param(\"path\")))\n+  }\n+\n+}\n+\n+@GET(\"test/params/query\")\n+@POST(\"test/params/query\")\n+class ParamsQueryTestAction extends Action with SkipCsrfCheck {\n+\n+  def execute {\n+    val key = param[Int](\"key\")\n+    val keys = params[Int](\"keys\")\n+\n+    respondJson(ParamsQueryResponse(key, keys))\n+  }\n+\n+}\n+\n+@POST(\"test/params/payload\")\n+class ParamsPayloadTestAction extends Action with SkipCsrfCheck {\n+\n+  def execute {\n+    val key = param[Int](\"key\")\n+    val keys = params[Int](\"keys\")\n+    val locale = param[String](\"locale\")\n+    val optional = paramo[String](\"optional\")\n+\n+    respondJson(ParamsPayloadResponse(key, keys, locale, optional))\n+  }\n+\n+}\n+\n+class ParamsTest extends FlatSpec with Matchers with BeforeAndAfter {\n+\n+  implicit val formats = Serialization.formats(NoTypeHints)\n+\n+  val base = \"http://127.0.0.1:8000\"\n+\n+  behavior of \"param* method\"\n+\n+  before {\n+    Server.start()\n+  }\n+\n+  after {\n+    Server.stop()\n+  }\n+\n+  \"[GET] param\" should \"extract string value from path\" in {\n+    val response = HTTP.get(s\"$base/test/params/path/test-value\")\n+    shouldEqual(response, ParamsPathResponse(\"test-value\"))\n+  }\n+\n+  \"[POST] param\" should \"extract string value from path\" in {\n+    val response = HTTP.post(s\"$base/test/params/path/test-value\")\n+    shouldEqual(response, ParamsPathResponse(\"test-value\"))\n+  }\n+\n+  \"[GET] param\" should \"extract int value/s from query\" in {\n+    val response = HTTP.get(s\"$base/test/params/query\", \"key\" -> 1, \"keys\" -> 2, \"keys\" -> 3)\n+    shouldEqual(response, ParamsQueryResponse(1, Seq(2, 3)))\n+  }\n+\n+  \"[POST] param\" should \"extract int value/s from query\" in {\n+    val response = HTTP.post(s\"$base/test/params/query?key=1&keys=2&keys=3\")\n+    shouldEqual(response, ParamsQueryResponse(1, Seq(2, 3)))\n+  }\n+\n+  \"[POST] param\" should \"extract values from application/x-www-form-urlencoded payload\" in {\n+    val request = Request(s\"$base/test/params/payload\")\n+      .header(HttpHeaders.Names.CONTENT_TYPE, HttpHeaders.Values.APPLICATION_X_WWW_FORM_URLENCODED)\n+      .body(\"key=1&keys=2&keys=3&locale=ru-RU&optional=value\".getBytes,\n+        HttpHeaders.Values.APPLICATION_X_WWW_FORM_URLENCODED)\n+    val response = HTTP.post(request)\n+    shouldEqual(response, ParamsPayloadResponse(1, Seq(2, 3), \"ru-RU\", Some(\"value\")))\n+  }\n+\n+  \"[POST] param\" should \"extract values from application/json payload\" in {\n+    val request = Request(s\"$base/test/params/payload\")\n+      .header(HttpHeaders.Names.CONTENT_TYPE, \"application/json\")\n+      .body(\"\"\"{\"key\": 1, \"keys\": [2, 3], \"locale\": \"ru-RU\", \"optional\": \"value\"}\"\"\".getBytes,\n+        \"application/json\")\n+    val response = HTTP.post(request)\n+    shouldEqual(response, ParamsPayloadResponse(1, Seq(2, 3), \"ru-RU\", Some(\"value\")))\n+  }\n+\n+  private def shouldEqual[T](response: Response, expected: T)(implicit formats: Formats, mf: Manifest[T]) = {\n+    if (response.status != 200) {\n+      println(s\"[DEBUG] Response dump:\\n${response.textBody}\\n------\")\n+    }\n+    \n+    response.status should equal(200)\n+    read[T](response.textBody) shouldEqual (expected)\n+  }\n+\n+}","path":"src/test/scala/xitrum/params/ParamsTest.scala","position":null,"original_position":124,"commit_id":"d1b66f3589a789c93f4b7f6cd81193209b40a083","original_commit_id":"a2b186d866453f432d189982d3e158f67cab1604","user":{"login":"caiiiycuk","id":1727152,"avatar_url":"https://avatars.githubusercontent.com/u/1727152?v=3","gravatar_id":"","url":"https://api.github.com/users/caiiiycuk","html_url":"https://github.com/caiiiycuk","followers_url":"https://api.github.com/users/caiiiycuk/followers","following_url":"https://api.github.com/users/caiiiycuk/following{/other_user}","gists_url":"https://api.github.com/users/caiiiycuk/gists{/gist_id}","starred_url":"https://api.github.com/users/caiiiycuk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caiiiycuk/subscriptions","organizations_url":"https://api.github.com/users/caiiiycuk/orgs","repos_url":"https://api.github.com/users/caiiiycuk/repos","events_url":"https://api.github.com/users/caiiiycuk/events{/privacy}","received_events_url":"https://api.github.com/users/caiiiycuk/received_events","type":"User","site_admin":false},"body":"Also fixed","created_at":"2015-07-13T06:33:14Z","updated_at":"2015-07-13T06:33:14Z","html_url":"https://github.com/xitrum-framework/xitrum/pull/551#discussion_r34436109","pull_request_url":"https://api.github.com/repos/xitrum-framework/xitrum/pulls/551","_links":{"self":{"href":"https://api.github.com/repos/xitrum-framework/xitrum/pulls/comments/34436109"},"html":{"href":"https://github.com/xitrum-framework/xitrum/pull/551#discussion_r34436109"},"pull_request":{"href":"https://api.github.com/repos/xitrum-framework/xitrum/pulls/551"}}},"pull_request":{"url":"https://api.github.com/repos/xitrum-framework/xitrum/pulls/551","id":39777848,"html_url":"https://github.com/xitrum-framework/xitrum/pull/551","diff_url":"https://github.com/xitrum-framework/xitrum/pull/551.diff","patch_url":"https://github.com/xitrum-framework/xitrum/pull/551.patch","issue_url":"https://api.github.com/repos/xitrum-framework/xitrum/issues/551","number":551,"state":"open","locked":false,"title":"https://github.com/xitrum-framework/xitrum/issues/550","user":{"login":"caiiiycuk","id":1727152,"avatar_url":"https://avatars.githubusercontent.com/u/1727152?v=3","gravatar_id":"","url":"https://api.github.com/users/caiiiycuk","html_url":"https://github.com/caiiiycuk","followers_url":"https://api.github.com/users/caiiiycuk/followers","following_url":"https://api.github.com/users/caiiiycuk/following{/other_user}","gists_url":"https://api.github.com/users/caiiiycuk/gists{/gist_id}","starred_url":"https://api.github.com/users/caiiiycuk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caiiiycuk/subscriptions","organizations_url":"https://api.github.com/users/caiiiycuk/orgs","repos_url":"https://api.github.com/users/caiiiycuk/repos","events_url":"https://api.github.com/users/caiiiycuk/events{/privacy}","received_events_url":"https://api.github.com/users/caiiiycuk/received_events","type":"User","site_admin":false},"body":"params extraction also works for request with content type application/json\r\n\r\n--\r\nAny advice is more than welcomed and very much appreciated","created_at":"2015-07-13T04:13:38Z","updated_at":"2015-07-13T06:33:14Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ac94d56160f2df5bd2276d8c060599da8c600aeb","assignee":null,"milestone":{"url":"https://api.github.com/repos/xitrum-framework/xitrum/milestones/30","html_url":"https://github.com/xitrum-framework/xitrum/milestones/Xitrum%203.24.1","labels_url":"https://api.github.com/repos/xitrum-framework/xitrum/milestones/30/labels","id":1125010,"number":30,"title":"Xitrum 3.24.1","description":"Big features:\r\nhttps://groups.google.com/forum/#!topic/xitrum-framework/-8iK4mIBBQg\r\n\r\n------------\r\n\r\nchill-akka\r\n\r\n------------\r\n\r\nOptimize xitrum-scalate by writing directly to Netty's ByteBuf (response.content)?\r\nhttps://github.com/ngocdaothanh/xitrum-scalate/issues/8\r\nAlso try to improve/remove ByteBufUtil.\r\n\r\nMake Scalatags default, instead of Scalate?\r\n\r\n------------\r\n\r\nMore idea:\r\n* http://www.quora.com/Startups/What-are-some-common-architectural-design-flaws-at-the-early-stages-of-a-website-which-might-later-make-it-difficult-to-scale\r\n* http://normanmaurer.me/presentations/2014-facebook-eng-netty/slides.html\r\n* Play 2.x Roadmap: https://docs.google.com/document/d/11sVi1-REAIDFVHvwBrfRt1uXkBzROHQYgmcZNGJtDnA/pub\r\n\r\n------------\r\n\r\nscassets\r\n\r\nGroup:\r\n\r\nAssets.jsGroup(\"main.js\", List(\r\n  \"1.coffee\", \"2.js\", \"3.coffee\"\r\n))\r\n\r\nAssets.cssGroup(\"main.css\", List(\r\n  \"1.less\", \"2.css\"\r\n))\r\n\r\n=> compile output: main-<hash>.js, main-<hash>.min.js\r\n\r\nurlAsset\r\n\r\n------------\r\n\r\nMQTT:\r\nhttp://netty.io/news/2014/07/04/4-1-0-Beta1.html\r\nhttp://mobilebit.wordpress.com/2013/05/03/rest-is-for-sleeping-mqtt-is-for-mobile/\r\nhttps://www.facebook.com/notes/facebook-engineering/building-facebook-messenger/10150259350998920\r\nhttp://stackoverflow.com/questions/7129821/mqtt-vs-xmpp-which-should-i-choose\r\n\r\n-----------------------------------------\r\n\r\nThere are actually quite a few hacks already in Rails for Internet Explorer. I think most users expect Rails to make Internet Explorer behave as expected, without having to understand the problems that give rise to the issues in question, as long as we don't resort to sniffing IE in particular.\r\n\r\nIE hacks already in Rails:\r\n\r\nRails modifies original_filename on uploaded file objects to hack around a bug where Internet Explorer was giving full Windows file paths\r\nFiles sent via send_file set Content-Type to application/octet-stream to work around quirks in IE involving SSL\r\nFiles sent via send_file set Cache-Control to \"private\" because the default \"no-cache\" broke the open/save dialog\r\nHTTP authentication handles a case in IE where the URL sent in the Authorization header is absolute (containing http:// etc)\r\nWe also handle (by default) a quirk in some versions of Safari in which it sends a trailing null character at the end of params, and another in which it does not correctly handle an empty body (so we send \" \" for render :text => :none)\r\n\r\nRails has always handled weird Internet Explorer quirks, because (like when using a JavaScript library), Rails users don't even want to know that these problems exist. If they had to wait until the first time a user reported a bug with a file download, research it, and find the Rails plugin that patched the cache headers, they would be (correctly) quite frustrated.\r\n\r\nAgain, the line that I personally draw is that we don't fix any user-agent bugs that absolutely require sniffing. Otherwise, making the vast majority of both Rails developers and users of applications written in Rails blissfully unaware of Internet Explorer quirks is what we're here for.\r\n\r\n-- wycats","creator":{"login":"ngocdaothanh","id":10095,"avatar_url":"https://avatars.githubusercontent.com/u/10095?v=3","gravatar_id":"","url":"https://api.github.com/users/ngocdaothanh","html_url":"https://github.com/ngocdaothanh","followers_url":"https://api.github.com/users/ngocdaothanh/followers","following_url":"https://api.github.com/users/ngocdaothanh/following{/other_user}","gists_url":"https://api.github.com/users/ngocdaothanh/gists{/gist_id}","starred_url":"https://api.github.com/users/ngocdaothanh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ngocdaothanh/subscriptions","organizations_url":"https://api.github.com/users/ngocdaothanh/orgs","repos_url":"https://api.github.com/users/ngocdaothanh/repos","events_url":"https://api.github.com/users/ngocdaothanh/events{/privacy}","received_events_url":"https://api.github.com/users/ngocdaothanh/received_events","type":"User","site_admin":false},"open_issues":10,"closed_issues":3,"state":"open","created_at":"2015-05-22T07:05:19Z","updated_at":"2015-07-13T06:16:28Z","due_on":"2015-06-29T14:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/xitrum-framework/xitrum/pulls/551/commits","review_comments_url":"https://api.github.com/repos/xitrum-framework/xitrum/pulls/551/comments","review_comment_url":"https://api.github.com/repos/xitrum-framework/xitrum/pulls/comments{/number}","comments_url":"https://api.github.com/repos/xitrum-framework/xitrum/issues/551/comments","statuses_url":"https://api.github.com/repos/xitrum-framework/xitrum/statuses/d1b66f3589a789c93f4b7f6cd81193209b40a083","head":{"label":"caiiiycuk:issue_550","ref":"issue_550","sha":"d1b66f3589a789c93f4b7f6cd81193209b40a083","user":{"login":"caiiiycuk","id":1727152,"avatar_url":"https://avatars.githubusercontent.com/u/1727152?v=3","gravatar_id":"","url":"https://api.github.com/users/caiiiycuk","html_url":"https://github.com/caiiiycuk","followers_url":"https://api.github.com/users/caiiiycuk/followers","following_url":"https://api.github.com/users/caiiiycuk/following{/other_user}","gists_url":"https://api.github.com/users/caiiiycuk/gists{/gist_id}","starred_url":"https://api.github.com/users/caiiiycuk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caiiiycuk/subscriptions","organizations_url":"https://api.github.com/users/caiiiycuk/orgs","repos_url":"https://api.github.com/users/caiiiycuk/repos","events_url":"https://api.github.com/users/caiiiycuk/events{/privacy}","received_events_url":"https://api.github.com/users/caiiiycuk/received_events","type":"User","site_admin":false},"repo":{"id":8022667,"name":"xitrum","full_name":"caiiiycuk/xitrum","owner":{"login":"caiiiycuk","id":1727152,"avatar_url":"https://avatars.githubusercontent.com/u/1727152?v=3","gravatar_id":"","url":"https://api.github.com/users/caiiiycuk","html_url":"https://github.com/caiiiycuk","followers_url":"https://api.github.com/users/caiiiycuk/followers","following_url":"https://api.github.com/users/caiiiycuk/following{/other_user}","gists_url":"https://api.github.com/users/caiiiycuk/gists{/gist_id}","starred_url":"https://api.github.com/users/caiiiycuk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/caiiiycuk/subscriptions","organizations_url":"https://api.github.com/users/caiiiycuk/orgs","repos_url":"https://api.github.com/users/caiiiycuk/repos","events_url":"https://api.github.com/users/caiiiycuk/events{/privacy}","received_events_url":"https://api.github.com/users/caiiiycuk/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/caiiiycuk/xitrum","description":"Async and clustered Scala web framework and HTTP(S) server for Rails developers","fork":true,"url":"https://api.github.com/repos/caiiiycuk/xitrum","forks_url":"https://api.github.com/repos/caiiiycuk/xitrum/forks","keys_url":"https://api.github.com/repos/caiiiycuk/xitrum/keys{/key_id}","collaborators_url":"https://api.github.com/repos/caiiiycuk/xitrum/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/caiiiycuk/xitrum/teams","hooks_url":"https://api.github.com/repos/caiiiycuk/xitrum/hooks","issue_events_url":"https://api.github.com/repos/caiiiycuk/xitrum/issues/events{/number}","events_url":"https://api.github.com/repos/caiiiycuk/xitrum/events","assignees_url":"https://api.github.com/repos/caiiiycuk/xitrum/assignees{/user}","branches_url":"https://api.github.com/repos/caiiiycuk/xitrum/branches{/branch}","tags_url":"https://api.github.com/repos/caiiiycuk/xitrum/tags","blobs_url":"https://api.github.com/repos/caiiiycuk/xitrum/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/caiiiycuk/xitrum/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/caiiiycuk/xitrum/git/refs{/sha}","trees_url":"https://api.github.com/repos/caiiiycuk/xitrum/git/trees{/sha}","statuses_url":"https://api.github.com/repos/caiiiycuk/xitrum/statuses/{sha}","languages_url":"https://api.github.com/repos/caiiiycuk/xitrum/languages","stargazers_url":"https://api.github.com/repos/caiiiycuk/xitrum/stargazers","contributors_url":"https://api.github.com/repos/caiiiycuk/xitrum/contributors","subscribers_url":"https://api.github.com/repos/caiiiycuk/xitrum/subscribers","subscription_url":"https://api.github.com/repos/caiiiycuk/xitrum/subscription","commits_url":"https://api.github.com/repos/caiiiycuk/xitrum/commits{/sha}","git_commits_url":"https://api.github.com/repos/caiiiycuk/xitrum/git/commits{/sha}","comments_url":"https://api.github.com/repos/caiiiycuk/xitrum/comments{/number}","issue_comment_url":"https://api.github.com/repos/caiiiycuk/xitrum/issues/comments{/number}","contents_url":"https://api.github.com/repos/caiiiycuk/xitrum/contents/{+path}","compare_url":"https://api.github.com/repos/caiiiycuk/xitrum/compare/{base}...{head}","merges_url":"https://api.github.com/repos/caiiiycuk/xitrum/merges","archive_url":"https://api.github.com/repos/caiiiycuk/xitrum/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/caiiiycuk/xitrum/downloads","issues_url":"https://api.github.com/repos/caiiiycuk/xitrum/issues{/number}","pulls_url":"https://api.github.com/repos/caiiiycuk/xitrum/pulls{/number}","milestones_url":"https://api.github.com/repos/caiiiycuk/xitrum/milestones{/number}","notifications_url":"https://api.github.com/repos/caiiiycuk/xitrum/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/caiiiycuk/xitrum/labels{/name}","releases_url":"https://api.github.com/repos/caiiiycuk/xitrum/releases{/id}","created_at":"2013-02-05T04:50:40Z","updated_at":"2014-07-11T02:14:01Z","pushed_at":"2015-07-13T06:31:46Z","git_url":"git://github.com/caiiiycuk/xitrum.git","ssh_url":"git@github.com:caiiiycuk/xitrum.git","clone_url":"https://github.com/caiiiycuk/xitrum.git","svn_url":"https://github.com/caiiiycuk/xitrum","homepage":"http://ngocdaothanh.github.com/xitrum","size":16503,"stargazers_count":0,"watchers_count":0,"language":"Scala","has_issues":false,"has_downloads":false,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"xitrum-framework:master","ref":"master","sha":"168446b8867e80f7eb527ddbb46370914808d798","user":{"login":"xitrum-framework","id":7580751,"avatar_url":"https://avatars.githubusercontent.com/u/7580751?v=3","gravatar_id":"","url":"https://api.github.com/users/xitrum-framework","html_url":"https://github.com/xitrum-framework","followers_url":"https://api.github.com/users/xitrum-framework/followers","following_url":"https://api.github.com/users/xitrum-framework/following{/other_user}","gists_url":"https://api.github.com/users/xitrum-framework/gists{/gist_id}","starred_url":"https://api.github.com/users/xitrum-framework/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xitrum-framework/subscriptions","organizations_url":"https://api.github.com/users/xitrum-framework/orgs","repos_url":"https://api.github.com/users/xitrum-framework/repos","events_url":"https://api.github.com/users/xitrum-framework/events{/privacy}","received_events_url":"https://api.github.com/users/xitrum-framework/received_events","type":"Organization","site_admin":false},"repo":{"id":785509,"name":"xitrum","full_name":"xitrum-framework/xitrum","owner":{"login":"xitrum-framework","id":7580751,"avatar_url":"https://avatars.githubusercontent.com/u/7580751?v=3","gravatar_id":"","url":"https://api.github.com/users/xitrum-framework","html_url":"https://github.com/xitrum-framework","followers_url":"https://api.github.com/users/xitrum-framework/followers","following_url":"https://api.github.com/users/xitrum-framework/following{/other_user}","gists_url":"https://api.github.com/users/xitrum-framework/gists{/gist_id}","starred_url":"https://api.github.com/users/xitrum-framework/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xitrum-framework/subscriptions","organizations_url":"https://api.github.com/users/xitrum-framework/orgs","repos_url":"https://api.github.com/users/xitrum-framework/repos","events_url":"https://api.github.com/users/xitrum-framework/events{/privacy}","received_events_url":"https://api.github.com/users/xitrum-framework/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/xitrum-framework/xitrum","description":"Async and clustered Scala web framework and HTTP(S) server","fork":false,"url":"https://api.github.com/repos/xitrum-framework/xitrum","forks_url":"https://api.github.com/repos/xitrum-framework/xitrum/forks","keys_url":"https://api.github.com/repos/xitrum-framework/xitrum/keys{/key_id}","collaborators_url":"https://api.github.com/repos/xitrum-framework/xitrum/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/xitrum-framework/xitrum/teams","hooks_url":"https://api.github.com/repos/xitrum-framework/xitrum/hooks","issue_events_url":"https://api.github.com/repos/xitrum-framework/xitrum/issues/events{/number}","events_url":"https://api.github.com/repos/xitrum-framework/xitrum/events","assignees_url":"https://api.github.com/repos/xitrum-framework/xitrum/assignees{/user}","branches_url":"https://api.github.com/repos/xitrum-framework/xitrum/branches{/branch}","tags_url":"https://api.github.com/repos/xitrum-framework/xitrum/tags","blobs_url":"https://api.github.com/repos/xitrum-framework/xitrum/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/xitrum-framework/xitrum/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/xitrum-framework/xitrum/git/refs{/sha}","trees_url":"https://api.github.com/repos/xitrum-framework/xitrum/git/trees{/sha}","statuses_url":"https://api.github.com/repos/xitrum-framework/xitrum/statuses/{sha}","languages_url":"https://api.github.com/repos/xitrum-framework/xitrum/languages","stargazers_url":"https://api.github.com/repos/xitrum-framework/xitrum/stargazers","contributors_url":"https://api.github.com/repos/xitrum-framework/xitrum/contributors","subscribers_url":"https://api.github.com/repos/xitrum-framework/xitrum/subscribers","subscription_url":"https://api.github.com/repos/xitrum-framework/xitrum/subscription","commits_url":"https://api.github.com/repos/xitrum-framework/xitrum/commits{/sha}","git_commits_url":"https://api.github.com/repos/xitrum-framework/xitrum/git/commits{/sha}","comments_url":"https://api.github.com/repos/xitrum-framework/xitrum/comments{/number}","issue_comment_url":"https://api.github.com/repos/xitrum-framework/xitrum/issues/comments{/number}","contents_url":"https://api.github.com/repos/xitrum-framework/xitrum/contents/{+path}","compare_url":"https://api.github.com/repos/xitrum-framework/xitrum/compare/{base}...{head}","merges_url":"https://api.github.com/repos/xitrum-framework/xitrum/merges","archive_url":"https://api.github.com/repos/xitrum-framework/xitrum/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/xitrum-framework/xitrum/downloads","issues_url":"https://api.github.com/repos/xitrum-framework/xitrum/issues{/number}","pulls_url":"https://api.github.com/repos/xitrum-framework/xitrum/pulls{/number}","milestones_url":"https://api.github.com/repos/xitrum-framework/xitrum/milestones{/number}","notifications_url":"https://api.github.com/repos/xitrum-framework/xitrum/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/xitrum-framework/xitrum/labels{/name}","releases_url":"https://api.github.com/repos/xitrum-framework/xitrum/releases{/id}","created_at":"2010-07-19T22:58:50Z","updated_at":"2015-07-06T15:04:49Z","pushed_at":"2015-07-13T06:31:46Z","git_url":"git://github.com/xitrum-framework/xitrum.git","ssh_url":"git@github.com:xitrum-framework/xitrum.git","clone_url":"https://github.com/xitrum-framework/xitrum.git","svn_url":"https://github.com/xitrum-framework/xitrum","homepage":"http://xitrum-framework.github.io/","size":24825,"stargazers_count":321,"watchers_count":321,"language":"Scala","has_issues":true,"has_downloads":false,"has_wiki":true,"has_pages":false,"forks_count":37,"mirror_url":null,"open_issues_count":59,"forks":37,"open_issues":59,"watchers":321,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/xitrum-framework/xitrum/pulls/551"},"html":{"href":"https://github.com/xitrum-framework/xitrum/pull/551"},"issue":{"href":"https://api.github.com/repos/xitrum-framework/xitrum/issues/551"},"comments":{"href":"https://api.github.com/repos/xitrum-framework/xitrum/issues/551/comments"},"review_comments":{"href":"https://api.github.com/repos/xitrum-framework/xitrum/pulls/551/comments"},"review_comment":{"href":"https://api.github.com/repos/xitrum-framework/xitrum/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/xitrum-framework/xitrum/pulls/551/commits"},"statuses":{"href":"https://api.github.com/repos/xitrum-framework/xitrum/statuses/d1b66f3589a789c93f4b7f6cd81193209b40a083"}}}}