{"action":"created","comment":{"url":"https://api.github.com/repos/dotnet/corefx/pulls/comments/44209314","id":44209314,"diff_hunk":"@@ -130,104 +156,133 @@ public static uint GetResponseHeaderNumberInfo(SafeWinHttpHandle requestHandle,\n             return result;\n         }\n \n-        private static string GetResponseHeaderStringInfo(SafeWinHttpHandle requestHandle, uint infoLevel)\n+        private static char[] CreateResponseHeaderInfoBuffer(SafeWinHttpHandle requestHandle, uint infoLevel)\n         {\n-            uint bytesNeeded = 0;\n-            bool results = false;\n+            uint bufferLengthInBytes = 0;\n \n-            // Call WinHttpQueryHeaders once to obtain the size of the buffer needed.  The size is returned in\n+            // Call WinHttpQueryHeaders to obtain the size of the buffer needed. The size is returned in\n             // bytes but the API actually returns Unicode characters.\n             if (!Interop.WinHttp.WinHttpQueryHeaders(\n                 requestHandle,\n                 infoLevel,\n                 Interop.WinHttp.WINHTTP_HEADER_NAME_BY_INDEX,\n-                null,\n-                ref bytesNeeded,\n+                IntPtr.Zero,\n+                ref bufferLengthInBytes,\n                 IntPtr.Zero))\n             {\n                 int lastError = Marshal.GetLastWin32Error();\n-                if (lastError == Interop.WinHttp.ERROR_WINHTTP_HEADER_NOT_FOUND)\n+\n+                Debug.Assert(lastError != Interop.WinHttp.ERROR_WINHTTP_HEADER_NOT_FOUND);\n+\n+                if (lastError != Interop.WinHttp.ERROR_INSUFFICIENT_BUFFER)\n                 {\n-                    return null;\n+                    throw WinHttpException.CreateExceptionUsingError(lastError);\n                 }\n+            }\n \n-                if (lastError != Interop.WinHttp.ERROR_INSUFFICIENT_BUFFER)\n+            return new char[bufferLengthInBytes / 2];\n+        }\n+\n+        private static int GetResponseHeaderInfo(SafeWinHttpHandle requestHandle, uint infoLevel, char[] buffer)\n+        {\n+            Debug.Assert(buffer != null, \"buffer must not be null.\");\n+            Debug.Assert(buffer.Length > 0, \"buffer must not be empty.\");\n+\n+            uint bufferLengthInBytes = (uint)buffer.Length * 2;\n+\n+            GCHandle pinnedHandle = GCHandle.Alloc(buffer, GCHandleType.Pinned);\n+            try\n+            {\n+                if (!Interop.WinHttp.WinHttpQueryHeaders(\n+                    requestHandle,\n+                    infoLevel,\n+                    Interop.WinHttp.WINHTTP_HEADER_NAME_BY_INDEX,\n+                    pinnedHandle.AddrOfPinnedObject(),\n+                    ref bufferLengthInBytes,\n+                    IntPtr.Zero))\n                 {\n+                    int lastError = Marshal.GetLastWin32Error();\n+\n+                    if (lastError == Interop.WinHttp.ERROR_WINHTTP_HEADER_NOT_FOUND)\n+                    {\n+                        return 0;\n+                    }\n+\n+                    Debug.Assert(lastError != Interop.WinHttp.ERROR_INSUFFICIENT_BUFFER, \"buffer must be of sufficient size.\");\n+\n                     throw WinHttpException.CreateExceptionUsingError(lastError);\n                 }\n             }\n+            finally\n+            {\n+                pinnedHandle.Free();\n+            }\n \n-            // Allocate space for the buffer.\n-            int charsNeeded = (int)bytesNeeded / 2;\n-            var buffer = new StringBuilder(charsNeeded, charsNeeded);\n+            return (int)bufferLengthInBytes / 2;\n+        }\n \n-            results = Interop.WinHttp.WinHttpQueryHeaders(\n-                requestHandle,\n-                infoLevel,\n-                Interop.WinHttp.WINHTTP_HEADER_NAME_BY_INDEX,\n-                buffer,\n-                ref bytesNeeded,\n-                IntPtr.Zero);\n-            if (!results)\n+        private static bool TryGetKnownReasonPhrase(HttpStatusCode statusCode, char[] array, int startIndex, int length, out string reasonPhrase)\n+        {\n+            CharArrayHelpers.DebugAssertArrayInputs(array, startIndex, length);\n+\n+            reasonPhrase = HttpStatusDescription.Get(statusCode);","path":"src/System.Net.Http.WinHttpHandler/src/System/Net/Http/WinHttpResponseParser.cs","position":220,"original_position":220,"commit_id":"7c5d0e3ee250a1523d2f7a438ccbf2049f9f1430","original_commit_id":"7c5d0e3ee250a1523d2f7a438ccbf2049f9f1430","user":{"login":"stephentoub","id":2642209,"avatar_url":"https://avatars.githubusercontent.com/u/2642209?v=3","gravatar_id":"","url":"https://api.github.com/users/stephentoub","html_url":"https://github.com/stephentoub","followers_url":"https://api.github.com/users/stephentoub/followers","following_url":"https://api.github.com/users/stephentoub/following{/other_user}","gists_url":"https://api.github.com/users/stephentoub/gists{/gist_id}","starred_url":"https://api.github.com/users/stephentoub/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stephentoub/subscriptions","organizations_url":"https://api.github.com/users/stephentoub/orgs","repos_url":"https://api.github.com/users/stephentoub/repos","events_url":"https://api.github.com/users/stephentoub/events{/privacy}","received_events_url":"https://api.github.com/users/stephentoub/received_events","type":"User","site_admin":false},"body":"Oh, nevermind, I see how this is being used.","created_at":"2015-11-07T07:28:46Z","updated_at":"2015-11-07T07:28:46Z","html_url":"https://github.com/dotnet/corefx/pull/3199#discussion_r44209314","pull_request_url":"https://api.github.com/repos/dotnet/corefx/pulls/3199","_links":{"self":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/comments/44209314"},"html":{"href":"https://github.com/dotnet/corefx/pull/3199#discussion_r44209314"},"pull_request":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/3199"}}},"pull_request":{"url":"https://api.github.com/repos/dotnet/corefx/pulls/3199","id":44845722,"html_url":"https://github.com/dotnet/corefx/pull/3199","diff_url":"https://github.com/dotnet/corefx/pull/3199.diff","patch_url":"https://github.com/dotnet/corefx/pull/3199.patch","issue_url":"https://api.github.com/repos/dotnet/corefx/issues/3199","number":3199,"state":"open","locked":false,"title":"Reduce allocations when parsing response headers in WinHttpHandler","user":{"login":"justinvp","id":710598,"avatar_url":"https://avatars.githubusercontent.com/u/710598?v=3","gravatar_id":"","url":"https://api.github.com/users/justinvp","html_url":"https://github.com/justinvp","followers_url":"https://api.github.com/users/justinvp/followers","following_url":"https://api.github.com/users/justinvp/following{/other_user}","gists_url":"https://api.github.com/users/justinvp/gists{/gist_id}","starred_url":"https://api.github.com/users/justinvp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/justinvp/subscriptions","organizations_url":"https://api.github.com/users/justinvp/orgs","repos_url":"https://api.github.com/users/justinvp/repos","events_url":"https://api.github.com/users/justinvp/events{/privacy}","received_events_url":"https://api.github.com/users/justinvp/received_events","type":"User","site_admin":false},"body":"There are currently many unnecessary allocations when creating the response message in `WinHttpHandler`.\r\n\r\nThe native `WinHttpQueryHeaders` function is called a few times to retrieve response information, such as the version string, reason phrase, and raw headers.\r\n\r\nEach call to `WinHttpQueryHeaders` currently results in 3 allocations (9 total for the 3 calls):\r\n 1. The `StringBuilder` buffer passed to the native function to be filled in.\r\n 2. The `char[]` inside the `StringBuilder`.\r\n 3. The `string` allocated when `StringBuilder.ToString()` is called.\r\n\r\nOn platforms that need to do manual decompression (lower than Win 8.1), there's another 2-3 allocations to get the Content-Encoding header value.\r\n\r\nWe can reduce the allocations by 1) modifying the p/invoke signature for `WinHttpQueryHeaders` to take a `char[]` instead of `StringBuilder` and 2) allocate a single `char[]` large enough to be reused across multiple calls to `WinHttpQueryHeaders`.\r\n\r\nWith those changes, 9 allocations are down to 2: an allocation for the raw headers `char[]` and another for the reason phrase `string`.\r\n\r\nThere are many common reason phrases, such as \"OK\" for a 200 status code, or \"Not Found\" for a 404 status code. There's already internal code in `HttpStatusDescription` for looking up a known reason phrase string based on the status code, and we can make use of this existing code to avoid the reason phrase string allocation if the reason phrase `char[]` array segment is equal to a known reason phrase. 9 allocations down to 1, for common reason phrases.\r\n\r\nWhen parsing the raw headers, the current code is using `string.Split` to split the raw headers by lines separated by `\"\\r\\n\"`. There are a bunch of unnecessary allocations associated with the use of `string.split`: internally `string.Split` allocates two arrays to keep track of the indexes and separator sizes, there's the overall array returned from `Split`, plus each string in the array representing each line. Each line then needs to be split further to get the header name and value for each line. The header value was also being trimmed with `string.Trim`, another potential allocation. Also, the first line of the raw headers is the status line, which is being allocated as a `string` even though this line is currently being skipped.\r\n\r\nAll of these intermediate allocations can be avoided by parsing the `char[]` directly, and only allocating `string`s for the individual header names and values. And we can avoid `string` allocations for known header names and values, similar to the known reason phrase optimization.\r\n\r\nNotes:\r\n\r\n - `HttpKnownHeaderNames.TryGetHeaderName` is looking up all known header name constants, which include both request and response headers, while we only really care about response headers. My opinion is that this is OK. I think it's easier to maintain the lookup of known headers if it is just looking up all known headers, instead of trying to segregate which ones are only response headers.\r\n\r\n - `HttpKnownHeaderNames.TryGetHeaderName` is currently doing an ordinal lookup. Header names are case insensitive, so I'd be open to changing this to do an case insensitive lookup. I kept it ordinal so the string remains the exact same as the response string from WinHTTP. However, it looks like WinHTTP normalizes the casing of headers it knows about (e.g. WinHTTP returns `\"Content-Length\"` when the actual server response is `\"content-length\"`), so maybe switching to case insensitive lookup isn't a big deal.\r\n\r\n - The PR is broken up into multiple commits to make it easier to review. The earlier commits are mostly just adding helpers and tests, and moving some of the internal files to `Common` (e.g. `HttpStatusDescription`). I can squash some of the commits together, if desired.\r\n\r\n - There are still a bunch of allocations associated with how headers are enumerated and stored internally on each request/response in `HttpClient` that I'm looking into improving in a separate PR.","created_at":"2015-09-12T03:12:43Z","updated_at":"2015-11-07T07:28:46Z","closed_at":null,"merged_at":null,"merge_commit_sha":"31b59deb261fa9d8658e3744d54cc72b91006e94","assignee":null,"milestone":{"url":"https://api.github.com/repos/dotnet/corefx/milestones/4","html_url":"https://github.com/dotnet/corefx/milestones/1.0.0-rtm","labels_url":"https://api.github.com/repos/dotnet/corefx/milestones/4/labels","id":1248719,"number":4,"title":"1.0.0-rtm","description":"Q1 2016 (https://github.com/aspnet/Home/wiki/Roadmap)","creator":{"login":"joshfree","id":1302850,"avatar_url":"https://avatars.githubusercontent.com/u/1302850?v=3","gravatar_id":"","url":"https://api.github.com/users/joshfree","html_url":"https://github.com/joshfree","followers_url":"https://api.github.com/users/joshfree/followers","following_url":"https://api.github.com/users/joshfree/following{/other_user}","gists_url":"https://api.github.com/users/joshfree/gists{/gist_id}","starred_url":"https://api.github.com/users/joshfree/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/joshfree/subscriptions","organizations_url":"https://api.github.com/users/joshfree/orgs","repos_url":"https://api.github.com/users/joshfree/repos","events_url":"https://api.github.com/users/joshfree/events{/privacy}","received_events_url":"https://api.github.com/users/joshfree/received_events","type":"User","site_admin":false},"open_issues":263,"closed_issues":86,"state":"open","created_at":"2015-08-10T18:04:00Z","updated_at":"2015-11-06T23:52:50Z","due_on":"2016-03-31T07:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/dotnet/corefx/pulls/3199/commits","review_comments_url":"https://api.github.com/repos/dotnet/corefx/pulls/3199/comments","review_comment_url":"https://api.github.com/repos/dotnet/corefx/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dotnet/corefx/issues/3199/comments","statuses_url":"https://api.github.com/repos/dotnet/corefx/statuses/7c5d0e3ee250a1523d2f7a438ccbf2049f9f1430","head":{"label":"justinvp:winhttphandler_parseresponseheaders","ref":"winhttphandler_parseresponseheaders","sha":"7c5d0e3ee250a1523d2f7a438ccbf2049f9f1430","user":{"login":"justinvp","id":710598,"avatar_url":"https://avatars.githubusercontent.com/u/710598?v=3","gravatar_id":"","url":"https://api.github.com/users/justinvp","html_url":"https://github.com/justinvp","followers_url":"https://api.github.com/users/justinvp/followers","following_url":"https://api.github.com/users/justinvp/following{/other_user}","gists_url":"https://api.github.com/users/justinvp/gists{/gist_id}","starred_url":"https://api.github.com/users/justinvp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/justinvp/subscriptions","organizations_url":"https://api.github.com/users/justinvp/orgs","repos_url":"https://api.github.com/users/justinvp/repos","events_url":"https://api.github.com/users/justinvp/events{/privacy}","received_events_url":"https://api.github.com/users/justinvp/received_events","type":"User","site_admin":false},"repo":{"id":28229041,"name":"corefx","full_name":"justinvp/corefx","owner":{"login":"justinvp","id":710598,"avatar_url":"https://avatars.githubusercontent.com/u/710598?v=3","gravatar_id":"","url":"https://api.github.com/users/justinvp","html_url":"https://github.com/justinvp","followers_url":"https://api.github.com/users/justinvp/followers","following_url":"https://api.github.com/users/justinvp/following{/other_user}","gists_url":"https://api.github.com/users/justinvp/gists{/gist_id}","starred_url":"https://api.github.com/users/justinvp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/justinvp/subscriptions","organizations_url":"https://api.github.com/users/justinvp/orgs","repos_url":"https://api.github.com/users/justinvp/repos","events_url":"https://api.github.com/users/justinvp/events{/privacy}","received_events_url":"https://api.github.com/users/justinvp/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/justinvp/corefx","description":"This repository contains the foundational libraries that make up the .NET Core development stack.","fork":true,"url":"https://api.github.com/repos/justinvp/corefx","forks_url":"https://api.github.com/repos/justinvp/corefx/forks","keys_url":"https://api.github.com/repos/justinvp/corefx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/justinvp/corefx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/justinvp/corefx/teams","hooks_url":"https://api.github.com/repos/justinvp/corefx/hooks","issue_events_url":"https://api.github.com/repos/justinvp/corefx/issues/events{/number}","events_url":"https://api.github.com/repos/justinvp/corefx/events","assignees_url":"https://api.github.com/repos/justinvp/corefx/assignees{/user}","branches_url":"https://api.github.com/repos/justinvp/corefx/branches{/branch}","tags_url":"https://api.github.com/repos/justinvp/corefx/tags","blobs_url":"https://api.github.com/repos/justinvp/corefx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/justinvp/corefx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/justinvp/corefx/git/refs{/sha}","trees_url":"https://api.github.com/repos/justinvp/corefx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/justinvp/corefx/statuses/{sha}","languages_url":"https://api.github.com/repos/justinvp/corefx/languages","stargazers_url":"https://api.github.com/repos/justinvp/corefx/stargazers","contributors_url":"https://api.github.com/repos/justinvp/corefx/contributors","subscribers_url":"https://api.github.com/repos/justinvp/corefx/subscribers","subscription_url":"https://api.github.com/repos/justinvp/corefx/subscription","commits_url":"https://api.github.com/repos/justinvp/corefx/commits{/sha}","git_commits_url":"https://api.github.com/repos/justinvp/corefx/git/commits{/sha}","comments_url":"https://api.github.com/repos/justinvp/corefx/comments{/number}","issue_comment_url":"https://api.github.com/repos/justinvp/corefx/issues/comments{/number}","contents_url":"https://api.github.com/repos/justinvp/corefx/contents/{+path}","compare_url":"https://api.github.com/repos/justinvp/corefx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/justinvp/corefx/merges","archive_url":"https://api.github.com/repos/justinvp/corefx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/justinvp/corefx/downloads","issues_url":"https://api.github.com/repos/justinvp/corefx/issues{/number}","pulls_url":"https://api.github.com/repos/justinvp/corefx/pulls{/number}","milestones_url":"https://api.github.com/repos/justinvp/corefx/milestones{/number}","notifications_url":"https://api.github.com/repos/justinvp/corefx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/justinvp/corefx/labels{/name}","releases_url":"https://api.github.com/repos/justinvp/corefx/releases{/id}","created_at":"2014-12-19T12:43:43Z","updated_at":"2015-04-30T22:29:39Z","pushed_at":"2015-10-31T23:07:17Z","git_url":"git://github.com/justinvp/corefx.git","ssh_url":"git@github.com:justinvp/corefx.git","clone_url":"https://github.com/justinvp/corefx.git","svn_url":"https://github.com/justinvp/corefx","homepage":"","size":38311,"stargazers_count":1,"watchers_count":1,"language":"C#","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":"dotnet:master","ref":"master","sha":"fb284e62a62bad0280c3f0c530ddb4a8c1ec79c0","user":{"login":"dotnet","id":9141961,"avatar_url":"https://avatars.githubusercontent.com/u/9141961?v=3","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"repo":{"id":26295345,"name":"corefx","full_name":"dotnet/corefx","owner":{"login":"dotnet","id":9141961,"avatar_url":"https://avatars.githubusercontent.com/u/9141961?v=3","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dotnet/corefx","description":"This repo contains the .NET Core foundational libraries, called CoreFX. It includes classes for collections, file systems, console, XML, async and many others.","fork":false,"url":"https://api.github.com/repos/dotnet/corefx","forks_url":"https://api.github.com/repos/dotnet/corefx/forks","keys_url":"https://api.github.com/repos/dotnet/corefx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dotnet/corefx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dotnet/corefx/teams","hooks_url":"https://api.github.com/repos/dotnet/corefx/hooks","issue_events_url":"https://api.github.com/repos/dotnet/corefx/issues/events{/number}","events_url":"https://api.github.com/repos/dotnet/corefx/events","assignees_url":"https://api.github.com/repos/dotnet/corefx/assignees{/user}","branches_url":"https://api.github.com/repos/dotnet/corefx/branches{/branch}","tags_url":"https://api.github.com/repos/dotnet/corefx/tags","blobs_url":"https://api.github.com/repos/dotnet/corefx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dotnet/corefx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dotnet/corefx/git/refs{/sha}","trees_url":"https://api.github.com/repos/dotnet/corefx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dotnet/corefx/statuses/{sha}","languages_url":"https://api.github.com/repos/dotnet/corefx/languages","stargazers_url":"https://api.github.com/repos/dotnet/corefx/stargazers","contributors_url":"https://api.github.com/repos/dotnet/corefx/contributors","subscribers_url":"https://api.github.com/repos/dotnet/corefx/subscribers","subscription_url":"https://api.github.com/repos/dotnet/corefx/subscription","commits_url":"https://api.github.com/repos/dotnet/corefx/commits{/sha}","git_commits_url":"https://api.github.com/repos/dotnet/corefx/git/commits{/sha}","comments_url":"https://api.github.com/repos/dotnet/corefx/comments{/number}","issue_comment_url":"https://api.github.com/repos/dotnet/corefx/issues/comments{/number}","contents_url":"https://api.github.com/repos/dotnet/corefx/contents/{+path}","compare_url":"https://api.github.com/repos/dotnet/corefx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dotnet/corefx/merges","archive_url":"https://api.github.com/repos/dotnet/corefx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dotnet/corefx/downloads","issues_url":"https://api.github.com/repos/dotnet/corefx/issues{/number}","pulls_url":"https://api.github.com/repos/dotnet/corefx/pulls{/number}","milestones_url":"https://api.github.com/repos/dotnet/corefx/milestones{/number}","notifications_url":"https://api.github.com/repos/dotnet/corefx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dotnet/corefx/labels{/name}","releases_url":"https://api.github.com/repos/dotnet/corefx/releases{/id}","created_at":"2014-11-06T23:42:48Z","updated_at":"2015-11-07T00:56:39Z","pushed_at":"2015-11-07T07:09:20Z","git_url":"git://github.com/dotnet/corefx.git","ssh_url":"git@github.com:dotnet/corefx.git","clone_url":"https://github.com/dotnet/corefx.git","svn_url":"https://github.com/dotnet/corefx","homepage":"http://dotnet.github.io/core/","size":89374,"stargazers_count":8544,"watchers_count":8544,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1901,"mirror_url":null,"open_issues_count":672,"forks":1901,"open_issues":672,"watchers":8544,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/3199"},"html":{"href":"https://github.com/dotnet/corefx/pull/3199"},"issue":{"href":"https://api.github.com/repos/dotnet/corefx/issues/3199"},"comments":{"href":"https://api.github.com/repos/dotnet/corefx/issues/3199/comments"},"review_comments":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/3199/comments"},"review_comment":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/3199/commits"},"statuses":{"href":"https://api.github.com/repos/dotnet/corefx/statuses/7c5d0e3ee250a1523d2f7a438ccbf2049f9f1430"}}}}