{"action":"created","comment":{"url":"https://api.github.com/repos/netty/netty/pulls/comments/49895854","id":49895854,"diff_hunk":"@@ -336,6 +339,291 @@ public boolean isRemoved() {\n         return removed;\n     }\n \n+    final void invokeChannelRegistered() {\n+        final ChannelHandlerInvoker invoker = invoker();\n+        if (handlerAdded) {\n+            invoker.invokeChannelRegistered(this);\n+        } else {\n+            invoker.executor().execute(new OneTimeTask() {\n+                @Override\n+                public void run() {\n+                    assert handlerAdded;\n+                    invoker.invokeChannelRegistered(AbstractChannelHandlerContext.this);\n+                }\n+            });\n+        }\n+    }\n+\n+    final void invokeChannelUnregistered() {\n+        final ChannelHandlerInvoker invoker = invoker();\n+        if (handlerAdded) {\n+            invoker.invokeChannelUnregistered(this);\n+        } else {\n+            invoker.executor().execute(new OneTimeTask() {\n+                @Override\n+                public void run() {\n+                    assert handlerAdded;\n+                    invoker.invokeChannelUnregistered(AbstractChannelHandlerContext.this);\n+                }\n+            });\n+        }\n+    }\n+\n+    final void invokeChannelActive() {\n+        final ChannelHandlerInvoker invoker = invoker();\n+        if (handlerAdded) {\n+            invoker.invokeChannelActive(this);\n+        } else {\n+            invoker.executor().execute(new OneTimeTask() {\n+                @Override\n+                public void run() {\n+                    assert handlerAdded;\n+                    invoker.invokeChannelActive(AbstractChannelHandlerContext.this);\n+                }\n+            });\n+        }\n+    }\n+\n+    final void invokeChannelInactive() {\n+        final ChannelHandlerInvoker invoker = invoker();\n+        if (handlerAdded) {\n+            invoker.invokeChannelInactive(this);\n+        } else {\n+            invoker.executor().execute(new OneTimeTask() {\n+                @Override\n+                public void run() {\n+                    assert handlerAdded;\n+                    invoker.invokeChannelInactive(AbstractChannelHandlerContext.this);\n+                }\n+            });\n+        }\n+    }\n+\n+    final void invokeExceptionCaught(final Throwable cause) {\n+        final ChannelHandlerInvoker invoker = invoker();\n+        if (handlerAdded) {\n+            invoker.invokeExceptionCaught(this, cause);\n+        } else {\n+            invoker.executor().execute(new OneTimeTask() {\n+                @Override\n+                public void run() {\n+                    assert handlerAdded;\n+                    invoker.invokeExceptionCaught(AbstractChannelHandlerContext.this, cause);\n+                }\n+            });\n+        }\n+    }\n+\n+    final void invokeUserEventTriggered(final Object event) {\n+        final ChannelHandlerInvoker invoker = invoker();\n+        if (handlerAdded) {\n+            invoker.invokeUserEventTriggered(this, event);\n+        } else {\n+            invoker.executor().execute(new OneTimeTask() {\n+                @Override\n+                public void run() {\n+                    assert handlerAdded;\n+                    invoker.invokeUserEventTriggered(AbstractChannelHandlerContext.this, event);\n+                }\n+            });\n+        }\n+    }\n+\n+    final void invokeChannelRead(final Object msg) {\n+        final ChannelHandlerInvoker invoker = invoker();\n+        if (handlerAdded) {\n+            invoker.invokeChannelRead(this, msg);\n+        } else {\n+            invoker.executor().execute(new OneTimeTask() {\n+                @Override\n+                public void run() {\n+                    assert handlerAdded;\n+                    invoker.invokeChannelRead(AbstractChannelHandlerContext.this, msg);\n+                }\n+            });\n+        }\n+    }\n+\n+    final void invokeChannelReadComplete() {\n+        final ChannelHandlerInvoker invoker = invoker();\n+        if (handlerAdded) {\n+            invoker.invokeChannelReadComplete(this);\n+        } else {\n+            invoker.executor().execute(new OneTimeTask() {\n+                @Override\n+                public void run() {\n+                    assert handlerAdded;\n+                    invoker.invokeChannelReadComplete(AbstractChannelHandlerContext.this);\n+                }\n+            });\n+        }\n+    }\n+\n+    final void invokeChannelWritabilityChanged() {\n+        final ChannelHandlerInvoker invoker = invoker();\n+        if (handlerAdded) {\n+            invoker.invokeChannelWritabilityChanged(this);\n+        } else {\n+            invoker.executor().execute(new OneTimeTask() {\n+                @Override\n+                public void run() {\n+                    assert handlerAdded;\n+                    invoker.invokeChannelWritabilityChanged(AbstractChannelHandlerContext.this);\n+                }\n+            });\n+        }\n+    }\n+\n+    final void invokeBind(final SocketAddress localAddress, final ChannelPromise promise) {\n+        final ChannelHandlerInvoker invoker = invoker();\n+        if (handlerAdded) {\n+            invoker.invokeBind(this, localAddress, promise);\n+        } else {\n+            invoker.executor().execute(new OneTimeTask() {\n+                @Override\n+                public void run() {\n+                    assert handlerAdded;\n+                    invoker.invokeBind(AbstractChannelHandlerContext.this, localAddress, promise);\n+                }\n+            });\n+        }\n+    }\n+\n+    final void invokeConnect(final SocketAddress remoteAddress,\n+                              final SocketAddress localAddress, final ChannelPromise promise) {\n+        final ChannelHandlerInvoker invoker = invoker();\n+        if (handlerAdded) {\n+            invoker.invokeConnect(this, remoteAddress, localAddress, promise);\n+        } else {\n+            invoker.executor().execute(new OneTimeTask() {\n+                @Override\n+                public void run() {\n+                    assert handlerAdded;\n+                    invoker.invokeConnect(AbstractChannelHandlerContext.this, remoteAddress, localAddress, promise);\n+                }\n+            });\n+        }\n+    }\n+\n+    final void invokeDisconnect(final ChannelPromise promise) {\n+        final ChannelHandlerInvoker invoker = invoker();\n+        if (handlerAdded) {\n+            invoker.invokeDisconnect(this, promise);\n+        } else {\n+            invoker.executor().execute(new OneTimeTask() {\n+                @Override\n+                public void run() {\n+                    assert handlerAdded;\n+                    invoker.invokeDisconnect(AbstractChannelHandlerContext.this, promise);\n+                }\n+            });\n+        }\n+    }\n+\n+    final void invokeClose(final ChannelPromise promise) {\n+        final ChannelHandlerInvoker invoker = invoker();\n+        if (handlerAdded) {\n+            invoker.invokeClose(this, promise);\n+        } else {\n+            invoker.executor().execute(new OneTimeTask() {\n+                @Override\n+                public void run() {\n+                    assert handlerAdded;\n+                    invoker.invokeClose(AbstractChannelHandlerContext.this, promise);\n+                }\n+            });\n+        }\n+    }\n+\n+    final void invokeDeregister(final ChannelPromise promise) {\n+        final ChannelHandlerInvoker invoker = invoker();\n+        if (handlerAdded) {\n+            invoker.invokeDeregister(this, promise);\n+        } else {\n+            invoker.executor().execute(new OneTimeTask() {\n+                @Override\n+                public void run() {\n+                    assert handlerAdded;\n+                    invoker.invokeDeregister(AbstractChannelHandlerContext.this, promise);\n+                }\n+            });\n+        }\n+    }\n+\n+    final void invokeRead() {\n+        final ChannelHandlerInvoker invoker = invoker();\n+        if (handlerAdded) {\n+            invoker.invokeRead(this);\n+        } else {\n+            invoker.executor().execute(new OneTimeTask() {\n+                @Override\n+                public void run() {\n+                    assert handlerAdded;\n+                    invoker.invokeRead(AbstractChannelHandlerContext.this);\n+                }\n+            });\n+        }\n+    }\n+\n+    final void invokeWrite(final Object msg, final ChannelPromise promise) {\n+        final ChannelHandlerInvoker invoker = invoker();\n+        if (handlerAdded) {\n+            invoker.invokeWrite(this, msg, promise);\n+        } else {\n+            invoker.executor().execute(new OneTimeTask() {\n+                @Override\n+                public void run() {\n+                    assert handlerAdded;\n+                    invoker.invokeWrite(AbstractChannelHandlerContext.this, msg, promise);\n+                }\n+            });\n+        }\n+    }\n+\n+    final void invokeFlush() {\n+        final ChannelHandlerInvoker invoker = invoker();\n+        if (handlerAdded) {\n+            invoker.invokeFlush(this);\n+        } else {\n+            invoker.executor().execute(new OneTimeTask() {\n+                @Override\n+                public void run() {\n+                    assert handlerAdded;\n+                    invoker.invokeFlush(AbstractChannelHandlerContext.this);\n+                }\n+            });\n+        }\n+    }\n+\n+    final void invokeWriteAndFlush(final Object msg, final ChannelPromise promise) {\n+        final ChannelHandlerInvoker invoker = invoker();\n+        if (handlerAdded) {\n+            invoker.invokeWrite(this, msg, promise);\n+            invoker.invokeFlush(this);\n+        } else {\n+            invoker.executor().execute(new OneTimeTask() {\n+                @Override\n+                public void run() {\n+                    assert handlerAdded;\n+                    invoker.invokeWrite(AbstractChannelHandlerContext.this, msg, promise);\n+                    invoker.invokeFlush(AbstractChannelHandlerContext.this);\n+                }\n+            });\n+        }\n+    }\n+\n+    private ChannelHandlerInvoker invoker() {\n+        if (invoker == null) {\n+            return channel().unsafe().invoker();\n+        } else {\n+            return invoker;\n+        }\n+    }\n+\n+    final void setHandlerAddedCalled() {\n+        handlerAdded = true;","path":"transport/src/main/java/io/netty/channel/AbstractChannelHandlerContext.java","position":479,"original_position":479,"commit_id":"29d5776c98cf0408b9f9a435601d64c101ea4a14","original_commit_id":"29d5776c98cf0408b9f9a435601d64c101ea4a14","user":{"login":"normanmaurer","id":439362,"avatar_url":"https://avatars.githubusercontent.com/u/439362?v=3","gravatar_id":"","url":"https://api.github.com/users/normanmaurer","html_url":"https://github.com/normanmaurer","followers_url":"https://api.github.com/users/normanmaurer/followers","following_url":"https://api.github.com/users/normanmaurer/following{/other_user}","gists_url":"https://api.github.com/users/normanmaurer/gists{/gist_id}","starred_url":"https://api.github.com/users/normanmaurer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/normanmaurer/subscriptions","organizations_url":"https://api.github.com/users/normanmaurer/orgs","repos_url":"https://api.github.com/users/normanmaurer/repos","events_url":"https://api.github.com/users/normanmaurer/events{/privacy}","received_events_url":"https://api.github.com/users/normanmaurer/received_events","type":"User","site_admin":false},"body":"nope it should always stay true as it only signals that handlerAdded was called","created_at":"2016-01-15T19:40:27Z","updated_at":"2016-01-15T19:40:27Z","html_url":"https://github.com/netty/netty/pull/4716#discussion_r49895854","pull_request_url":"https://api.github.com/repos/netty/netty/pulls/4716","_links":{"self":{"href":"https://api.github.com/repos/netty/netty/pulls/comments/49895854"},"html":{"href":"https://github.com/netty/netty/pull/4716#discussion_r49895854"},"pull_request":{"href":"https://api.github.com/repos/netty/netty/pulls/4716"}}},"pull_request":{"url":"https://api.github.com/repos/netty/netty/pulls/4716","id":56197493,"html_url":"https://github.com/netty/netty/pull/4716","diff_url":"https://github.com/netty/netty/pull/4716.diff","patch_url":"https://github.com/netty/netty/pull/4716.patch","issue_url":"https://api.github.com/repos/netty/netty/issues/4716","number":4716,"state":"open","locked":false,"title":"[#4705] Ensure ChannelHandler.handlerAdded(...) is always called as f…","user":{"login":"normanmaurer","id":439362,"avatar_url":"https://avatars.githubusercontent.com/u/439362?v=3","gravatar_id":"","url":"https://api.github.com/users/normanmaurer","html_url":"https://github.com/normanmaurer","followers_url":"https://api.github.com/users/normanmaurer/followers","following_url":"https://api.github.com/users/normanmaurer/following{/other_user}","gists_url":"https://api.github.com/users/normanmaurer/gists{/gist_id}","starred_url":"https://api.github.com/users/normanmaurer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/normanmaurer/subscriptions","organizations_url":"https://api.github.com/users/normanmaurer/orgs","repos_url":"https://api.github.com/users/normanmaurer/repos","events_url":"https://api.github.com/users/normanmaurer/events{/privacy}","received_events_url":"https://api.github.com/users/normanmaurer/received_events","type":"User","site_admin":false},"body":"…irst method of the handler\r\n\r\nMotivation:\r\n\r\nIf a user adds a ChannelHandler from outside the EventLoop it is possible to get into the situation that handlerAdded(...) is scheduled on the EventLoop and so called after another methods of the ChannelHandler as the EventLoop may already be executing on this point in time.\r\n\r\nModification:\r\n\r\n- Ensure we always check if the handlerAdded(...) method was called already and if not add the currently needed call to the EventLoop so it will be picked up after handlerAdded(...) was called. This works as if the handler is added to the ChannelPipeline from outside the EventLoop the actual handlerAdded(...) operation is scheduled on the EventLoop.\r\n- Some cleanup in the DefaultChannelPipeline\r\n\r\nResult:\r\n\r\nCorrectly order of method executions of ChannelHandler.","created_at":"2016-01-15T17:28:07Z","updated_at":"2016-01-15T19:40:27Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4b31280d4a9b9548c58421178d57d000235bc19b","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/netty/netty/pulls/4716/commits","review_comments_url":"https://api.github.com/repos/netty/netty/pulls/4716/comments","review_comment_url":"https://api.github.com/repos/netty/netty/pulls/comments{/number}","comments_url":"https://api.github.com/repos/netty/netty/issues/4716/comments","statuses_url":"https://api.github.com/repos/netty/netty/statuses/29d5776c98cf0408b9f9a435601d64c101ea4a14","head":{"label":"netty:pipeline_race","ref":"pipeline_race","sha":"29d5776c98cf0408b9f9a435601d64c101ea4a14","user":{"login":"netty","id":473791,"avatar_url":"https://avatars.githubusercontent.com/u/473791?v=3","gravatar_id":"","url":"https://api.github.com/users/netty","html_url":"https://github.com/netty","followers_url":"https://api.github.com/users/netty/followers","following_url":"https://api.github.com/users/netty/following{/other_user}","gists_url":"https://api.github.com/users/netty/gists{/gist_id}","starred_url":"https://api.github.com/users/netty/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/netty/subscriptions","organizations_url":"https://api.github.com/users/netty/orgs","repos_url":"https://api.github.com/users/netty/repos","events_url":"https://api.github.com/users/netty/events{/privacy}","received_events_url":"https://api.github.com/users/netty/received_events","type":"Organization","site_admin":false},"repo":{"id":1064563,"name":"netty","full_name":"netty/netty","owner":{"login":"netty","id":473791,"avatar_url":"https://avatars.githubusercontent.com/u/473791?v=3","gravatar_id":"","url":"https://api.github.com/users/netty","html_url":"https://github.com/netty","followers_url":"https://api.github.com/users/netty/followers","following_url":"https://api.github.com/users/netty/following{/other_user}","gists_url":"https://api.github.com/users/netty/gists{/gist_id}","starred_url":"https://api.github.com/users/netty/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/netty/subscriptions","organizations_url":"https://api.github.com/users/netty/orgs","repos_url":"https://api.github.com/users/netty/repos","events_url":"https://api.github.com/users/netty/events{/privacy}","received_events_url":"https://api.github.com/users/netty/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/netty/netty","description":"Netty project - an event-driven asynchronous network application framework","fork":false,"url":"https://api.github.com/repos/netty/netty","forks_url":"https://api.github.com/repos/netty/netty/forks","keys_url":"https://api.github.com/repos/netty/netty/keys{/key_id}","collaborators_url":"https://api.github.com/repos/netty/netty/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/netty/netty/teams","hooks_url":"https://api.github.com/repos/netty/netty/hooks","issue_events_url":"https://api.github.com/repos/netty/netty/issues/events{/number}","events_url":"https://api.github.com/repos/netty/netty/events","assignees_url":"https://api.github.com/repos/netty/netty/assignees{/user}","branches_url":"https://api.github.com/repos/netty/netty/branches{/branch}","tags_url":"https://api.github.com/repos/netty/netty/tags","blobs_url":"https://api.github.com/repos/netty/netty/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/netty/netty/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/netty/netty/git/refs{/sha}","trees_url":"https://api.github.com/repos/netty/netty/git/trees{/sha}","statuses_url":"https://api.github.com/repos/netty/netty/statuses/{sha}","languages_url":"https://api.github.com/repos/netty/netty/languages","stargazers_url":"https://api.github.com/repos/netty/netty/stargazers","contributors_url":"https://api.github.com/repos/netty/netty/contributors","subscribers_url":"https://api.github.com/repos/netty/netty/subscribers","subscription_url":"https://api.github.com/repos/netty/netty/subscription","commits_url":"https://api.github.com/repos/netty/netty/commits{/sha}","git_commits_url":"https://api.github.com/repos/netty/netty/git/commits{/sha}","comments_url":"https://api.github.com/repos/netty/netty/comments{/number}","issue_comment_url":"https://api.github.com/repos/netty/netty/issues/comments{/number}","contents_url":"https://api.github.com/repos/netty/netty/contents/{+path}","compare_url":"https://api.github.com/repos/netty/netty/compare/{base}...{head}","merges_url":"https://api.github.com/repos/netty/netty/merges","archive_url":"https://api.github.com/repos/netty/netty/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/netty/netty/downloads","issues_url":"https://api.github.com/repos/netty/netty/issues{/number}","pulls_url":"https://api.github.com/repos/netty/netty/pulls{/number}","milestones_url":"https://api.github.com/repos/netty/netty/milestones{/number}","notifications_url":"https://api.github.com/repos/netty/netty/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/netty/netty/labels{/name}","releases_url":"https://api.github.com/repos/netty/netty/releases{/id}","created_at":"2010-11-09T09:22:21Z","updated_at":"2016-01-15T16:45:10Z","pushed_at":"2016-01-15T18:45:48Z","git_url":"git://github.com/netty/netty.git","ssh_url":"git@github.com:netty/netty.git","clone_url":"https://github.com/netty/netty.git","svn_url":"https://github.com/netty/netty","homepage":"http://netty.io/","size":57674,"stargazers_count":5968,"watchers_count":5968,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3018,"mirror_url":null,"open_issues_count":339,"forks":3018,"open_issues":339,"watchers":5968,"default_branch":"4.1"}},"base":{"label":"netty:4.1","ref":"4.1","sha":"bf24ffd3354123a7a8602046462973f74963639c","user":{"login":"netty","id":473791,"avatar_url":"https://avatars.githubusercontent.com/u/473791?v=3","gravatar_id":"","url":"https://api.github.com/users/netty","html_url":"https://github.com/netty","followers_url":"https://api.github.com/users/netty/followers","following_url":"https://api.github.com/users/netty/following{/other_user}","gists_url":"https://api.github.com/users/netty/gists{/gist_id}","starred_url":"https://api.github.com/users/netty/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/netty/subscriptions","organizations_url":"https://api.github.com/users/netty/orgs","repos_url":"https://api.github.com/users/netty/repos","events_url":"https://api.github.com/users/netty/events{/privacy}","received_events_url":"https://api.github.com/users/netty/received_events","type":"Organization","site_admin":false},"repo":{"id":1064563,"name":"netty","full_name":"netty/netty","owner":{"login":"netty","id":473791,"avatar_url":"https://avatars.githubusercontent.com/u/473791?v=3","gravatar_id":"","url":"https://api.github.com/users/netty","html_url":"https://github.com/netty","followers_url":"https://api.github.com/users/netty/followers","following_url":"https://api.github.com/users/netty/following{/other_user}","gists_url":"https://api.github.com/users/netty/gists{/gist_id}","starred_url":"https://api.github.com/users/netty/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/netty/subscriptions","organizations_url":"https://api.github.com/users/netty/orgs","repos_url":"https://api.github.com/users/netty/repos","events_url":"https://api.github.com/users/netty/events{/privacy}","received_events_url":"https://api.github.com/users/netty/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/netty/netty","description":"Netty project - an event-driven asynchronous network application framework","fork":false,"url":"https://api.github.com/repos/netty/netty","forks_url":"https://api.github.com/repos/netty/netty/forks","keys_url":"https://api.github.com/repos/netty/netty/keys{/key_id}","collaborators_url":"https://api.github.com/repos/netty/netty/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/netty/netty/teams","hooks_url":"https://api.github.com/repos/netty/netty/hooks","issue_events_url":"https://api.github.com/repos/netty/netty/issues/events{/number}","events_url":"https://api.github.com/repos/netty/netty/events","assignees_url":"https://api.github.com/repos/netty/netty/assignees{/user}","branches_url":"https://api.github.com/repos/netty/netty/branches{/branch}","tags_url":"https://api.github.com/repos/netty/netty/tags","blobs_url":"https://api.github.com/repos/netty/netty/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/netty/netty/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/netty/netty/git/refs{/sha}","trees_url":"https://api.github.com/repos/netty/netty/git/trees{/sha}","statuses_url":"https://api.github.com/repos/netty/netty/statuses/{sha}","languages_url":"https://api.github.com/repos/netty/netty/languages","stargazers_url":"https://api.github.com/repos/netty/netty/stargazers","contributors_url":"https://api.github.com/repos/netty/netty/contributors","subscribers_url":"https://api.github.com/repos/netty/netty/subscribers","subscription_url":"https://api.github.com/repos/netty/netty/subscription","commits_url":"https://api.github.com/repos/netty/netty/commits{/sha}","git_commits_url":"https://api.github.com/repos/netty/netty/git/commits{/sha}","comments_url":"https://api.github.com/repos/netty/netty/comments{/number}","issue_comment_url":"https://api.github.com/repos/netty/netty/issues/comments{/number}","contents_url":"https://api.github.com/repos/netty/netty/contents/{+path}","compare_url":"https://api.github.com/repos/netty/netty/compare/{base}...{head}","merges_url":"https://api.github.com/repos/netty/netty/merges","archive_url":"https://api.github.com/repos/netty/netty/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/netty/netty/downloads","issues_url":"https://api.github.com/repos/netty/netty/issues{/number}","pulls_url":"https://api.github.com/repos/netty/netty/pulls{/number}","milestones_url":"https://api.github.com/repos/netty/netty/milestones{/number}","notifications_url":"https://api.github.com/repos/netty/netty/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/netty/netty/labels{/name}","releases_url":"https://api.github.com/repos/netty/netty/releases{/id}","created_at":"2010-11-09T09:22:21Z","updated_at":"2016-01-15T16:45:10Z","pushed_at":"2016-01-15T18:45:48Z","git_url":"git://github.com/netty/netty.git","ssh_url":"git@github.com:netty/netty.git","clone_url":"https://github.com/netty/netty.git","svn_url":"https://github.com/netty/netty","homepage":"http://netty.io/","size":57674,"stargazers_count":5968,"watchers_count":5968,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3018,"mirror_url":null,"open_issues_count":339,"forks":3018,"open_issues":339,"watchers":5968,"default_branch":"4.1"}},"_links":{"self":{"href":"https://api.github.com/repos/netty/netty/pulls/4716"},"html":{"href":"https://github.com/netty/netty/pull/4716"},"issue":{"href":"https://api.github.com/repos/netty/netty/issues/4716"},"comments":{"href":"https://api.github.com/repos/netty/netty/issues/4716/comments"},"review_comments":{"href":"https://api.github.com/repos/netty/netty/pulls/4716/comments"},"review_comment":{"href":"https://api.github.com/repos/netty/netty/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/netty/netty/pulls/4716/commits"},"statuses":{"href":"https://api.github.com/repos/netty/netty/statuses/29d5776c98cf0408b9f9a435601d64c101ea4a14"}}}}