{"action":"created","comment":{"url":"https://api.github.com/repos/netty/netty/pulls/comments/87835858","pull_request_review_id":8430951,"id":87835858,"diff_hunk":"@@ -0,0 +1,419 @@\n+/*\n+ * Copyright 2016 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.http;\n+\n+import static io.netty.util.internal.ObjectUtil.checkNotNull;\n+\n+import io.netty.util.concurrent.FastThreadLocal;\n+\n+import java.util.BitSet;\n+import java.util.Calendar;\n+import java.util.Date;\n+import java.util.GregorianCalendar;\n+import java.util.TimeZone;\n+\n+/**\n+ * A formatter for HTTP header dates, such as \"Expires\" and \"Date\" headers, or \"expires\" field in \"Set-Cookie\".\n+ *\n+ * On the parsing side, it honors RFC6265 (so it supports RFC1123).\n+ * Note that:\n+ * <ul>\n+ *     <li>Day of week is ignored and not validated</li>\n+ *     <li>Timezone is ignored, as RFC6265 assumes UTC</li>\n+ * </ul>\n+ * If you're looking for a date format that validates day of week, or supports other timezones, consider using\n+ * java.util.DateTimeFormatter.RFC_1123_DATE_TIME.\n+ *\n+ * On the formatting side, it uses RFC1123 format.\n+ *\n+ * @see <a href=\"https://tools.ietf.org/html/rfc6265#section-5.1.1\">RFC6265</a> for the parsing side\n+ * @see <a href=\"https://tools.ietf.org/html/rfc1123#page-55\">RFC1123</a> for the encoding side.\n+ */\n+public final class HttpHeaderDateFormatter {\n+\n+    private static final BitSet DELIMITERS = new BitSet();\n+    static {\n+        DELIMITERS.set(0x09);\n+        for (char c = 0x20; c <= 0x2F; c++) {\n+            DELIMITERS.set(c);\n+        }\n+        for (char c = 0x3B; c <= 0x40; c++) {\n+            DELIMITERS.set(c);\n+        }\n+        for (char c = 0x5B; c <= 0x60; c++) {\n+            DELIMITERS.set(c);\n+        }\n+        for (char c = 0x7B; c <= 0x7E; c++) {\n+            DELIMITERS.set(c);\n+        }\n+    }\n+\n+    private static final String[] DAY_OF_WEEK_TO_SHORT_NAME =\n+            new String[]{\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"};\n+\n+    private static final String[] CALENDAR_MONTH_TO_SHORT_NAME =\n+            new String[]{\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"};\n+\n+    private static final FastThreadLocal<HttpHeaderDateFormatter> INSTANCES =\n+            new FastThreadLocal<HttpHeaderDateFormatter>() {\n+                @Override\n+                protected HttpHeaderDateFormatter initialValue() {\n+                    return new HttpHeaderDateFormatter();\n+                }\n+            };\n+\n+    /**\n+     * Parse some text into a {@link Date}, according to RFC6265\n+     * @param txt text to parse\n+     * @return a {@link Date}, or null if text couldn't be parsed\n+     */\n+    public static Date parse(CharSequence txt) {\n+        return parse(checkNotNull(txt, \"txt\"), 0, txt.length());\n+    }\n+\n+    /**\n+     * Parse some text into a {@link Date}, according to RFC6265\n+     * @param txt text to parse\n+     * @param start the start index inside <code>txt</code>\n+     * @param end the end index inside <code>txt</code>\n+     * @return a {@link Date}, or null if text couldn't be parsed\n+     */\n+    public static Date parse(CharSequence txt, int start, int end) {\n+        return formatter().parse0(checkNotNull(txt, \"txt\"), start, end);\n+    }\n+\n+    /**\n+     * Format a {@link Date} into RFC1123 format\n+     * @param date the date to format\n+     * @return a RFC1123 string\n+     */\n+    public static String format(Date date) {\n+        return formatter().format0(checkNotNull(date, \"date\"));\n+    }\n+\n+    /**\n+     * Append a {@link Date} to a {@link StringBuilder} into RFC1123 format\n+     * @param date the date to format\n+     * @param sb the StringBuilder\n+     * @return the same StringBuilder\n+     */\n+    public static StringBuilder append(Date date, StringBuilder sb) {\n+        return formatter().append0(checkNotNull(date, \"date\"), checkNotNull(sb, \"sb\"));\n+    }\n+\n+    private static HttpHeaderDateFormatter formatter() {\n+        HttpHeaderDateFormatter formatter = INSTANCES.get();\n+        formatter.reset();\n+        return formatter;\n+    }\n+\n+    // delimiter = %x09 / %x20-2F / %x3B-40 / %x5B-60 / %x7B-7E\n+    private static boolean isDelim(char c) {\n+        return DELIMITERS.get(c);\n+    }\n+\n+    private static boolean isDigit(char c) {\n+        return c >= 0x30 && c <= 0x39;\n+    }\n+\n+    private static int getNumericalValue(char c) {\n+        return (int) c - 48;\n+    }\n+\n+    private final GregorianCalendar cal = new GregorianCalendar(TimeZone.getTimeZone(\"UTC\"));\n+    private final StringBuilder sb = new StringBuilder(29); // Sun, 27 Nov 2016 19:37:15 GMT\n+    private boolean timeFound;\n+    private int hours;\n+    private int minutes;\n+    private int seconds;\n+    private boolean dayOfMonthFound;\n+    private int dayOfMonth;\n+    private boolean monthFound;\n+    private int month;\n+    private boolean yearFound;\n+    private int year;\n+\n+    private HttpHeaderDateFormatter() {\n+        reset();\n+    }\n+\n+    public void reset() {\n+        timeFound = false;\n+        hours = -1;\n+        minutes = -1;\n+        seconds = -1;\n+        dayOfMonthFound = false;\n+        dayOfMonth = -1;\n+        monthFound = false;\n+        month = -1;\n+        yearFound = false;\n+        year = -1;\n+        cal.set(Calendar.MILLISECOND, 0);\n+        sb.setLength(0);\n+    }\n+\n+    private boolean tryParseTime(CharSequence txt, int tokenStart, int tokenEnd) {\n+        int len = tokenEnd - tokenStart;\n+\n+        // d:m:yy to dd:mm:yyyy\n+        if (len < 6 || len > 10) {\n+            return false;\n+        }\n+\n+        int localHours = -1;\n+        int localMinutes = -1;\n+        int localSeconds = -1;\n+        int currentPartNumber = 0;\n+        int currentPartValue = 0;\n+\n+        for (int i = tokenStart; i < tokenEnd; i++) {\n+            char c = txt.charAt(i);\n+            if (isDigit(c)) {\n+                currentPartValue = currentPartValue * 10 + getNumericalValue(c);\n+            } else if (c == ':') {\n+                if (currentPartValue == 0) {\n+                    // invalid :: (nothing in between)\n+                    return false;\n+\n+                } else if (currentPartNumber == 0) {\n+                    // flushing hours\n+                    localHours = currentPartValue;\n+                    currentPartValue = 0;\n+                    currentPartNumber++;\n+\n+                } else if (currentPartNumber == 1) {\n+                    // flushing minutes\n+                    localMinutes = currentPartValue;\n+                    currentPartValue = 0;\n+                    currentPartNumber++;\n+\n+                } else if (currentPartNumber == 2) {\n+                    // invalid, too many :\n+                    return false;\n+                }\n+            } else {\n+                // invalid char\n+                return false;\n+            }\n+        }\n+\n+        if (currentPartValue > 0) {\n+            // pending seconds\n+            localSeconds = currentPartValue;\n+        }\n+\n+        if (localHours >= 0 && localMinutes >= 0 && localSeconds >= 0) {\n+            hours = localHours;\n+            minutes = localMinutes;\n+            seconds = localSeconds;\n+            return true;\n+        }\n+\n+        return false;\n+    }\n+\n+    private boolean tryParseDayOfMonth(CharSequence txt, int tokenStart, int tokenEnd) {\n+        int len = tokenEnd - tokenStart;\n+\n+        if (len != 1 && len != 2) {\n+            return false;\n+        }\n+\n+        int localDayOfMonth = 0;\n+        for (int i = tokenStart; i < tokenEnd; i++) {\n+            char c = txt.charAt(i);\n+            if (isDigit(c)) {\n+                localDayOfMonth = localDayOfMonth * 10 + getNumericalValue(c);\n+            } else {\n+                // invalid\n+                return false;\n+            }\n+        }\n+\n+        if (localDayOfMonth > 0) {\n+            dayOfMonth = localDayOfMonth;\n+            return true;\n+        }\n+\n+        return false;\n+    }\n+\n+    private boolean tryParseMonth(CharSequence txt, int tokenStart, int tokenEnd) {\n+        int len = tokenEnd - tokenStart;\n+\n+        if (len == 3) {\n+            String tokenString = txt.subSequence(tokenStart, tokenEnd).toString();\n+","path":"codec-http/src/main/java/io/netty/handler/codec/http/HttpHeaderDateFormatter.java","position":259,"original_position":259,"commit_id":"334d287f1645a32db3ba61aba655e1b560462eca","original_commit_id":"334d287f1645a32db3ba61aba655e1b560462eca","user":{"login":"netkins","id":9507557,"avatar_url":"https://avatars.githubusercontent.com/u/9507557?v=3","gravatar_id":"","url":"https://api.github.com/users/netkins","html_url":"https://github.com/netkins","followers_url":"https://api.github.com/users/netkins/followers","following_url":"https://api.github.com/users/netkins/following{/other_user}","gists_url":"https://api.github.com/users/netkins/gists{/gist_id}","starred_url":"https://api.github.com/users/netkins/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/netkins/subscriptions","organizations_url":"https://api.github.com/users/netkins/orgs","repos_url":"https://api.github.com/users/netkins/repos","events_url":"https://api.github.com/users/netkins/events{/privacy}","received_events_url":"https://api.github.com/users/netkins/received_events","type":"User","site_admin":false},"body":"![MAJOR](https://raw.githubusercontent.com/SonarCommunity/sonar-github/master/images/severity-major.png) Move the \"Mar\" string literal on the left side of this string comparison. [![rule](https://raw.githubusercontent.com/SonarCommunity/sonar-github/master/images/rule.png)](https://garage.netty.io/sonarqube/coding_rules#rule_key=squid%3AS1132)\n","created_at":"2016-11-14T16:25:07Z","updated_at":"2016-11-14T16:25:07Z","html_url":"https://github.com/netty/netty/pull/6018#discussion_r87835858","pull_request_url":"https://api.github.com/repos/netty/netty/pulls/6018","_links":{"self":{"href":"https://api.github.com/repos/netty/netty/pulls/comments/87835858"},"html":{"href":"https://github.com/netty/netty/pull/6018#discussion_r87835858"},"pull_request":{"href":"https://api.github.com/repos/netty/netty/pulls/6018"}}},"pull_request":{"url":"https://api.github.com/repos/netty/netty/pulls/6018","id":93558927,"html_url":"https://github.com/netty/netty/pull/6018","diff_url":"https://github.com/netty/netty/pull/6018.diff","patch_url":"https://github.com/netty/netty/pull/6018.patch","issue_url":"https://api.github.com/repos/netty/netty/issues/6018","number":6018,"state":"open","locked":false,"title":"Fix cookie date parsing, close #6016","user":{"login":"slandelle","id":849197,"avatar_url":"https://avatars.githubusercontent.com/u/849197?v=3","gravatar_id":"","url":"https://api.github.com/users/slandelle","html_url":"https://github.com/slandelle","followers_url":"https://api.github.com/users/slandelle/followers","following_url":"https://api.github.com/users/slandelle/following{/other_user}","gists_url":"https://api.github.com/users/slandelle/gists{/gist_id}","starred_url":"https://api.github.com/users/slandelle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slandelle/subscriptions","organizations_url":"https://api.github.com/users/slandelle/orgs","repos_url":"https://api.github.com/users/slandelle/repos","events_url":"https://api.github.com/users/slandelle/events{/privacy}","received_events_url":"https://api.github.com/users/slandelle/received_events","type":"User","site_admin":false},"body":"Motivation:\r\n* RFC6265 defines its own parser which is different from RFC1123 (it accepts RFC1123 format but also other ones). Basically, it's very lax on delimiters, ignores day of week and timezone. Currently, ClientCookieDecoder uses HttpHeaderDateFormat underneath, and can't parse valid cookies such as Github ones whose expires attribute looks like \"Sun, 27 Nov 2016 19:37:15 -0000\"\r\n* ServerSideCookieEncoder currently uses HttpHeaderDateFormat underneath for formatting expires field, and it's slow.\r\n\r\nModifications:\r\n* Introduce CookieDateFormatter that correctly implement RFC6265\r\n* Use CookieDateFormatter in ClientCookieDecoder and ServerCookieEncoder\r\n\r\nResult:\r\n* Proper RFC6265 dates support\r\n* Faster ServerCookieEncoder and ClientCookieDecoder","created_at":"2016-11-14T12:35:56Z","updated_at":"2016-11-14T16:25:09Z","closed_at":null,"merged_at":null,"merge_commit_sha":"11a8479510dc174534c986fab6d5dfc1877722af","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/netty/netty/pulls/6018/commits","review_comments_url":"https://api.github.com/repos/netty/netty/pulls/6018/comments","review_comment_url":"https://api.github.com/repos/netty/netty/pulls/comments{/number}","comments_url":"https://api.github.com/repos/netty/netty/issues/6018/comments","statuses_url":"https://api.github.com/repos/netty/netty/statuses/334d287f1645a32db3ba61aba655e1b560462eca","head":{"label":"slandelle:4.1","ref":"4.1","sha":"334d287f1645a32db3ba61aba655e1b560462eca","user":{"login":"slandelle","id":849197,"avatar_url":"https://avatars.githubusercontent.com/u/849197?v=3","gravatar_id":"","url":"https://api.github.com/users/slandelle","html_url":"https://github.com/slandelle","followers_url":"https://api.github.com/users/slandelle/followers","following_url":"https://api.github.com/users/slandelle/following{/other_user}","gists_url":"https://api.github.com/users/slandelle/gists{/gist_id}","starred_url":"https://api.github.com/users/slandelle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slandelle/subscriptions","organizations_url":"https://api.github.com/users/slandelle/orgs","repos_url":"https://api.github.com/users/slandelle/repos","events_url":"https://api.github.com/users/slandelle/events{/privacy}","received_events_url":"https://api.github.com/users/slandelle/received_events","type":"User","site_admin":false},"repo":{"id":33929023,"name":"netty","full_name":"slandelle/netty","owner":{"login":"slandelle","id":849197,"avatar_url":"https://avatars.githubusercontent.com/u/849197?v=3","gravatar_id":"","url":"https://api.github.com/users/slandelle","html_url":"https://github.com/slandelle","followers_url":"https://api.github.com/users/slandelle/followers","following_url":"https://api.github.com/users/slandelle/following{/other_user}","gists_url":"https://api.github.com/users/slandelle/gists{/gist_id}","starred_url":"https://api.github.com/users/slandelle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/slandelle/subscriptions","organizations_url":"https://api.github.com/users/slandelle/orgs","repos_url":"https://api.github.com/users/slandelle/repos","events_url":"https://api.github.com/users/slandelle/events{/privacy}","received_events_url":"https://api.github.com/users/slandelle/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/slandelle/netty","description":"Netty project - an event-driven asynchronous network application framework","fork":true,"url":"https://api.github.com/repos/slandelle/netty","forks_url":"https://api.github.com/repos/slandelle/netty/forks","keys_url":"https://api.github.com/repos/slandelle/netty/keys{/key_id}","collaborators_url":"https://api.github.com/repos/slandelle/netty/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/slandelle/netty/teams","hooks_url":"https://api.github.com/repos/slandelle/netty/hooks","issue_events_url":"https://api.github.com/repos/slandelle/netty/issues/events{/number}","events_url":"https://api.github.com/repos/slandelle/netty/events","assignees_url":"https://api.github.com/repos/slandelle/netty/assignees{/user}","branches_url":"https://api.github.com/repos/slandelle/netty/branches{/branch}","tags_url":"https://api.github.com/repos/slandelle/netty/tags","blobs_url":"https://api.github.com/repos/slandelle/netty/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/slandelle/netty/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/slandelle/netty/git/refs{/sha}","trees_url":"https://api.github.com/repos/slandelle/netty/git/trees{/sha}","statuses_url":"https://api.github.com/repos/slandelle/netty/statuses/{sha}","languages_url":"https://api.github.com/repos/slandelle/netty/languages","stargazers_url":"https://api.github.com/repos/slandelle/netty/stargazers","contributors_url":"https://api.github.com/repos/slandelle/netty/contributors","subscribers_url":"https://api.github.com/repos/slandelle/netty/subscribers","subscription_url":"https://api.github.com/repos/slandelle/netty/subscription","commits_url":"https://api.github.com/repos/slandelle/netty/commits{/sha}","git_commits_url":"https://api.github.com/repos/slandelle/netty/git/commits{/sha}","comments_url":"https://api.github.com/repos/slandelle/netty/comments{/number}","issue_comment_url":"https://api.github.com/repos/slandelle/netty/issues/comments{/number}","contents_url":"https://api.github.com/repos/slandelle/netty/contents/{+path}","compare_url":"https://api.github.com/repos/slandelle/netty/compare/{base}...{head}","merges_url":"https://api.github.com/repos/slandelle/netty/merges","archive_url":"https://api.github.com/repos/slandelle/netty/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/slandelle/netty/downloads","issues_url":"https://api.github.com/repos/slandelle/netty/issues{/number}","pulls_url":"https://api.github.com/repos/slandelle/netty/pulls{/number}","milestones_url":"https://api.github.com/repos/slandelle/netty/milestones{/number}","notifications_url":"https://api.github.com/repos/slandelle/netty/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/slandelle/netty/labels{/name}","releases_url":"https://api.github.com/repos/slandelle/netty/releases{/id}","deployments_url":"https://api.github.com/repos/slandelle/netty/deployments","created_at":"2015-04-14T11:58:26Z","updated_at":"2016-11-09T11:43:32Z","pushed_at":"2016-11-14T15:32:11Z","git_url":"git://github.com/slandelle/netty.git","ssh_url":"git@github.com:slandelle/netty.git","clone_url":"https://github.com/slandelle/netty.git","svn_url":"https://github.com/slandelle/netty","homepage":"http://netty.io/","size":41295,"stargazers_count":1,"watchers_count":1,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"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":"netty:4.1","ref":"4.1","sha":"baac352f74d7e5b2980ed9c1071515e6f85598eb","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}","deployments_url":"https://api.github.com/repos/netty/netty/deployments","created_at":"2010-11-09T09:22:21Z","updated_at":"2016-11-14T15:04:33Z","pushed_at":"2016-11-14T15:32:11Z","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":73420,"stargazers_count":8234,"watchers_count":8234,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":4175,"mirror_url":null,"open_issues_count":344,"forks":4175,"open_issues":344,"watchers":8234,"default_branch":"4.1"}},"_links":{"self":{"href":"https://api.github.com/repos/netty/netty/pulls/6018"},"html":{"href":"https://github.com/netty/netty/pull/6018"},"issue":{"href":"https://api.github.com/repos/netty/netty/issues/6018"},"comments":{"href":"https://api.github.com/repos/netty/netty/issues/6018/comments"},"review_comments":{"href":"https://api.github.com/repos/netty/netty/pulls/6018/comments"},"review_comment":{"href":"https://api.github.com/repos/netty/netty/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/netty/netty/pulls/6018/commits"},"statuses":{"href":"https://api.github.com/repos/netty/netty/statuses/334d287f1645a32db3ba61aba655e1b560462eca"}}}}
{"actor":{"display_login":"netkins"}}