{"action":"created","comment":{"url":"https://api.github.com/repos/akka/akka/pulls/comments/72600340","id":72600340,"diff_hunk":"@@ -0,0 +1,245 @@\n+/*\n+ * Copyright (C) 2009-2015 Typesafe Inc. <http://www.typesafe.com>\n+ */\n+package akka.http.scaladsl.server.directives\n+\n+import akka.NotUsed\n+import akka.http.scaladsl.common.{ FramingWithContentType, SourceRenderingMode }\n+import akka.http.scaladsl.marshalling._\n+import akka.http.scaladsl.model._\n+import akka.http.scaladsl.unmarshalling.{ Unmarshal, Unmarshaller, _ }\n+import akka.http.scaladsl.util.FastFuture\n+import akka.stream.Materializer\n+import akka.stream.impl.ConstantFun\n+import akka.stream.scaladsl.{ Flow, Keep, Source }\n+import akka.util.ByteString\n+\n+import scala.concurrent.ExecutionContext\n+import scala.language.implicitConversions\n+\n+/**\n+ * Allows the [[MarshallingDirectives.entity]] directive to extract a [[Source]] of elements.\n+ *\n+ * See [[akka.http.scaladsl.server.EntityStreamingSupport]] for useful default [[FramingWithContentType]] instances and\n+ * support traits such as `SprayJsonSupport` (or your other favourite JSON library) to provide the needed [[Marshaller]] s.\n+ */\n+trait FramedEntityStreamingDirectives extends MarshallingDirectives {\n+  import FramedEntityStreamingDirectives._\n+\n+  type RequestToSourceUnmarshaller[T] = FromRequestUnmarshaller[Source[T, NotUsed]]\n+\n+  /**\n+   * Extracts entity as [[Source]] of elements of type `T`.\n+   * This is achieved by applying the implicitly provided (in the following order):\n+   *\n+   * - 1st: [[FramingWithContentType]] in order to chunk-up the incoming [[ByteString]]s according to the\n+   *        `Content-Type` aware framing (for example, [[akka.http.scaladsl.server.EntityStreamingSupport.bracketCountingJsonFraming]]).\n+   * - 2nd: [[Unmarshaller]] (from [[ByteString]] to `T`) for each of the respective \"chunks\" (e.g. for each JSON element contained within an array).\n+   *\n+   * The request will be rejected with an [[akka.http.scaladsl.server.UnsupportedRequestContentTypeRejection]] if\n+   * its [[ContentType]] is not supported by the used `framing` or `unmarshaller`.\n+   *\n+   * It is recommended to use the [[akka.http.scaladsl.server.EntityStreamingSupport]] trait in conjunction with this\n+   * directive as it helps provide the right [[FramingWithContentType]] and [[SourceRenderingMode]] for the most\n+   * typical usage scenarios (JSON, CSV, ...).\n+   *\n+   * Cancelling extracted [[Source]] closes the connection abruptly (same as cancelling the `entity.dataBytes`).\n+   *\n+   * If looking to improve marshalling performance in face of many elements (possibly of different sizes),\n+   * you may be interested in using [[asSourceOfAsyncUnordered]] instead.\n+   *\n+   * See also [[MiscDirectives.withoutSizeLimit]] as you may want to allow streaming infinite streams of data in this route.\n+   * By default the uploaded data is limited by the `akka.http.parsing.max-content-length`.\n+   */\n+  final def asSourceOf[T](implicit um: Unmarshaller[ByteString, T], framing: FramingWithContentType): RequestToSourceUnmarshaller[T] =\n+    asSourceOfAsync(1)(um, framing)\n+\n+  /**\n+   * Extracts entity as [[Source]] of elements of type `T`.\n+   * This is achieved by applying the implicitly provided (in the following order):\n+   *\n+   * - 1st: [[FramingWithContentType]] in order to chunk-up the incoming [[ByteString]]s according to the\n+   *        `Content-Type` aware framing (for example, [[akka.http.scaladsl.server.EntityStreamingSupport.bracketCountingJsonFraming]]).\n+   * - 2nd: [[Unmarshaller]] (from [[ByteString]] to `T`) for each of the respective \"chunks\" (e.g. for each JSON element contained within an array).\n+   *\n+   * The request will be rejected with an [[akka.http.scaladsl.server.UnsupportedRequestContentTypeRejection]] if\n+   * its [[ContentType]] is not supported by the used `framing` or `unmarshaller`.\n+   *\n+   * It is recommended to use the [[akka.http.scaladsl.server.EntityStreamingSupport]] trait in conjunction with this\n+   * directive as it helps provide the right [[FramingWithContentType]] and [[SourceRenderingMode]] for the most\n+   * typical usage scenarios (JSON, CSV, ...).\n+   *\n+   * Cancelling extracted [[Source]] closes the connection abruptly (same as cancelling the `entity.dataBytes`).\n+   *\n+   * If looking to improve marshalling performance in face of many elements (possibly of different sizes),\n+   * you may be interested in using [[asSourceOfAsyncUnordered]] instead.\n+   *\n+   * See also [[MiscDirectives.withoutSizeLimit]] as you may want to allow streaming infinite streams of data in this route.\n+   * By default the uploaded data is limited by the `akka.http.parsing.max-content-length`.\n+   */\n+  final def asSourceOf[T](framing: FramingWithContentType)(implicit um: Unmarshaller[ByteString, T]): RequestToSourceUnmarshaller[T] =\n+    asSourceOfAsync(1)(um, framing)\n+\n+  /**\n+   * Similar to [[asSourceOf]] however will apply at most `parallelism` unmarshallers in parallel.\n+   *\n+   * The source elements emitted preserve the order in which they are sent in the incoming [[HttpRequest]].\n+   * If you want to sacrivice ordering in favour of (potential) slight performance improvements in reading the input\n+   * you may want to use [[asSourceOfAsyncUnordered]] instead, which lifts the ordering guarantee.\n+   *\n+   * Refer to [[asSourceOf]] for more in depth-documentation and guidelines.\n+   *\n+   * If looking to improve marshalling performance in face of many elements (possibly of different sizes),\n+   * you may be interested in using [[asSourceOfAsyncUnordered]] instead.\n+   *\n+   * See also [[MiscDirectives.withoutSizeLimit]] as you may want to allow streaming infinite streams of data in this route.\n+   * By default the uploaded data is limited by the `akka.http.parsing.max-content-length`.\n+   */\n+  final def asSourceOfAsync[T](parallelism: Int)(implicit um: Unmarshaller[ByteString, T], framing: FramingWithContentType): RequestToSourceUnmarshaller[T] =\n+    asSourceOfInternal[T](framing, (ec, mat) ⇒ Flow[ByteString].mapAsync(parallelism)(Unmarshal(_).to[T](um, ec, mat)))\n+\n+  /**\n+   * Similar to [[asSourceOf]] however will apply at most `parallelism` unmarshallers in parallel.\n+   *\n+   * The source elements emitted preserve the order in which they are sent in the incoming [[HttpRequest]].\n+   * If you want to sacrivice ordering in favour of (potential) slight performance improvements in reading the input\n+   * you may want to use [[asSourceOfAsyncUnordered]] instead, which lifts the ordering guarantee.\n+   *\n+   * Refer to [[asSourceOf]] for more in depth-documentation and guidelines.\n+   *\n+   * See also [[MiscDirectives.withoutSizeLimit]] as you may want to allow streaming infinite streams of data in this route.\n+   * By default the uploaded data is limited by the `akka.http.parsing.max-content-length`.\n+   */\n+  final def asSourceOfAsync[T](parallelism: Int, framing: FramingWithContentType)(implicit um: Unmarshaller[ByteString, T]): RequestToSourceUnmarshaller[T] =\n+    asSourceOfAsync(parallelism)(um, framing)\n+\n+  /**\n+   * Similar to [[asSourceOfAsync]], as it will apply at most `parallelism` unmarshallers in parallel.\n+   *\n+   * The source elements emitted preserve the order in which they are sent in the incoming [[HttpRequest]].\n+   * If you want to sacrivice ordering in favour of (potential) slight performance improvements in reading the input\n+   * you may want to use [[asSourceOfAsyncUnordered]] instead, which lifts the ordering guarantee.\n+   *\n+   * Refer to [[asSourceOf]] for more in depth-documentation and guidelines.\n+   *\n+   * See also [[MiscDirectives.withoutSizeLimit]] as you may want to allow streaming infinite streams of data in this route.\n+   * By default the uploaded data is limited by the `akka.http.parsing.max-content-length`.\n+   */\n+  final def asSourceOfAsyncUnordered[T](parallelism: Int)(implicit um: Unmarshaller[ByteString, T], framing: FramingWithContentType): RequestToSourceUnmarshaller[T] =\n+    asSourceOfInternal[T](framing, (ec, mat) ⇒ Flow[ByteString].mapAsyncUnordered(parallelism)(Unmarshal(_).to[T](um, ec, mat)))\n+  /**\n+   * Similar to [[asSourceOfAsync]], as it will apply at most `parallelism` unmarshallers in parallel.\n+   *\n+   * The source elements emitted preserve the order in which they are sent in the incoming [[HttpRequest]].\n+   * If you want to sacrivice ordering in favour of (potential) slight performance improvements in reading the input\n+   * you may want to use [[asSourceOfAsyncUnordered]] instead, which lifts the ordering guarantee.\n+   *\n+   * Refer to [[asSourceOf]] for more in depth-documentation and guidelines.\n+   *\n+   * See also [[MiscDirectives.withoutSizeLimit]] as you may want to allow streaming infinite streams of data in this route.\n+   * By default the uploaded data is limited by the `akka.http.parsing.max-content-length`.\n+   */\n+  final def asSourceOfAsyncUnordered[T](parallelism: Int, framing: FramingWithContentType)(implicit um: Unmarshaller[ByteString, T]): RequestToSourceUnmarshaller[T] =\n+    asSourceOfAsyncUnordered(parallelism)(um, framing)\n+\n+  // format: OFF\n+  private final def asSourceOfInternal[T](framing: FramingWithContentType, marshalling: (ExecutionContext, Materializer) => Flow[ByteString, ByteString, NotUsed]#ReprMat[T, NotUsed]): RequestToSourceUnmarshaller[T] =\n+    Unmarshaller.withMaterializer[HttpRequest, Source[T, NotUsed]] { implicit ec ⇒ implicit mat ⇒ req ⇒\n+      val entity = req.entity\n+      if (!framing.matches(entity.contentType)) {\n+        val supportedContentTypes = framing.supported\n+        FastFuture.failed(Unmarshaller.UnsupportedContentTypeException(supportedContentTypes))","path":"akka-http/src/main/scala/akka/http/scaladsl/server/directives/FramedEntityStreamingDirectives.scala","position":151,"original_position":151,"commit_id":"02fa45bb3bc0fd1c7b7bd626ac53d466b00b08c0","original_commit_id":"02fa45bb3bc0fd1c7b7bd626ac53d466b00b08c0","user":{"login":"2beaucoup","id":243903,"avatar_url":"https://avatars.githubusercontent.com/u/243903?v=3","gravatar_id":"","url":"https://api.github.com/users/2beaucoup","html_url":"https://github.com/2beaucoup","followers_url":"https://api.github.com/users/2beaucoup/followers","following_url":"https://api.github.com/users/2beaucoup/following{/other_user}","gists_url":"https://api.github.com/users/2beaucoup/gists{/gist_id}","starred_url":"https://api.github.com/users/2beaucoup/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/2beaucoup/subscriptions","organizations_url":"https://api.github.com/users/2beaucoup/orgs","repos_url":"https://api.github.com/users/2beaucoup/repos","events_url":"https://api.github.com/users/2beaucoup/events{/privacy}","received_events_url":"https://api.github.com/users/2beaucoup/received_events","type":"User","site_admin":false},"body":"switch the if/else branches and inline `supportedContentTypes `?","created_at":"2016-07-28T10:40:08Z","updated_at":"2016-07-28T10:40:08Z","html_url":"https://github.com/akka/akka/pull/20778#discussion_r72600340","pull_request_url":"https://api.github.com/repos/akka/akka/pulls/20778","_links":{"self":{"href":"https://api.github.com/repos/akka/akka/pulls/comments/72600340"},"html":{"href":"https://github.com/akka/akka/pull/20778#discussion_r72600340"},"pull_request":{"href":"https://api.github.com/repos/akka/akka/pulls/20778"}}},"pull_request":{"url":"https://api.github.com/repos/akka/akka/pulls/20778","id":73611279,"html_url":"https://github.com/akka/akka/pull/20778","diff_url":"https://github.com/akka/akka/pull/20778.diff","patch_url":"https://github.com/akka/akka/pull/20778.patch","issue_url":"https://api.github.com/repos/akka/akka/issues/20778","number":20778,"state":"open","locked":false,"title":"+htp #18837 JSON framing and framed entity streaming directives","user":{"login":"ktoso","id":120979,"avatar_url":"https://avatars.githubusercontent.com/u/120979?v=3","gravatar_id":"","url":"https://api.github.com/users/ktoso","html_url":"https://github.com/ktoso","followers_url":"https://api.github.com/users/ktoso/followers","following_url":"https://api.github.com/users/ktoso/following{/other_user}","gists_url":"https://api.github.com/users/ktoso/gists{/gist_id}","starred_url":"https://api.github.com/users/ktoso/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ktoso/subscriptions","organizations_url":"https://api.github.com/users/ktoso/orgs","repos_url":"https://api.github.com/users/ktoso/repos","events_url":"https://api.github.com/users/ktoso/events{/privacy}","received_events_url":"https://api.github.com/users/ktoso/received_events","type":"User","site_admin":false},"body":"Revival of framed entity streaming.\r\nMissing:\r\n- [x] JavaDSL side\r\n- [x] cleanup around the content type declaring marshallers\r\n\r\nResolves https://github.com/akka/akka/issues/18837 (honestly every HTTP demo I see wants this, also @RayRoestenburg's book 😉 )\r\nMaybe this time it will get some review attention 😉 ","created_at":"2016-06-13T17:15:53Z","updated_at":"2016-07-28T10:40:08Z","closed_at":null,"merged_at":null,"merge_commit_sha":"fab1751145943ea37799e61d6f7650e28c633630","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/akka/akka/pulls/20778/commits","review_comments_url":"https://api.github.com/repos/akka/akka/pulls/20778/comments","review_comment_url":"https://api.github.com/repos/akka/akka/pulls/comments{/number}","comments_url":"https://api.github.com/repos/akka/akka/issues/20778/comments","statuses_url":"https://api.github.com/repos/akka/akka/statuses/02fa45bb3bc0fd1c7b7bd626ac53d466b00b08c0","head":{"label":"ktoso:revival-of-the-undead-json-streaming-of-doom-ktoso","ref":"revival-of-the-undead-json-streaming-of-doom-ktoso","sha":"02fa45bb3bc0fd1c7b7bd626ac53d466b00b08c0","user":{"login":"ktoso","id":120979,"avatar_url":"https://avatars.githubusercontent.com/u/120979?v=3","gravatar_id":"","url":"https://api.github.com/users/ktoso","html_url":"https://github.com/ktoso","followers_url":"https://api.github.com/users/ktoso/followers","following_url":"https://api.github.com/users/ktoso/following{/other_user}","gists_url":"https://api.github.com/users/ktoso/gists{/gist_id}","starred_url":"https://api.github.com/users/ktoso/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ktoso/subscriptions","organizations_url":"https://api.github.com/users/ktoso/orgs","repos_url":"https://api.github.com/users/ktoso/repos","events_url":"https://api.github.com/users/ktoso/events{/privacy}","received_events_url":"https://api.github.com/users/ktoso/received_events","type":"User","site_admin":false},"repo":{"id":4462204,"name":"akka","full_name":"ktoso/akka","owner":{"login":"ktoso","id":120979,"avatar_url":"https://avatars.githubusercontent.com/u/120979?v=3","gravatar_id":"","url":"https://api.github.com/users/ktoso","html_url":"https://github.com/ktoso","followers_url":"https://api.github.com/users/ktoso/followers","following_url":"https://api.github.com/users/ktoso/following{/other_user}","gists_url":"https://api.github.com/users/ktoso/gists{/gist_id}","starred_url":"https://api.github.com/users/ktoso/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ktoso/subscriptions","organizations_url":"https://api.github.com/users/ktoso/orgs","repos_url":"https://api.github.com/users/ktoso/repos","events_url":"https://api.github.com/users/ktoso/events{/privacy}","received_events_url":"https://api.github.com/users/ktoso/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ktoso/akka","description":"Akka Project","fork":true,"url":"https://api.github.com/repos/ktoso/akka","forks_url":"https://api.github.com/repos/ktoso/akka/forks","keys_url":"https://api.github.com/repos/ktoso/akka/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ktoso/akka/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ktoso/akka/teams","hooks_url":"https://api.github.com/repos/ktoso/akka/hooks","issue_events_url":"https://api.github.com/repos/ktoso/akka/issues/events{/number}","events_url":"https://api.github.com/repos/ktoso/akka/events","assignees_url":"https://api.github.com/repos/ktoso/akka/assignees{/user}","branches_url":"https://api.github.com/repos/ktoso/akka/branches{/branch}","tags_url":"https://api.github.com/repos/ktoso/akka/tags","blobs_url":"https://api.github.com/repos/ktoso/akka/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ktoso/akka/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ktoso/akka/git/refs{/sha}","trees_url":"https://api.github.com/repos/ktoso/akka/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ktoso/akka/statuses/{sha}","languages_url":"https://api.github.com/repos/ktoso/akka/languages","stargazers_url":"https://api.github.com/repos/ktoso/akka/stargazers","contributors_url":"https://api.github.com/repos/ktoso/akka/contributors","subscribers_url":"https://api.github.com/repos/ktoso/akka/subscribers","subscription_url":"https://api.github.com/repos/ktoso/akka/subscription","commits_url":"https://api.github.com/repos/ktoso/akka/commits{/sha}","git_commits_url":"https://api.github.com/repos/ktoso/akka/git/commits{/sha}","comments_url":"https://api.github.com/repos/ktoso/akka/comments{/number}","issue_comment_url":"https://api.github.com/repos/ktoso/akka/issues/comments{/number}","contents_url":"https://api.github.com/repos/ktoso/akka/contents/{+path}","compare_url":"https://api.github.com/repos/ktoso/akka/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ktoso/akka/merges","archive_url":"https://api.github.com/repos/ktoso/akka/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ktoso/akka/downloads","issues_url":"https://api.github.com/repos/ktoso/akka/issues{/number}","pulls_url":"https://api.github.com/repos/ktoso/akka/pulls{/number}","milestones_url":"https://api.github.com/repos/ktoso/akka/milestones{/number}","notifications_url":"https://api.github.com/repos/ktoso/akka/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ktoso/akka/labels{/name}","releases_url":"https://api.github.com/repos/ktoso/akka/releases{/id}","deployments_url":"https://api.github.com/repos/ktoso/akka/deployments","created_at":"2012-05-27T14:05:17Z","updated_at":"2015-04-03T11:58:56Z","pushed_at":"2016-07-27T18:05:32Z","git_url":"git://github.com/ktoso/akka.git","ssh_url":"git@github.com:ktoso/akka.git","clone_url":"https://github.com/ktoso/akka.git","svn_url":"https://github.com/ktoso/akka","homepage":"http://akka.io","size":193691,"stargazers_count":1,"watchers_count":1,"language":"Scala","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"akka:master","ref":"master","sha":"5479276b648af9fd54794beacd21fc23457714d2","user":{"login":"akka","id":1496237,"avatar_url":"https://avatars.githubusercontent.com/u/1496237?v=3","gravatar_id":"","url":"https://api.github.com/users/akka","html_url":"https://github.com/akka","followers_url":"https://api.github.com/users/akka/followers","following_url":"https://api.github.com/users/akka/following{/other_user}","gists_url":"https://api.github.com/users/akka/gists{/gist_id}","starred_url":"https://api.github.com/users/akka/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akka/subscriptions","organizations_url":"https://api.github.com/users/akka/orgs","repos_url":"https://api.github.com/users/akka/repos","events_url":"https://api.github.com/users/akka/events{/privacy}","received_events_url":"https://api.github.com/users/akka/received_events","type":"Organization","site_admin":false},"repo":{"id":130013,"name":"akka","full_name":"akka/akka","owner":{"login":"akka","id":1496237,"avatar_url":"https://avatars.githubusercontent.com/u/1496237?v=3","gravatar_id":"","url":"https://api.github.com/users/akka","html_url":"https://github.com/akka","followers_url":"https://api.github.com/users/akka/followers","following_url":"https://api.github.com/users/akka/following{/other_user}","gists_url":"https://api.github.com/users/akka/gists{/gist_id}","starred_url":"https://api.github.com/users/akka/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akka/subscriptions","organizations_url":"https://api.github.com/users/akka/orgs","repos_url":"https://api.github.com/users/akka/repos","events_url":"https://api.github.com/users/akka/events{/privacy}","received_events_url":"https://api.github.com/users/akka/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/akka/akka","description":"Akka Project","fork":false,"url":"https://api.github.com/repos/akka/akka","forks_url":"https://api.github.com/repos/akka/akka/forks","keys_url":"https://api.github.com/repos/akka/akka/keys{/key_id}","collaborators_url":"https://api.github.com/repos/akka/akka/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/akka/akka/teams","hooks_url":"https://api.github.com/repos/akka/akka/hooks","issue_events_url":"https://api.github.com/repos/akka/akka/issues/events{/number}","events_url":"https://api.github.com/repos/akka/akka/events","assignees_url":"https://api.github.com/repos/akka/akka/assignees{/user}","branches_url":"https://api.github.com/repos/akka/akka/branches{/branch}","tags_url":"https://api.github.com/repos/akka/akka/tags","blobs_url":"https://api.github.com/repos/akka/akka/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/akka/akka/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/akka/akka/git/refs{/sha}","trees_url":"https://api.github.com/repos/akka/akka/git/trees{/sha}","statuses_url":"https://api.github.com/repos/akka/akka/statuses/{sha}","languages_url":"https://api.github.com/repos/akka/akka/languages","stargazers_url":"https://api.github.com/repos/akka/akka/stargazers","contributors_url":"https://api.github.com/repos/akka/akka/contributors","subscribers_url":"https://api.github.com/repos/akka/akka/subscribers","subscription_url":"https://api.github.com/repos/akka/akka/subscription","commits_url":"https://api.github.com/repos/akka/akka/commits{/sha}","git_commits_url":"https://api.github.com/repos/akka/akka/git/commits{/sha}","comments_url":"https://api.github.com/repos/akka/akka/comments{/number}","issue_comment_url":"https://api.github.com/repos/akka/akka/issues/comments{/number}","contents_url":"https://api.github.com/repos/akka/akka/contents/{+path}","compare_url":"https://api.github.com/repos/akka/akka/compare/{base}...{head}","merges_url":"https://api.github.com/repos/akka/akka/merges","archive_url":"https://api.github.com/repos/akka/akka/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/akka/akka/downloads","issues_url":"https://api.github.com/repos/akka/akka/issues{/number}","pulls_url":"https://api.github.com/repos/akka/akka/pulls{/number}","milestones_url":"https://api.github.com/repos/akka/akka/milestones{/number}","notifications_url":"https://api.github.com/repos/akka/akka/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/akka/akka/labels{/name}","releases_url":"https://api.github.com/repos/akka/akka/releases{/id}","deployments_url":"https://api.github.com/repos/akka/akka/deployments","created_at":"2009-02-16T12:51:54Z","updated_at":"2016-07-28T10:00:15Z","pushed_at":"2016-07-28T09:50:22Z","git_url":"git://github.com/akka/akka.git","ssh_url":"git@github.com:akka/akka.git","clone_url":"https://github.com/akka/akka.git","svn_url":"https://github.com/akka/akka","homepage":"http://akka.io","size":227002,"stargazers_count":5816,"watchers_count":5816,"language":"Scala","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1840,"mirror_url":null,"open_issues_count":689,"forks":1840,"open_issues":689,"watchers":5816,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/akka/akka/pulls/20778"},"html":{"href":"https://github.com/akka/akka/pull/20778"},"issue":{"href":"https://api.github.com/repos/akka/akka/issues/20778"},"comments":{"href":"https://api.github.com/repos/akka/akka/issues/20778/comments"},"review_comments":{"href":"https://api.github.com/repos/akka/akka/pulls/20778/comments"},"review_comment":{"href":"https://api.github.com/repos/akka/akka/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/akka/akka/pulls/20778/commits"},"statuses":{"href":"https://api.github.com/repos/akka/akka/statuses/02fa45bb3bc0fd1c7b7bd626ac53d466b00b08c0"}}}}
{"actor":{"display_login":"2beaucoup"}}