{"action":"created","comment":{"url":"https://api.github.com/repos/dotnet/corefx/pulls/comments/39992886","id":39992886,"diff_hunk":"@@ -0,0 +1,290 @@\n+// Copyright (c) Microsoft. All rights reserved.\n+// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n+\n+using System.Diagnostics;\n+using System.Globalization;\n+using System.Net.Security;\n+using System.Runtime.InteropServices;\n+using System.Security.Authentication;\n+using System.Security.Authentication.ExtendedProtection;\n+using System.Security.Cryptography.X509Certificates;\n+\n+namespace System.Net\n+{\n+    // For SSL connections:\n+    internal class SSPISecureChannelType : SSPIInterface\n+    {\n+        public Exception GetException(SecurityStatus status)\n+        {\n+            // TODO: To be implemented\n+            throw new Exception(\"status = \" + status);\n+        }\n+\n+        public void VerifyPackageInfo()\n+        {\n+        }\n+\n+        public SafeFreeCredentials AcquireCredentialsHandle(X509Certificate certificate,\n+            SslProtocols protocols, EncryptionPolicy policy, bool isServer)\n+        {\n+            SafeFreeCredentials retVal = new SafeFreeCredentials(certificate, protocols, policy);\n+            if ((null != retVal) && !retVal.IsInvalid)\n+            {\n+                // Caller does a ref count decrement\n+                bool ignore = false;\n+                retVal.DangerousAddRef(ref ignore);\n+                //TODO retVal is not getting released now, need to be fixed.\n+            }\n+            return retVal;\n+        }\n+\n+        public SecurityStatus AcceptSecurityContext(ref SafeFreeCredentials credential, ref SafeDeleteContext context,\n+            SecurityBuffer inputBuffer, SecurityBuffer outputBuffer, bool remoteCertRequired)\n+        {\n+            return HandshakeInternal(credential, ref context, inputBuffer, outputBuffer, true, remoteCertRequired);\n+        }\n+\n+        public SecurityStatus InitializeSecurityContext(ref SafeFreeCredentials credential, ref SafeDeleteContext context,\n+            string targetName, SecurityBuffer inputBuffer, SecurityBuffer outputBuffer)\n+        {        \n+            return HandshakeInternal(credential, ref context, inputBuffer, outputBuffer, false, false);\n+        }\n+\n+        public SecurityStatus InitializeSecurityContext(SafeFreeCredentials credential, ref SafeDeleteContext context, string targetName, SecurityBuffer[] inputBuffers, SecurityBuffer outputBuffer)\n+        {          \n+            Debug.Assert(inputBuffers.Length == 2);\n+            Debug.Assert(inputBuffers[1].token == null);\n+            return HandshakeInternal(credential, ref context, inputBuffers[0], outputBuffer, false, false);\n+        }\n+\n+        public SecurityStatus EncryptMessage(SafeDeleteContext securityContext, byte[] buffer, int size, int headerSize, int trailerSize, out int resultSize)\n+        {\n+            return EncryptDecryptHelper(securityContext, buffer, 0, size, headerSize, trailerSize, true,\n+                out resultSize);\n+        }\n+\n+        public SecurityStatus DecryptMessage(SafeDeleteContext securityContext, byte[] buffer, ref int offset, ref int count)\n+        {\n+            int resultSize;\n+            SecurityStatus retVal = EncryptDecryptHelper(securityContext, buffer, offset, count, 0, 0, false, out resultSize);\n+            if (SecurityStatus.OK == retVal)\n+            {\n+                count = resultSize;\n+            }\n+            return retVal;\n+        }\n+\n+        public int QueryContextChannelBinding(SafeDeleteContext phContext, ChannelBindingKind attribute,\n+            out SafeFreeContextBufferChannelBinding refHandle)\n+        {\n+            throw NotImplemented.ByDesignWithMessage(SR.net_MethodNotImplementedException);\n+        }\n+\n+        public int QueryContextStreamSizes(SafeDeleteContext securityContext, out StreamSizes streamSizes)\n+        {\n+            streamSizes = null;\n+            try\n+            {\n+                streamSizes = new StreamSizes(Interop.libssl.SslSizes.HEADER_SIZE, Interop.libssl.SslSizes.TRAILER_SIZE, Interop.libssl.SslSizes.SSL3_RT_MAX_PLAIN_LENGTH);\n+                return 0;\n+            }\n+            catch\n+            {              \n+                return -1;\n+            }\n+        }\n+\n+        public int QueryContextConnectionInfo(SafeDeleteContext securityContext, out SslConnectionInfo connectionInfo)\n+        {\n+            bool gotReference = false;\n+            connectionInfo = null;\n+            try\n+            {\n+                securityContext.DangerousAddRef(ref gotReference);\n+                Interop.libssl.SSL_CIPHER cipher = Interop.OpenSsl.GetConnectionInfo(securityContext.DangerousGetHandle());\n+                connectionInfo =  new SslConnectionInfo(cipher);\n+                return 0;\n+            }\n+            catch\n+            {\n+                return -1;\n+            }\n+            finally\n+            {\n+                if (gotReference)\n+                {\n+                    securityContext.DangerousRelease();\n+                }\n+            }\n+        }\n+\n+        public int QueryContextRemoteCertificate(SafeDeleteContext securityContext, out SafeFreeCertContext remoteCertContext)\n+        {\n+            bool gotReference = false;\n+            remoteCertContext = null;\n+            try\n+            {\n+                securityContext.DangerousAddRef(ref gotReference);\n+                IntPtr certPtr = Interop.OpenSsl.GetPeerCertificate(securityContext.DangerousGetHandle());\n+                remoteCertContext = new SafeFreeCertContext(certPtr);\n+                return 0;\n+            }\n+            catch\n+            {\n+                return -1;\n+            }\n+            finally\n+            {\n+                if (gotReference)\n+                {\n+                    securityContext.DangerousRelease();\n+                }\n+            }\n+        }\n+\n+        public int QueryContextIssuerList(SafeDeleteContext securityContext, out Object issuerList)\n+        {\n+            throw NotImplemented.ByDesignWithMessage(SR.net_MethodNotImplementedException);\n+        }\n+\n+        private long GetOptions(SslProtocols protocols)\n+        {\n+            long retVal = Interop.libssl.Options.SSL_OP_NO_SSLv2 | Interop.libssl.Options.SSL_OP_NO_SSLv3 |\n+                                Interop.libssl.Options.SSL_OP_NO_TLSv1 | Interop.libssl.Options.SSL_OP_NO_TLSv1_1 |\n+                                Interop.libssl.Options.SSL_OP_NO_TLSv1_2;\n+\n+            if ((protocols & SslProtocols.Ssl2) != 0)\n+            {\n+                retVal &= ~Interop.libssl.Options.SSL_OP_NO_SSLv2;\n+            }\n+            if ((protocols & SslProtocols.Ssl3) != 0)\n+            {\n+                retVal &= ~Interop.libssl.Options.SSL_OP_NO_SSLv3;\n+            }\n+            if ((protocols & SslProtocols.Tls) != 0)\n+            {\n+                retVal &= ~Interop.libssl.Options.SSL_OP_NO_TLSv1;\n+            }\n+            if ((protocols & SslProtocols.Tls11) != 0)\n+            {\n+                retVal &= ~Interop.libssl.Options.SSL_OP_NO_TLSv1_1;\n+            }\n+            if ((protocols & SslProtocols.Tls12) != 0)\n+            {\n+                retVal &= ~Interop.libssl.Options.SSL_OP_NO_TLSv1_2;\n+            }\n+\n+            return retVal;\n+        }\n+\n+        private SecurityStatus HandshakeInternal(SafeFreeCredentials credential, ref SafeDeleteContext context,\n+            SecurityBuffer inputBuffer, SecurityBuffer outputBuffer, bool isServer, bool remoteCertRequired)\n+        {\n+            Debug.Assert(!credential.IsInvalid);\n+            bool gotCredReference = false;\n+            bool gotContextReference = false;\n+            GCHandle inputHandle = new GCHandle();\n+\n+            try\n+            {\n+                credential.DangerousAddRef(ref gotCredReference);\n+\n+                if ((null == context) || context.IsInvalid)\n+                {\n+                    long options = GetOptions(credential.Protocols);               \n+                    IntPtr contextPtr = Interop.OpenSsl.AllocateSslContext(options, credential.CertHandle, isServer, remoteCertRequired);                 \n+                    context = new SafeDeleteContext(contextPtr);\n+                }\n+\n+                context.DangerousAddRef(ref gotContextReference);\n+           \n+                IntPtr inputPtr = IntPtr.Zero, outputPtr = IntPtr.Zero;\n+                int outputSize;\n+                bool done;\n+\n+                if (null == inputBuffer)\n+                {\n+                    done = Interop.OpenSsl.DoSslHandshake(context.DangerousGetHandle(), inputPtr, 0, out outputPtr, out outputSize);\n+                }\n+                else\n+                {\n+                    inputHandle = GCHandle.Alloc(inputBuffer.token, GCHandleType.Pinned);\n+                    inputPtr = Marshal.UnsafeAddrOfPinnedArrayElement(inputBuffer.token, inputBuffer.offset);\n+                    done = Interop.OpenSsl.DoSslHandshake(context.DangerousGetHandle(), inputPtr, inputBuffer.size, out outputPtr, out outputSize);\n+                }           \n+\n+                outputBuffer.size = outputSize;\n+                outputBuffer.offset = 0;\n+                if (outputSize > 0)\n+                {\n+                    outputBuffer.token = new byte[outputBuffer.size];\n+                    Marshal.Copy(outputPtr, outputBuffer.token, 0, outputBuffer.size);\n+                    Marshal.FreeHGlobal(outputPtr);\n+                }\n+                else\n+                {\n+                    outputBuffer.token = null;\n+                }      \n+\n+                return done ? SecurityStatus.OK : SecurityStatus.ContinueNeeded;\n+            }\n+            catch\n+            {\n+                return SecurityStatus.InternalError;\n+            }\n+            finally\n+            {\n+                if (inputHandle.IsAllocated)\n+                {\n+                    inputHandle.Free();\n+                }\n+                if (gotContextReference)\n+                {\n+                    context.DangerousRelease();\n+                }\n+                if (gotCredReference)\n+                {\n+                    credential.DangerousRelease();\n+                }\n+            }\n+        }\n+\n+\n+        private SecurityStatus EncryptDecryptHelper(SafeDeleteContext securityContext, byte[] buffer, int offset, int size, int headerSize, int trailerSize, bool encrypt, out int resultSize)\n+        {\n+            bool gotReference = false;\n+            GCHandle inputHandle = new GCHandle();\n+            resultSize = 0;\n+            try\n+            {\n+                securityContext.DangerousAddRef(ref gotReference);\n+                inputHandle = GCHandle.Alloc(buffer, GCHandleType.Pinned);\n+                IntPtr inputPtr = Marshal.UnsafeAddrOfPinnedArrayElement(buffer, offset);\n+                if (encrypt)\n+                {\n+                    resultSize = Interop.OpenSsl.Encrypt(securityContext.DangerousGetHandle(), inputPtr, size, buffer.Length);\n+                }\n+                else\n+                {\n+                    resultSize = Interop.OpenSsl.Decrypt(securityContext.DangerousGetHandle(), inputPtr, size);\n+                }\n+                return SecurityStatus.OK;\n+            }\n+            catch\n+            {\n+                return SecurityStatus.InternalError;","path":"src/System.Net.Security/src/System/Net/Unix/SSPISecureChannelType.cs","position":275,"original_position":275,"commit_id":"242302706a63d694e90fe533f436961ce9bfc5d7","original_commit_id":"242302706a63d694e90fe533f436961ce9bfc5d7","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":"Debug.Fail as well?","created_at":"2015-09-21T16:36:14Z","updated_at":"2015-09-21T16:36:14Z","html_url":"https://github.com/dotnet/corefx/pull/3345#discussion_r39992886","pull_request_url":"https://api.github.com/repos/dotnet/corefx/pulls/3345","_links":{"self":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/comments/39992886"},"html":{"href":"https://github.com/dotnet/corefx/pull/3345#discussion_r39992886"},"pull_request":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/3345"}}},"pull_request":{"url":"https://api.github.com/repos/dotnet/corefx/pulls/3345","id":45554109,"html_url":"https://github.com/dotnet/corefx/pull/3345","diff_url":"https://github.com/dotnet/corefx/pull/3345.diff","patch_url":"https://github.com/dotnet/corefx/pull/3345.patch","issue_url":"https://api.github.com/repos/dotnet/corefx/issues/3345","number":3345,"state":"open","locked":false,"title":"Net Secure Xplat Implementation","user":{"login":"rajansingh10","id":13608570,"avatar_url":"https://avatars.githubusercontent.com/u/13608570?v=3","gravatar_id":"","url":"https://api.github.com/users/rajansingh10","html_url":"https://github.com/rajansingh10","followers_url":"https://api.github.com/users/rajansingh10/followers","following_url":"https://api.github.com/users/rajansingh10/following{/other_user}","gists_url":"https://api.github.com/users/rajansingh10/gists{/gist_id}","starred_url":"https://api.github.com/users/rajansingh10/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rajansingh10/subscriptions","organizations_url":"https://api.github.com/users/rajansingh10/orgs","repos_url":"https://api.github.com/users/rajansingh10/repos","events_url":"https://api.github.com/users/rajansingh10/events{/privacy}","received_events_url":"https://api.github.com/users/rajansingh10/received_events","type":"User","site_admin":false},"body":"1. Abstracted the code as per design shared earlier.\r\n2. Made SecureChannel & SSPIWrapper agnostic of os.\r\n3. Created 1 class 1 file for each new classes & move them to windows specific folder.\r\n4. Added new interfaces & modules related to Cert.\r\n5. SSPINegoInterface & SSPIAuthType, currently are not part of csproj as suggested by cipop.\r\n\r\nHave included unix Interop & related code as well for completeness. You can choose to review Windows first as well. \r\n\r\n\r\n\r\n\r\n","created_at":"2015-09-21T14:20:10Z","updated_at":"2015-09-21T16:36:14Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5631f274d8451aa2a4aa04aae058cf8e1ac4c915","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/dotnet/corefx/pulls/3345/commits","review_comments_url":"https://api.github.com/repos/dotnet/corefx/pulls/3345/comments","review_comment_url":"https://api.github.com/repos/dotnet/corefx/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dotnet/corefx/issues/3345/comments","statuses_url":"https://api.github.com/repos/dotnet/corefx/statuses/242302706a63d694e90fe533f436961ce9bfc5d7","head":{"label":"rajansingh10:Netfeature","ref":"Netfeature","sha":"242302706a63d694e90fe533f436961ce9bfc5d7","user":{"login":"rajansingh10","id":13608570,"avatar_url":"https://avatars.githubusercontent.com/u/13608570?v=3","gravatar_id":"","url":"https://api.github.com/users/rajansingh10","html_url":"https://github.com/rajansingh10","followers_url":"https://api.github.com/users/rajansingh10/followers","following_url":"https://api.github.com/users/rajansingh10/following{/other_user}","gists_url":"https://api.github.com/users/rajansingh10/gists{/gist_id}","starred_url":"https://api.github.com/users/rajansingh10/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rajansingh10/subscriptions","organizations_url":"https://api.github.com/users/rajansingh10/orgs","repos_url":"https://api.github.com/users/rajansingh10/repos","events_url":"https://api.github.com/users/rajansingh10/events{/privacy}","received_events_url":"https://api.github.com/users/rajansingh10/received_events","type":"User","site_admin":false},"repo":{"id":40076943,"name":"corefx","full_name":"rajansingh10/corefx","owner":{"login":"rajansingh10","id":13608570,"avatar_url":"https://avatars.githubusercontent.com/u/13608570?v=3","gravatar_id":"","url":"https://api.github.com/users/rajansingh10","html_url":"https://github.com/rajansingh10","followers_url":"https://api.github.com/users/rajansingh10/followers","following_url":"https://api.github.com/users/rajansingh10/following{/other_user}","gists_url":"https://api.github.com/users/rajansingh10/gists{/gist_id}","starred_url":"https://api.github.com/users/rajansingh10/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rajansingh10/subscriptions","organizations_url":"https://api.github.com/users/rajansingh10/orgs","repos_url":"https://api.github.com/users/rajansingh10/repos","events_url":"https://api.github.com/users/rajansingh10/events{/privacy}","received_events_url":"https://api.github.com/users/rajansingh10/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/rajansingh10/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":true,"url":"https://api.github.com/repos/rajansingh10/corefx","forks_url":"https://api.github.com/repos/rajansingh10/corefx/forks","keys_url":"https://api.github.com/repos/rajansingh10/corefx/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rajansingh10/corefx/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rajansingh10/corefx/teams","hooks_url":"https://api.github.com/repos/rajansingh10/corefx/hooks","issue_events_url":"https://api.github.com/repos/rajansingh10/corefx/issues/events{/number}","events_url":"https://api.github.com/repos/rajansingh10/corefx/events","assignees_url":"https://api.github.com/repos/rajansingh10/corefx/assignees{/user}","branches_url":"https://api.github.com/repos/rajansingh10/corefx/branches{/branch}","tags_url":"https://api.github.com/repos/rajansingh10/corefx/tags","blobs_url":"https://api.github.com/repos/rajansingh10/corefx/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rajansingh10/corefx/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rajansingh10/corefx/git/refs{/sha}","trees_url":"https://api.github.com/repos/rajansingh10/corefx/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rajansingh10/corefx/statuses/{sha}","languages_url":"https://api.github.com/repos/rajansingh10/corefx/languages","stargazers_url":"https://api.github.com/repos/rajansingh10/corefx/stargazers","contributors_url":"https://api.github.com/repos/rajansingh10/corefx/contributors","subscribers_url":"https://api.github.com/repos/rajansingh10/corefx/subscribers","subscription_url":"https://api.github.com/repos/rajansingh10/corefx/subscription","commits_url":"https://api.github.com/repos/rajansingh10/corefx/commits{/sha}","git_commits_url":"https://api.github.com/repos/rajansingh10/corefx/git/commits{/sha}","comments_url":"https://api.github.com/repos/rajansingh10/corefx/comments{/number}","issue_comment_url":"https://api.github.com/repos/rajansingh10/corefx/issues/comments{/number}","contents_url":"https://api.github.com/repos/rajansingh10/corefx/contents/{+path}","compare_url":"https://api.github.com/repos/rajansingh10/corefx/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rajansingh10/corefx/merges","archive_url":"https://api.github.com/repos/rajansingh10/corefx/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rajansingh10/corefx/downloads","issues_url":"https://api.github.com/repos/rajansingh10/corefx/issues{/number}","pulls_url":"https://api.github.com/repos/rajansingh10/corefx/pulls{/number}","milestones_url":"https://api.github.com/repos/rajansingh10/corefx/milestones{/number}","notifications_url":"https://api.github.com/repos/rajansingh10/corefx/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rajansingh10/corefx/labels{/name}","releases_url":"https://api.github.com/repos/rajansingh10/corefx/releases{/id}","created_at":"2015-08-02T11:08:04Z","updated_at":"2015-08-02T11:08:22Z","pushed_at":"2015-09-21T14:31:33Z","git_url":"git://github.com/rajansingh10/corefx.git","ssh_url":"git@github.com:rajansingh10/corefx.git","clone_url":"https://github.com/rajansingh10/corefx.git","svn_url":"https://github.com/rajansingh10/corefx","homepage":"http://dotnet.github.io/core/","size":31475,"stargazers_count":0,"watchers_count":0,"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":0,"default_branch":"master"}},"base":{"label":"dotnet:dev-sslstream","ref":"dev-sslstream","sha":"08f475f140bb983a83d59d6d57ba3fb58243c1da","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-09-21T13:42:16Z","pushed_at":"2015-09-21T15:41:12Z","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":68955,"stargazers_count":8365,"watchers_count":8365,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1803,"mirror_url":null,"open_issues_count":619,"forks":1803,"open_issues":619,"watchers":8365,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/3345"},"html":{"href":"https://github.com/dotnet/corefx/pull/3345"},"issue":{"href":"https://api.github.com/repos/dotnet/corefx/issues/3345"},"comments":{"href":"https://api.github.com/repos/dotnet/corefx/issues/3345/comments"},"review_comments":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/3345/comments"},"review_comment":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dotnet/corefx/pulls/3345/commits"},"statuses":{"href":"https://api.github.com/repos/dotnet/corefx/statuses/242302706a63d694e90fe533f436961ce9bfc5d7"}}}}