{"action":"created","comment":{"url":"https://api.github.com/repos/Zewo/Zewo/pulls/comments/80636461","pull_request_review_id":1680394,"id":80636461,"diff_hunk":"@@ -1,56 +1,302 @@\n import CHTTPParser\n+import Core\n \n-typealias Parser = UnsafeMutablePointer<http_parser>\n+public class Parser: Core.Parser {\n+    public typealias Result = Message\n+    public typealias Error = http_errno\n+    \n+    public enum Mode {\n+        case request\n+        case response\n+    }\n+    \n+    private enum State: Int {\n+        case none = 1\n+        case messageBegin = 2\n+        case url = 3\n+        case status = 4\n+        case headerField = 5\n+        case headerValue = 6\n+        case headersComplete = 7\n+        case body = 8\n+        case messageComplete = 9\n+    }\n+    \n+    private class Context {\n+        var method: Request.Method? = nil\n+        var status: Response.Status? = nil\n+        var version: Version? = nil\n+        var url: URL? = nil\n+        var headers: [CaseInsensitiveString: String] = [:]\n+        var body: Buffer = Buffer()\n+        \n+        var currentBuffer = Buffer()\n+        var currentHeaderField: CaseInsensitiveString? = nil\n+        \n+        func addValueForCurrentHeaderField(_ value: String) {\n+            let key = currentHeaderField!\n+            if let existing = headers[key] {\n+                headers[key] = \"\\(existing), \\(value)\"\n+            } else {\n+                headers[key] = value\n+            }\n+        }\n+    }\n+    \n+    public var parser: http_parser\n+    public var parserSettings: http_parser_settings\n+    public let mode: Mode\n+    \n+    private var state: State = .none\n+    private var context = Context()\n+    \n+    private var messages: [Message] = []\n+    \n+    public init(mode: Mode) {\n+        var parser = http_parser()\n+        \n+        switch mode {\n+        case .request:\n+            http_parser_init(&parser, HTTP_REQUEST)\n+        case .response:\n+            http_parser_init(&parser, HTTP_RESPONSE)\n+        }\n+        \n+        var parserSettings = http_parser_settings()\n+        http_parser_settings_init(&parserSettings)\n+        \n+        parserSettings.on_message_begin = { (parser: UnsafeMutablePointer<http_parser>?) -> Int32 in\n+            let ref = Unmanaged<Parser>.fromOpaque(parser!.pointee.data).takeUnretainedValue()\n+            return ref.processOnMessageBegin()\n+        }\n+        parserSettings.on_url = { (parser: UnsafeMutablePointer<http_parser>?, data: UnsafePointer<Int8>?, length: Int) -> Int32 in\n+            let ref = Unmanaged<Parser>.fromOpaque(parser!.pointee.data).takeUnretainedValue()\n+            return ref.processOnURL(data: data!, length: length)\n+        }\n+        parserSettings.on_status = { (parser: UnsafeMutablePointer<http_parser>?, data: UnsafePointer<Int8>?, length: Int) -> Int32 in\n+            let ref = Unmanaged<Parser>.fromOpaque(parser!.pointee.data).takeUnretainedValue()\n+            return ref.processOnStatus(data: data!, length: length)\n+        }\n+        parserSettings.on_header_field = { (parser: UnsafeMutablePointer<http_parser>?, data: UnsafePointer<Int8>?, length: Int) -> Int32 in\n+            let ref = Unmanaged<Parser>.fromOpaque(parser!.pointee.data).takeUnretainedValue()\n+            return ref.processOnHeaderField(data: data!, length: length)\n+        }\n+        parserSettings.on_header_value = { (parser: UnsafeMutablePointer<http_parser>?, data: UnsafePointer<Int8>?, length: Int) -> Int32 in\n+            let ref = Unmanaged<Parser>.fromOpaque(parser!.pointee.data).takeUnretainedValue()\n+            return ref.processOnHeaderValue(data: data!, length: length)\n+        }\n+        parserSettings.on_headers_complete = { (parser: UnsafeMutablePointer<http_parser>?) -> Int32 in\n+            let ref = Unmanaged<Parser>.fromOpaque(parser!.pointee.data).takeUnretainedValue()\n+            return ref.processOnHeadersComplete()\n+        }\n+        parserSettings.on_body = { (parser: UnsafeMutablePointer<http_parser>?, data: UnsafePointer<Int8>?, length: Int) -> Int32 in\n+            let ref = Unmanaged<Parser>.fromOpaque(parser!.pointee.data).takeUnretainedValue()\n+            return ref.processOnBody(data: data!, length: length)\n+        }\n+        parserSettings.on_message_complete = { (parser: UnsafeMutablePointer<http_parser>?) -> Int32 in\n+            let ref = Unmanaged<Parser>.fromOpaque(parser!.pointee.data).takeUnretainedValue()\n+            return ref.processOnMessageComplete()\n+        }\n+        \n+        self.parser = parser\n+        self.parserSettings = parserSettings\n+        self.mode = mode\n+        \n+        self.parser.data = Unmanaged.passUnretained(self).toOpaque()\n+    }\n+    \n+    public func parse(_ from: UnsafeBufferPointer<UInt8>, handler: (Message) throws -> Void) throws {\n+        while !messages.isEmpty {\n+            try handler(messages.remove(at: 0))\n+        }\n+        \n+        guard !from.isEmpty else {\n+            return\n+        }\n+        \n+        let processedCount = from.baseAddress!.withMemoryRebound(to: Int8.self, capacity: from.count) {\n+            return http_parser_execute(&self.parser, &self.parserSettings, $0, from.count)\n+        }\n+        guard processedCount == from.count else {\n+            throw Parser.Error(parser.http_errno)\n+        }\n+        \n+        while !messages.isEmpty {\n+            try handler(messages.remove(at: 0))\n+        }\n+    }\n+    \n+    private func processOnMessageBegin() -> Int32 {\n+        process(state: .messageBegin)\n+        return 0\n+    }\n+    \n+    private func processOnURL(data: UnsafePointer<Int8>, length: Int) -> Int32 {\n+        process(state: .url, data: UnsafeBufferPointer<Int8>(start: data, count: length))\n+        return 0\n+    }\n+    \n+    private func processOnStatus(data: UnsafePointer<Int8>, length: Int) -> Int32 {\n+        process(state: .status, data: UnsafeBufferPointer<Int8>(start: data, count: length))\n+        return 0\n+    }\n+    \n+    private func processOnHeaderField(data: UnsafePointer<Int8>, length: Int) -> Int32 {\n+        process(state: .headerField, data: UnsafeBufferPointer<Int8>(start: data, count: length))\n+        return 0\n+    }\n+    \n+    private func processOnHeaderValue(data: UnsafePointer<Int8>, length: Int) -> Int32 {\n+        process(state: .headerValue, data: UnsafeBufferPointer<Int8>(start: data, count: length))\n+        return 0\n+    }\n+    \n+    private func processOnHeadersComplete() -> Int32 {\n+        process(state: .headersComplete)\n+        return 0\n+    }\n+    \n+    private func processOnBody(data: UnsafePointer<Int8>, length: Int) -> Int32 {\n+        process(state: .body, data: UnsafeBufferPointer<Int8>(start: data, count: length))\n+        return 0\n+    }\n+    \n+    private func processOnMessageComplete() -> Int32 {\n+        process(state: .messageComplete)\n+        return 0\n+    }\n+    \n+    private func process(state newState: State, data: UnsafeBufferPointer<Int8>? = nil) {\n+        if state != newState {\n+            \n+            switch state {\n+            case .none, .messageBegin, .messageComplete:\n+                break\n+                \n+            case .url:\n+                let string = String(bytes: context.currentBuffer, encoding: String.Encoding.utf8)!\n+                context.url = URL(string: string)!\n+                \n+            case .status:\n+                let string = String(bytes: context.currentBuffer, encoding: String.Encoding.utf8)!\n+                context.status = Response.Status(statusCode: Int(parser.status_code),\n+                                                 reasonPhrase: string)\n+                \n+            case .headerField:\n+                let string = String(bytes: context.currentBuffer, encoding: String.Encoding.utf8)!\n+                context.currentHeaderField = CaseInsensitiveString(string)\n+                \n+                \n+            case .headerValue:\n+                let string = String(bytes: context.currentBuffer, encoding: String.Encoding.utf8)!\n+                context.addValueForCurrentHeaderField(string)\n+                \n+            case .headersComplete:\n+                context.currentHeaderField = nil\n+                context.method = Request.Method(code: http_method(rawValue: parser.method))\n+                context.version = Version(major: Int(parser.http_major), minor: Int(parser.http_minor))\n+                \n+            case .body:\n+                context.body = context.currentBuffer\n+                \n+            }\n+            \n+            context.currentBuffer = DispatchData.empty\n+            state = newState\n+            \n+            if state == .messageComplete {\n+                let message: Message\n+                switch mode {\n+                case .request:\n+                    var request = Request(method: context.method!,\n+                                          url: context.url!,\n+                                          headers: Headers(),\n+                                          body: .buffer(context.body))\n+                    request.headers = Headers(context.headers)\n+                    \n+                    message = request\n+                case .response:\n+                    let cookieHeaders =\n+                        self.context.headers\n+                            .filter { $0.key == \"Set-Cookie\" }\n+                            .map { $0.value }\n+                            .reduce(Set<String>()) { initial, value in\n+                                return initial.union(Set(value.components(separatedBy: \", \")))","path":"Modules/HTTP/Sources/HTTP/Parser/Parser.swift","position":225,"original_position":225,"commit_id":"080fbac0f2674ed01169bae005e583e4444647f1","original_commit_id":"c42162e503a4ffd5f8c23c695f9a6b601ac789db","user":{"login":"robertjpayne","id":214288,"avatar_url":"https://avatars.githubusercontent.com/u/214288?v=3","gravatar_id":"","url":"https://api.github.com/users/robertjpayne","html_url":"https://github.com/robertjpayne","followers_url":"https://api.github.com/users/robertjpayne/followers","following_url":"https://api.github.com/users/robertjpayne/following{/other_user}","gists_url":"https://api.github.com/users/robertjpayne/gists{/gist_id}","starred_url":"https://api.github.com/users/robertjpayne/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/robertjpayne/subscriptions","organizations_url":"https://api.github.com/users/robertjpayne/orgs","repos_url":"https://api.github.com/users/robertjpayne/repos","events_url":"https://api.github.com/users/robertjpayne/events{/privacy}","received_events_url":"https://api.github.com/users/robertjpayne/received_events","type":"User","site_admin":false},"body":"one-off per request, not worth it? We were using a bunch of filters before in the old old parser!","created_at":"2016-09-27T07:47:39Z","updated_at":"2016-09-27T07:47:39Z","html_url":"https://github.com/Zewo/Zewo/pull/162#discussion_r80636461","pull_request_url":"https://api.github.com/repos/Zewo/Zewo/pulls/162","_links":{"self":{"href":"https://api.github.com/repos/Zewo/Zewo/pulls/comments/80636461"},"html":{"href":"https://github.com/Zewo/Zewo/pull/162#discussion_r80636461"},"pull_request":{"href":"https://api.github.com/repos/Zewo/Zewo/pulls/162"}}},"pull_request":{"url":"https://api.github.com/repos/Zewo/Zewo/pulls/162","id":86874552,"html_url":"https://github.com/Zewo/Zewo/pull/162","diff_url":"https://github.com/Zewo/Zewo/pull/162.diff","patch_url":"https://github.com/Zewo/Zewo/pull/162.patch","issue_url":"https://api.github.com/repos/Zewo/Zewo/issues/162","number":162,"state":"open","locked":false,"title":"Parser Protocol + Dual Mode Parser","user":{"login":"robertjpayne","id":214288,"avatar_url":"https://avatars.githubusercontent.com/u/214288?v=3","gravatar_id":"","url":"https://api.github.com/users/robertjpayne","html_url":"https://github.com/robertjpayne","followers_url":"https://api.github.com/users/robertjpayne/followers","following_url":"https://api.github.com/users/robertjpayne/following{/other_user}","gists_url":"https://api.github.com/users/robertjpayne/gists{/gist_id}","starred_url":"https://api.github.com/users/robertjpayne/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/robertjpayne/subscriptions","organizations_url":"https://api.github.com/users/robertjpayne/orgs","repos_url":"https://api.github.com/users/robertjpayne/repos","events_url":"https://api.github.com/users/robertjpayne/events{/privacy}","received_events_url":"https://api.github.com/users/robertjpayne/received_events","type":"User","site_admin":false},"body":"@Danappelxx @paulofaria \r\n\r\nThis PR implements a few things:\r\n\r\n* Merges HTTP Request+Response into one\r\n* Adds `Parser` protocol","created_at":"2016-09-27T07:22:11Z","updated_at":"2016-09-27T07:47:39Z","closed_at":null,"merged_at":null,"merge_commit_sha":"62cd1f30182351d4d3f494481ae6f193bb7f8433","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/Zewo/Zewo/pulls/162/commits","review_comments_url":"https://api.github.com/repos/Zewo/Zewo/pulls/162/comments","review_comment_url":"https://api.github.com/repos/Zewo/Zewo/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Zewo/Zewo/issues/162/comments","statuses_url":"https://api.github.com/repos/Zewo/Zewo/statuses/080fbac0f2674ed01169bae005e583e4444647f1","head":{"label":"Zewo:feature/merged-http-parsers","ref":"feature/merged-http-parsers","sha":"080fbac0f2674ed01169bae005e583e4444647f1","user":{"login":"Zewo","id":12739462,"avatar_url":"https://avatars.githubusercontent.com/u/12739462?v=3","gravatar_id":"","url":"https://api.github.com/users/Zewo","html_url":"https://github.com/Zewo","followers_url":"https://api.github.com/users/Zewo/followers","following_url":"https://api.github.com/users/Zewo/following{/other_user}","gists_url":"https://api.github.com/users/Zewo/gists{/gist_id}","starred_url":"https://api.github.com/users/Zewo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Zewo/subscriptions","organizations_url":"https://api.github.com/users/Zewo/orgs","repos_url":"https://api.github.com/users/Zewo/repos","events_url":"https://api.github.com/users/Zewo/events{/privacy}","received_events_url":"https://api.github.com/users/Zewo/received_events","type":"Organization","site_admin":false},"repo":{"id":45657428,"name":"Zewo","full_name":"Zewo/Zewo","owner":{"login":"Zewo","id":12739462,"avatar_url":"https://avatars.githubusercontent.com/u/12739462?v=3","gravatar_id":"","url":"https://api.github.com/users/Zewo","html_url":"https://github.com/Zewo","followers_url":"https://api.github.com/users/Zewo/followers","following_url":"https://api.github.com/users/Zewo/following{/other_user}","gists_url":"https://api.github.com/users/Zewo/gists{/gist_id}","starred_url":"https://api.github.com/users/Zewo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Zewo/subscriptions","organizations_url":"https://api.github.com/users/Zewo/orgs","repos_url":"https://api.github.com/users/Zewo/repos","events_url":"https://api.github.com/users/Zewo/events{/privacy}","received_events_url":"https://api.github.com/users/Zewo/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Zewo/Zewo","description":"Open source Swift libraries for modern server software.","fork":false,"url":"https://api.github.com/repos/Zewo/Zewo","forks_url":"https://api.github.com/repos/Zewo/Zewo/forks","keys_url":"https://api.github.com/repos/Zewo/Zewo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Zewo/Zewo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Zewo/Zewo/teams","hooks_url":"https://api.github.com/repos/Zewo/Zewo/hooks","issue_events_url":"https://api.github.com/repos/Zewo/Zewo/issues/events{/number}","events_url":"https://api.github.com/repos/Zewo/Zewo/events","assignees_url":"https://api.github.com/repos/Zewo/Zewo/assignees{/user}","branches_url":"https://api.github.com/repos/Zewo/Zewo/branches{/branch}","tags_url":"https://api.github.com/repos/Zewo/Zewo/tags","blobs_url":"https://api.github.com/repos/Zewo/Zewo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Zewo/Zewo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Zewo/Zewo/git/refs{/sha}","trees_url":"https://api.github.com/repos/Zewo/Zewo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Zewo/Zewo/statuses/{sha}","languages_url":"https://api.github.com/repos/Zewo/Zewo/languages","stargazers_url":"https://api.github.com/repos/Zewo/Zewo/stargazers","contributors_url":"https://api.github.com/repos/Zewo/Zewo/contributors","subscribers_url":"https://api.github.com/repos/Zewo/Zewo/subscribers","subscription_url":"https://api.github.com/repos/Zewo/Zewo/subscription","commits_url":"https://api.github.com/repos/Zewo/Zewo/commits{/sha}","git_commits_url":"https://api.github.com/repos/Zewo/Zewo/git/commits{/sha}","comments_url":"https://api.github.com/repos/Zewo/Zewo/comments{/number}","issue_comment_url":"https://api.github.com/repos/Zewo/Zewo/issues/comments{/number}","contents_url":"https://api.github.com/repos/Zewo/Zewo/contents/{+path}","compare_url":"https://api.github.com/repos/Zewo/Zewo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Zewo/Zewo/merges","archive_url":"https://api.github.com/repos/Zewo/Zewo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Zewo/Zewo/downloads","issues_url":"https://api.github.com/repos/Zewo/Zewo/issues{/number}","pulls_url":"https://api.github.com/repos/Zewo/Zewo/pulls{/number}","milestones_url":"https://api.github.com/repos/Zewo/Zewo/milestones{/number}","notifications_url":"https://api.github.com/repos/Zewo/Zewo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Zewo/Zewo/labels{/name}","releases_url":"https://api.github.com/repos/Zewo/Zewo/releases{/id}","deployments_url":"https://api.github.com/repos/Zewo/Zewo/deployments","created_at":"2015-11-06T03:41:36Z","updated_at":"2016-09-27T07:27:09Z","pushed_at":"2016-09-27T07:36:41Z","git_url":"git://github.com/Zewo/Zewo.git","ssh_url":"git@github.com:Zewo/Zewo.git","clone_url":"https://github.com/Zewo/Zewo.git","svn_url":"https://github.com/Zewo/Zewo","homepage":"http://zewo.io","size":3543,"stargazers_count":1277,"watchers_count":1277,"language":"Swift","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":73,"mirror_url":null,"open_issues_count":42,"forks":73,"open_issues":42,"watchers":1277,"default_branch":"master"}},"base":{"label":"Zewo:master","ref":"master","sha":"50c1a138fbdb9df4785975af2e6ecba9afd170d2","user":{"login":"Zewo","id":12739462,"avatar_url":"https://avatars.githubusercontent.com/u/12739462?v=3","gravatar_id":"","url":"https://api.github.com/users/Zewo","html_url":"https://github.com/Zewo","followers_url":"https://api.github.com/users/Zewo/followers","following_url":"https://api.github.com/users/Zewo/following{/other_user}","gists_url":"https://api.github.com/users/Zewo/gists{/gist_id}","starred_url":"https://api.github.com/users/Zewo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Zewo/subscriptions","organizations_url":"https://api.github.com/users/Zewo/orgs","repos_url":"https://api.github.com/users/Zewo/repos","events_url":"https://api.github.com/users/Zewo/events{/privacy}","received_events_url":"https://api.github.com/users/Zewo/received_events","type":"Organization","site_admin":false},"repo":{"id":45657428,"name":"Zewo","full_name":"Zewo/Zewo","owner":{"login":"Zewo","id":12739462,"avatar_url":"https://avatars.githubusercontent.com/u/12739462?v=3","gravatar_id":"","url":"https://api.github.com/users/Zewo","html_url":"https://github.com/Zewo","followers_url":"https://api.github.com/users/Zewo/followers","following_url":"https://api.github.com/users/Zewo/following{/other_user}","gists_url":"https://api.github.com/users/Zewo/gists{/gist_id}","starred_url":"https://api.github.com/users/Zewo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Zewo/subscriptions","organizations_url":"https://api.github.com/users/Zewo/orgs","repos_url":"https://api.github.com/users/Zewo/repos","events_url":"https://api.github.com/users/Zewo/events{/privacy}","received_events_url":"https://api.github.com/users/Zewo/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Zewo/Zewo","description":"Open source Swift libraries for modern server software.","fork":false,"url":"https://api.github.com/repos/Zewo/Zewo","forks_url":"https://api.github.com/repos/Zewo/Zewo/forks","keys_url":"https://api.github.com/repos/Zewo/Zewo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Zewo/Zewo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Zewo/Zewo/teams","hooks_url":"https://api.github.com/repos/Zewo/Zewo/hooks","issue_events_url":"https://api.github.com/repos/Zewo/Zewo/issues/events{/number}","events_url":"https://api.github.com/repos/Zewo/Zewo/events","assignees_url":"https://api.github.com/repos/Zewo/Zewo/assignees{/user}","branches_url":"https://api.github.com/repos/Zewo/Zewo/branches{/branch}","tags_url":"https://api.github.com/repos/Zewo/Zewo/tags","blobs_url":"https://api.github.com/repos/Zewo/Zewo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Zewo/Zewo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Zewo/Zewo/git/refs{/sha}","trees_url":"https://api.github.com/repos/Zewo/Zewo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Zewo/Zewo/statuses/{sha}","languages_url":"https://api.github.com/repos/Zewo/Zewo/languages","stargazers_url":"https://api.github.com/repos/Zewo/Zewo/stargazers","contributors_url":"https://api.github.com/repos/Zewo/Zewo/contributors","subscribers_url":"https://api.github.com/repos/Zewo/Zewo/subscribers","subscription_url":"https://api.github.com/repos/Zewo/Zewo/subscription","commits_url":"https://api.github.com/repos/Zewo/Zewo/commits{/sha}","git_commits_url":"https://api.github.com/repos/Zewo/Zewo/git/commits{/sha}","comments_url":"https://api.github.com/repos/Zewo/Zewo/comments{/number}","issue_comment_url":"https://api.github.com/repos/Zewo/Zewo/issues/comments{/number}","contents_url":"https://api.github.com/repos/Zewo/Zewo/contents/{+path}","compare_url":"https://api.github.com/repos/Zewo/Zewo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Zewo/Zewo/merges","archive_url":"https://api.github.com/repos/Zewo/Zewo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Zewo/Zewo/downloads","issues_url":"https://api.github.com/repos/Zewo/Zewo/issues{/number}","pulls_url":"https://api.github.com/repos/Zewo/Zewo/pulls{/number}","milestones_url":"https://api.github.com/repos/Zewo/Zewo/milestones{/number}","notifications_url":"https://api.github.com/repos/Zewo/Zewo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Zewo/Zewo/labels{/name}","releases_url":"https://api.github.com/repos/Zewo/Zewo/releases{/id}","deployments_url":"https://api.github.com/repos/Zewo/Zewo/deployments","created_at":"2015-11-06T03:41:36Z","updated_at":"2016-09-27T07:27:09Z","pushed_at":"2016-09-27T07:36:41Z","git_url":"git://github.com/Zewo/Zewo.git","ssh_url":"git@github.com:Zewo/Zewo.git","clone_url":"https://github.com/Zewo/Zewo.git","svn_url":"https://github.com/Zewo/Zewo","homepage":"http://zewo.io","size":3543,"stargazers_count":1277,"watchers_count":1277,"language":"Swift","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":73,"mirror_url":null,"open_issues_count":42,"forks":73,"open_issues":42,"watchers":1277,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Zewo/Zewo/pulls/162"},"html":{"href":"https://github.com/Zewo/Zewo/pull/162"},"issue":{"href":"https://api.github.com/repos/Zewo/Zewo/issues/162"},"comments":{"href":"https://api.github.com/repos/Zewo/Zewo/issues/162/comments"},"review_comments":{"href":"https://api.github.com/repos/Zewo/Zewo/pulls/162/comments"},"review_comment":{"href":"https://api.github.com/repos/Zewo/Zewo/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Zewo/Zewo/pulls/162/commits"},"statuses":{"href":"https://api.github.com/repos/Zewo/Zewo/statuses/080fbac0f2674ed01169bae005e583e4444647f1"}}}}
{"actor":{"display_login":"robertjpayne"}}