{"action":"created","comment":{"url":"https://api.github.com/repos/netty/netty/pulls/comments/26491277","id":26491277,"diff_hunk":"@@ -0,0 +1,344 @@\n+/*\n+ * Copyright 2015 The Netty Project\n+ *\n+ * The Netty Project licenses this file to you under the Apache License,\n+ * version 2.0 (the \"License\"); you may not use this file except in compliance\n+ * with the License. You may obtain a copy of the License at:\n+ *\n+ *   http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n+ * License for the specific language governing permissions and limitations\n+ * under the License.\n+ */\n+package io.netty.handler.codec.dns;\n+\n+import io.netty.util.AbstractReferenceCounted;\n+import io.netty.util.ReferenceCountUtil;\n+import io.netty.util.ReferenceCounted;\n+import io.netty.util.ResourceLeak;\n+import io.netty.util.ResourceLeakDetector;\n+import io.netty.util.internal.ObjectUtil;\n+\n+import java.util.LinkedList;\n+import java.util.List;\n+\n+/**\n+ * A skeletal implementation of {@link DnsMessage}.\n+ */\n+public abstract class AbstractDnsMessage extends AbstractReferenceCounted implements DnsMessage {\n+\n+    private static final ResourceLeakDetector<DnsMessage> leakDetector =\n+            new ResourceLeakDetector<DnsMessage>(DnsMessage.class);\n+\n+    private final ResourceLeak leak = leakDetector.open(this);\n+    private short id;\n+    private DnsOpCode opCode;\n+    private boolean recursionDesired;\n+    private byte z;\n+\n+    private Object questions; // a single question or the list of questions\n+    private List<DnsRecord> answers;\n+    private List<DnsRecord> authorityRecords;\n+    private Object additionalRecords; // a single record or the list of records.\n+\n+    /**\n+     * Creates a new instance with the specified {@code id} and {@link DnsOpCode#QUERY} opCode.\n+     */\n+    protected AbstractDnsMessage(int id) {\n+        this(id, DnsOpCode.QUERY);\n+    }\n+\n+    /**\n+     * Creates a new instance with the specified {@code id} and {@code opCode}.\n+     */\n+    protected AbstractDnsMessage(int id, DnsOpCode opCode) {\n+        setId(id);\n+        setOpCode(opCode);\n+    }\n+\n+    @Override\n+    public int id() {\n+        return id & 0xFFFF;\n+    }\n+\n+    @Override\n+    public DnsMessage setId(int id) {\n+        this.id = (short) id;\n+        return this;\n+    }\n+\n+    @Override\n+    public DnsOpCode opCode() {\n+        return opCode;\n+    }\n+\n+    @Override\n+    public DnsMessage setOpCode(DnsOpCode opCode) {\n+        ObjectUtil.checkNotNull(opCode, \"opCode\");\n+        this.opCode = opCode;\n+        return this;\n+    }\n+\n+    @Override\n+    public boolean isRecursionDesired() {\n+        return recursionDesired;\n+    }\n+\n+    @Override\n+    public DnsMessage setRecursionDesired(boolean recursionDesired) {\n+        this.recursionDesired = recursionDesired;\n+        return this;\n+    }\n+\n+    @Override\n+    public int z() {\n+        return z;\n+    }\n+\n+    @Override\n+    public DnsMessage setZ(int z) {\n+        this.z = (byte) (z & 7);\n+        return this;\n+    }\n+\n+    @Override\n+    public int questionCount() {\n+        final Object questions = this.questions;\n+        if (questions == null) {\n+            return 0;\n+        }\n+        if (questions instanceof DnsQuestion) {\n+            return 1;\n+        }\n+\n+        @SuppressWarnings(\"unchecked\")\n+        List<DnsQuestion> questionList = (List<DnsQuestion>) questions;\n+        return questionList.size();\n+    }\n+\n+    @Override\n+    public int answerCount() {\n+        final List<DnsRecord> answers = this.answers;\n+        if (answers == null) {\n+            return 0;\n+        } else {\n+            return answers.size();\n+        }\n+    }\n+\n+    @Override\n+    public int authorityRecordCount() {\n+        final List<DnsRecord> authorityRecords = this.authorityRecords;\n+        if (authorityRecords == null) {\n+            return 0;\n+        } else {\n+            return authorityRecords.size();\n+        }\n+    }\n+\n+    @Override\n+    public int additionalRecordCount() {\n+        final Object additionalRecords = this.additionalRecords;\n+        if (additionalRecords == null) {\n+            return 0;\n+        }\n+        if (additionalRecords instanceof DnsRecord) {\n+            return 1;\n+        }\n+\n+        @SuppressWarnings(\"unchecked\")\n+        List<DnsRecord> additionalRecordList = (List<DnsRecord>) additionalRecords;\n+        return additionalRecordList.size();\n+    }\n+\n+    @Override\n+    public DnsQuestion question() {\n+        final Object questions = this.questions;\n+        if (questions == null) {\n+            return null;\n+        }\n+        if (questions instanceof DnsQuestion) {\n+            return (DnsQuestion) questions;\n+        }\n+\n+        @SuppressWarnings(\"unchecked\")\n+        final LinkedList<DnsQuestion> questionList = (LinkedList<DnsQuestion>) questions;\n+        if (questionList.isEmpty()) {\n+            return null;\n+        }\n+\n+        return questionList.getFirst();\n+    }\n+\n+    @Override\n+    public List<DnsQuestion> questions() {\n+        final Object questions = this.questions;\n+        if (questions == null) {\n+            List<DnsQuestion> newList = new LinkedList<DnsQuestion>();\n+            this.questions = newList;\n+            return newList;\n+        }\n+        if (questions instanceof DnsQuestion) {\n+            List<DnsQuestion> newList = new LinkedList<DnsQuestion>();\n+            newList.add((DnsQuestion) questions);\n+            this.questions = newList;\n+            return newList;\n+        }\n+\n+        @SuppressWarnings(\"unchecked\")\n+        final LinkedList<DnsQuestion> questionList = (LinkedList<DnsQuestion>) questions;\n+        return questionList;\n+    }\n+\n+    @Override\n+    public DnsMessage setQuestion(DnsQuestion question) {\n+        ObjectUtil.checkNotNull(question, \"question\");\n+        questions = question;\n+        return this;\n+    }\n+\n+    @Override\n+    public List<DnsRecord> answers() {\n+        List<DnsRecord> answers = this.answers;\n+        if (answers == null) {\n+            this.answers = answers = new LinkedList<DnsRecord>();\n+        }\n+        return answers;\n+    }\n+\n+    @Override\n+    public List<DnsRecord> authorityRecords() {\n+        List<DnsRecord> authorityRecords = this.authorityRecords;\n+        if (authorityRecords == null) {\n+            this.authorityRecords = authorityRecords = new LinkedList<DnsRecord>();\n+        }\n+        return authorityRecords;\n+    }\n+\n+    @Override\n+    public DnsRecord additionalRecord() {\n+        final Object additionalRecords = this.additionalRecords;\n+        if (additionalRecords == null) {\n+            return null;\n+        }\n+        if (additionalRecords instanceof DnsRecord) {\n+            return (DnsRecord) additionalRecords;\n+        }\n+\n+        @SuppressWarnings(\"unchecked\")\n+        final LinkedList<DnsRecord> additionalRecordList = (LinkedList<DnsRecord>) additionalRecords;\n+        if (additionalRecordList.isEmpty()) {\n+            return null;\n+        }\n+\n+        return additionalRecordList.getFirst();\n+    }\n+\n+    @Override\n+    public DnsMessage setAdditionalRecord(DnsRecord record) {\n+        ObjectUtil.checkNotNull(record, \"record\");\n+        additionalRecords = record;","path":"codec-dns/src/main/java/io/netty/handler/codec/dns/AbstractDnsMessage.java","position":243,"original_position":243,"commit_id":"e421210e05f3bf55689edeaf2eeadade105a3677","original_commit_id":"e421210e05f3bf55689edeaf2eeadade105a3677","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":"merge the above lines","created_at":"2015-03-16T14:55:46Z","updated_at":"2015-03-16T14:55:46Z","html_url":"https://github.com/netty/netty/pull/3499#discussion_r26491277","pull_request_url":"https://api.github.com/repos/netty/netty/pulls/3499","_links":{"self":{"href":"https://api.github.com/repos/netty/netty/pulls/comments/26491277"},"html":{"href":"https://github.com/netty/netty/pull/3499#discussion_r26491277"},"pull_request":{"href":"https://api.github.com/repos/netty/netty/pulls/3499"}}},"pull_request":{"url":"https://api.github.com/repos/netty/netty/pulls/3499","id":31220758,"html_url":"https://github.com/netty/netty/pull/3499","diff_url":"https://github.com/netty/netty/pull/3499.diff","patch_url":"https://github.com/netty/netty/pull/3499.patch","issue_url":"https://api.github.com/repos/netty/netty/issues/3499","number":3499,"state":"open","locked":false,"title":"Revamp DNS codec","user":{"login":"trustin","id":173918,"avatar_url":"https://avatars.githubusercontent.com/u/173918?v=3","gravatar_id":"","url":"https://api.github.com/users/trustin","html_url":"https://github.com/trustin","followers_url":"https://api.github.com/users/trustin/followers","following_url":"https://api.github.com/users/trustin/following{/other_user}","gists_url":"https://api.github.com/users/trustin/gists{/gist_id}","starred_url":"https://api.github.com/users/trustin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/trustin/subscriptions","organizations_url":"https://api.github.com/users/trustin/orgs","repos_url":"https://api.github.com/users/trustin/repos","events_url":"https://api.github.com/users/trustin/events{/privacy}","received_events_url":"https://api.github.com/users/trustin/received_events","type":"User","site_admin":false},"body":"Motivation:\r\n\r\nThere are various known issues in netty-codec-dns:\r\n\r\n- Message types are not interfaces, which can make it difficult for a user to implement his/her own message implementation.\r\n- Some class names and field names do not match with the terms in the RFC.\r\n- The support for decoding a DNS record was limited. A user had to encode and decode by him/herself.\r\n- The separation of DnsHeader from DnsMessage was unnecessary, although it is fine conceptually.\r\n- Buffer leak caused by DnsMessage was difficult to analyze, because the leak detector tracks down the underlying ByteBuf rather than the DnsMessage itself.\r\n- DnsMessage assumes DNS-over-UDP.\r\n\r\nModifications:\r\n\r\n- Make all message types interfaces and add default implementations\r\n- Rename some classes, properties, and constants to match the RFCs\r\n  - DnsResource -> DnsRecord\r\n  - DnsType -> DnsRecordType\r\n  - DnsClass -> DnsRecordClass\r\n  - and many more\r\n- Add DnsRecordEncoder/DnsRecordDecoder and their default implementations\r\n  - DnsRecord does not require RDATA to be ByteBuf anymore.\r\n  - Add DnsRawRecord as the catch-all record type\r\n- Merge DnsHeader into DnsMessage\r\n- Make ResourceLeakDetector track AbstractDnsMessage\r\n- Remove DnsMessage.sender/recipient properties\r\n  - Wrap DnsMessage with AddressedEnvelope\r\n  - Add DatagramDnsQuest and DatagramDnsResponse for ease of use\r\n  - Rename DnsQueryEncoder to DatagramDnsQueryEncoder\r\n  - Rename DnsResponseDecoder to DatagramDnsResponseDecoder\r\n\r\nResult:\r\n\r\n- Cleaner APi\r\n- Can support DNS-over-TCP more easily in the future\r\n- Reduced memory footprint in the default DnsQuery/Response implementations\r\n- Better leak tracking for DnsMessages\r\n- Possibility to introduce new DnsRecord types in the future and provide full record encoder/decoder implementation.","created_at":"2015-03-16T07:00:53Z","updated_at":"2015-03-16T14:55:46Z","closed_at":null,"merged_at":null,"merge_commit_sha":"59afc12cde74f6f6c0d4fa2c6bf4e6f224b4facc","assignee":null,"milestone":{"url":"https://api.github.com/repos/netty/netty/milestones/112","html_url":"https://github.com/netty/netty/milestones/4.1.0.Beta5","labels_url":"https://api.github.com/repos/netty/netty/milestones/112/labels","id":1005380,"number":112,"title":"4.1.0.Beta5","description":"","creator":{"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},"open_issues":56,"closed_issues":6,"state":"open","created_at":"2015-03-04T09:22:23Z","updated_at":"2015-03-16T07:03:26Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/netty/netty/pulls/3499/commits","review_comments_url":"https://api.github.com/repos/netty/netty/pulls/3499/comments","review_comment_url":"https://api.github.com/repos/netty/netty/pulls/comments{/number}","comments_url":"https://api.github.com/repos/netty/netty/issues/3499/comments","statuses_url":"https://api.github.com/repos/netty/netty/statuses/e421210e05f3bf55689edeaf2eeadade105a3677","head":{"label":"netty:dns_refactor","ref":"dns_refactor","sha":"e421210e05f3bf55689edeaf2eeadade105a3677","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":"2015-03-16T14:51:26Z","pushed_at":"2015-03-16T07:05:44Z","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":111677,"stargazers_count":4285,"watchers_count":4285,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2078,"mirror_url":null,"open_issues_count":241,"forks":2078,"open_issues":241,"watchers":4285,"default_branch":"master"}},"base":{"label":"netty:4.1","ref":"4.1","sha":"fe12d08efe327b81d8fc5d01333eef6b75fcac16","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":"2015-03-16T14:51:26Z","pushed_at":"2015-03-16T07:05:44Z","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":111677,"stargazers_count":4285,"watchers_count":4285,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2078,"mirror_url":null,"open_issues_count":241,"forks":2078,"open_issues":241,"watchers":4285,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/netty/netty/pulls/3499"},"html":{"href":"https://github.com/netty/netty/pull/3499"},"issue":{"href":"https://api.github.com/repos/netty/netty/issues/3499"},"comments":{"href":"https://api.github.com/repos/netty/netty/issues/3499/comments"},"review_comments":{"href":"https://api.github.com/repos/netty/netty/pulls/3499/comments"},"review_comment":{"href":"https://api.github.com/repos/netty/netty/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/netty/netty/pulls/3499/commits"},"statuses":{"href":"https://api.github.com/repos/netty/netty/statuses/e421210e05f3bf55689edeaf2eeadade105a3677"}}}}