{"action":"created","comment":{"url":"https://api.github.com/repos/aspnet/Mvc/pulls/comments/194156999","pull_request_review_id":127284437,"id":194156999,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDE5NDE1Njk5OQ==","diff_hunk":"@@ -0,0 +1,328 @@\n+﻿// Copyright (c) .NET Foundation. All rights reserved.\n+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\n+\n+using System;\n+using System.Collections.Generic;\n+using System.Linq;\n+using System.Reflection;\n+using System.Threading.Tasks;\n+using Microsoft.AspNetCore.Http;\n+using Microsoft.AspNetCore.Mvc.Controllers;\n+using Microsoft.AspNetCore.Mvc.Formatters;\n+using Microsoft.AspNetCore.Mvc.Infrastructure;\n+using Microsoft.AspNetCore.Mvc.ModelBinding;\n+\n+namespace Microsoft.AspNetCore.Mvc.ApiExplorer\n+{\n+    internal class ApiResponseTypeProvider\n+    {\n+        private readonly IModelMetadataProvider _modelMetadataProvider;\n+        private readonly IActionResultTypeMapper _mapper;\n+        private readonly MvcOptions _mvcOptions;\n+\n+        public ApiResponseTypeProvider(\n+            IModelMetadataProvider modelMetadataProvider,\n+            IActionResultTypeMapper mapper,\n+            MvcOptions mvcOptions)\n+        {\n+            _modelMetadataProvider = modelMetadataProvider;\n+            _mapper = mapper;\n+            _mvcOptions = mvcOptions;\n+        }\n+\n+        public IList<ApiResponseType> GetApiResponseTypes(ControllerActionDescriptor action)\n+        {\n+            // We only provide response info if we can figure out a type that is a user-data type.\n+            // Void /Task object/IActionResult will result in no data.\n+            var declaredReturnType = GetDeclaredReturnType(action);\n+\n+            var runtimeReturnType = GetRuntimeReturnType(declaredReturnType);\n+\n+            var responseMetadataAttributes = GetResponseMetadataAttributes(action);\n+            if (responseMetadataAttributes.Length == 0)\n+            {\n+                // Action does not have any conventions. Look for conventions on the type.\n+                responseMetadataAttributes = GetResponseMetadataAttributesFromConventions(action);\n+            }\n+\n+            var apiResponseTypes = GetApiResponseTypes(responseMetadataAttributes, runtimeReturnType);\n+            return apiResponseTypes;\n+        }\n+\n+        private IApiResponseMetadataProvider[] GetResponseMetadataAttributesFromConventions(ControllerActionDescriptor action)\n+        {\n+            var filter = (ApiConventionAttribute)action.FilterDescriptors?.FirstOrDefault(f => f.Filter is ApiConventionAttribute)?.Filter;\n+            if (filter == null)\n+            {\n+                return Array.Empty<IApiResponseMetadataProvider>();\n+            }\n+\n+            var method = GetConventionMethod(action.MethodInfo, filter.ConventionType);\n+            if (method == null)\n+            {\n+                return Array.Empty<IApiResponseMetadataProvider>();\n+            }\n+\n+            return method.GetCustomAttributes(inherit: false)\n+                .OfType<IApiResponseMetadataProvider>()\n+                .ToArray();\n+        }\n+\n+        private MethodInfo GetConventionMethod(MethodInfo methodInfo, Type conventions)\n+        {\n+            var conventionMethods = conventions.GetMethods(BindingFlags.Public | BindingFlags.Static);\n+            for (var i = 0; i < conventionMethods.Length; i++)\n+            {\n+                if (IsMatch(methodInfo, conventionMethods[i]))\n+                {\n+                    return conventionMethods[i];\n+                }\n+            }\n+\n+            return null;\n+        }\n+\n+        private IApiResponseMetadataProvider[] GetResponseMetadataAttributes(ControllerActionDescriptor action)\n+        {\n+            if (action.FilterDescriptors == null)\n+            {\n+                return Array.Empty<IApiResponseMetadataProvider>();\n+            }\n+\n+            // This technique for enumerating filters will intentionally ignore any filter that is an IFilterFactory\n+            // while searching for a filter that implements IApiResponseMetadataProvider.\n+            //\n+            // The workaround for that is to implement the metadata interface on the IFilterFactory.\n+            return action.FilterDescriptors\n+                .Select(fd => fd.Filter)\n+                .OfType<IApiResponseMetadataProvider>()\n+                .ToArray();\n+        }\n+\n+        private IList<ApiResponseType> GetApiResponseTypes(\n+           IApiResponseMetadataProvider[] responseMetadataAttributes,\n+           Type type)\n+        {\n+            var results = new List<ApiResponseType>();\n+\n+            // Build list of all possible return types (and status codes) for an action.\n+            var objectTypes = new Dictionary<int, Type>();\n+\n+            // Get the content type that the action explicitly set to support.\n+            // Walk through all 'filter' attributes in order, and allow each one to see or override\n+            // the results of the previous ones. This is similar to the execution path for content-negotiation.\n+            var contentTypes = new MediaTypeCollection();\n+            if (responseMetadataAttributes != null)\n+            {\n+                foreach (var metadataAttribute in responseMetadataAttributes)\n+                {\n+                    metadataAttribute.SetContentTypes(contentTypes);\n+\n+                    if (metadataAttribute.Type != null)\n+                    {\n+                        objectTypes[metadataAttribute.StatusCode] = metadataAttribute.Type;\n+                    }\n+                }\n+            }\n+\n+            // Set the default status only when no status has already been set explicitly\n+            if (objectTypes.Count == 0 && type != null)\n+            {\n+                objectTypes[StatusCodes.Status200OK] = type;\n+            }\n+\n+            if (contentTypes.Count == 0)\n+            {\n+                contentTypes.Add((string)null);\n+            }\n+\n+            var responseTypeMetadataProviders = _mvcOptions.OutputFormatters.OfType<IApiResponseTypeMetadataProvider>();\n+\n+            foreach (var objectType in objectTypes)\n+            {\n+                if (objectType.Value == null || objectType.Value == typeof(void))\n+                {\n+                    results.Add(new ApiResponseType()\n+                    {\n+                        StatusCode = objectType.Key,\n+                        Type = objectType.Value\n+                    });\n+\n+                    continue;\n+                }\n+\n+                var apiResponseType = new ApiResponseType()\n+                {\n+                    Type = objectType.Value,\n+                    StatusCode = objectType.Key,\n+                    ModelMetadata = _modelMetadataProvider.GetMetadataForType(objectType.Value)\n+                };\n+\n+                foreach (var contentType in contentTypes)\n+                {\n+                    foreach (var responseTypeMetadataProvider in responseTypeMetadataProviders)\n+                    {\n+                        var formatterSupportedContentTypes = responseTypeMetadataProvider.GetSupportedContentTypes(\n+                            contentType,\n+                            objectType.Value);\n+\n+                        if (formatterSupportedContentTypes == null)\n+                        {\n+                            continue;\n+                        }\n+\n+                        foreach (var formatterSupportedContentType in formatterSupportedContentTypes)\n+                        {\n+                            apiResponseType.ApiResponseFormats.Add(new ApiResponseFormat()\n+                            {\n+                                Formatter = (IOutputFormatter)responseTypeMetadataProvider,\n+                                MediaType = formatterSupportedContentType,\n+                            });\n+                        }\n+                    }\n+                }\n+\n+                results.Add(apiResponseType);\n+            }\n+\n+            return results;\n+        }\n+\n+        private Type GetDeclaredReturnType(ControllerActionDescriptor action)\n+        {\n+            var declaredReturnType = action.MethodInfo.ReturnType;\n+            if (declaredReturnType == typeof(void) ||\n+                declaredReturnType == typeof(Task))\n+            {\n+                return typeof(void);\n+            }\n+\n+            // Unwrap the type if it's a Task<T>. The Task (non-generic) case was already handled.\n+            Type unwrappedType = declaredReturnType;\n+            if (declaredReturnType.IsGenericType &&\n+                declaredReturnType.GetGenericTypeDefinition() == typeof(Task<>))\n+            {\n+                unwrappedType = declaredReturnType.GetGenericArguments()[0];\n+            }\n+\n+            // If the method is declared to return IActionResult or a derived class, that information\n+            // isn't valuable to the formatter.\n+            if (typeof(IActionResult).IsAssignableFrom(unwrappedType))\n+            {\n+                return null;\n+            }\n+\n+            // If we get here, the type should be a user-defined data type or an envelope type\n+            // like ActionResult<T>. The mapper service will unwrap envelopes.\n+            unwrappedType = _mapper.GetResultDataType(unwrappedType);\n+            return unwrappedType;\n+        }\n+\n+        private Type GetRuntimeReturnType(Type declaredReturnType)\n+        {\n+            // If we get here, then a filter didn't give us an answer, so we need to figure out if we\n+            // want to use the declared return type.\n+            //\n+            // We've already excluded Task, void, and IActionResult at this point.\n+            //\n+            // If the action might return any object, then assume we don't know anything about it.\n+            if (declaredReturnType == typeof(object))\n+            {\n+                return null;\n+            }\n+\n+            return declaredReturnType;\n+        }\n+\n+        internal static bool IsMatch(MethodInfo methodInfo, MethodInfo conventionMethod)","path":"src/Microsoft.AspNetCore.Mvc.ApiExplorer/ApiResponseTypeProvider.cs","position":237,"original_position":237,"commit_id":"84fdd8c0d936d5287c902e18a6163f402b34b6ed","original_commit_id":"84fdd8c0d936d5287c902e18a6163f402b34b6ed","user":{"login":"kichalla","id":6559784,"node_id":"MDQ6VXNlcjY1NTk3ODQ=","avatar_url":"https://avatars3.githubusercontent.com/u/6559784?v=4","gravatar_id":"","url":"https://api.github.com/users/kichalla","html_url":"https://github.com/kichalla","followers_url":"https://api.github.com/users/kichalla/followers","following_url":"https://api.github.com/users/kichalla/following{/other_user}","gists_url":"https://api.github.com/users/kichalla/gists{/gist_id}","starred_url":"https://api.github.com/users/kichalla/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kichalla/subscriptions","organizations_url":"https://api.github.com/users/kichalla/orgs","repos_url":"https://api.github.com/users/kichalla/repos","events_url":"https://api.github.com/users/kichalla/events{/privacy}","received_events_url":"https://api.github.com/users/kichalla/received_events","type":"User","site_admin":false},"body":"Should we extract the code from here on to a separate abstraction to allow users to tweak?","created_at":"2018-06-08T19:18:15Z","updated_at":"2018-06-08T19:33:13Z","html_url":"https://github.com/aspnet/Mvc/pull/7889#discussion_r194156999","pull_request_url":"https://api.github.com/repos/aspnet/Mvc/pulls/7889","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/aspnet/Mvc/pulls/comments/194156999"},"html":{"href":"https://github.com/aspnet/Mvc/pull/7889#discussion_r194156999"},"pull_request":{"href":"https://api.github.com/repos/aspnet/Mvc/pulls/7889"}}},"pull_request":{"url":"https://api.github.com/repos/aspnet/Mvc/pulls/7889","id":193484825,"node_id":"MDExOlB1bGxSZXF1ZXN0MTkzNDg0ODI1","html_url":"https://github.com/aspnet/Mvc/pull/7889","diff_url":"https://github.com/aspnet/Mvc/pull/7889.diff","patch_url":"https://github.com/aspnet/Mvc/pull/7889.patch","issue_url":"https://api.github.com/repos/aspnet/Mvc/issues/7889","number":7889,"state":"open","locked":false,"title":"Add support for conventions in DefaultApiDescriptionProvider","user":{"login":"pranavkm","id":174281,"node_id":"MDQ6VXNlcjE3NDI4MQ==","avatar_url":"https://avatars2.githubusercontent.com/u/174281?v=4","gravatar_id":"","url":"https://api.github.com/users/pranavkm","html_url":"https://github.com/pranavkm","followers_url":"https://api.github.com/users/pranavkm/followers","following_url":"https://api.github.com/users/pranavkm/following{/other_user}","gists_url":"https://api.github.com/users/pranavkm/gists{/gist_id}","starred_url":"https://api.github.com/users/pranavkm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pranavkm/subscriptions","organizations_url":"https://api.github.com/users/pranavkm/orgs","repos_url":"https://api.github.com/users/pranavkm/repos","events_url":"https://api.github.com/users/pranavkm/events{/privacy}","received_events_url":"https://api.github.com/users/pranavkm/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-06-08T01:04:13Z","updated_at":"2018-06-08T19:33:13Z","closed_at":null,"merged_at":null,"merge_commit_sha":"803b1ebef7ed2416692e38a34161a4516e0f714d","assignee":null,"assignees":[],"requested_reviewers":[{"login":"rynowak","id":1430011,"node_id":"MDQ6VXNlcjE0MzAwMTE=","avatar_url":"https://avatars1.githubusercontent.com/u/1430011?v=4","gravatar_id":"","url":"https://api.github.com/users/rynowak","html_url":"https://github.com/rynowak","followers_url":"https://api.github.com/users/rynowak/followers","following_url":"https://api.github.com/users/rynowak/following{/other_user}","gists_url":"https://api.github.com/users/rynowak/gists{/gist_id}","starred_url":"https://api.github.com/users/rynowak/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rynowak/subscriptions","organizations_url":"https://api.github.com/users/rynowak/orgs","repos_url":"https://api.github.com/users/rynowak/repos","events_url":"https://api.github.com/users/rynowak/events{/privacy}","received_events_url":"https://api.github.com/users/rynowak/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/aspnet/Mvc/pulls/7889/commits","review_comments_url":"https://api.github.com/repos/aspnet/Mvc/pulls/7889/comments","review_comment_url":"https://api.github.com/repos/aspnet/Mvc/pulls/comments{/number}","comments_url":"https://api.github.com/repos/aspnet/Mvc/issues/7889/comments","statuses_url":"https://api.github.com/repos/aspnet/Mvc/statuses/84fdd8c0d936d5287c902e18a6163f402b34b6ed","head":{"label":"aspnet:prkrishn/api-conventions-runtime","ref":"prkrishn/api-conventions-runtime","sha":"84fdd8c0d936d5287c902e18a6163f402b34b6ed","user":{"login":"aspnet","id":6476660,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY0NzY2NjA=","avatar_url":"https://avatars3.githubusercontent.com/u/6476660?v=4","gravatar_id":"","url":"https://api.github.com/users/aspnet","html_url":"https://github.com/aspnet","followers_url":"https://api.github.com/users/aspnet/followers","following_url":"https://api.github.com/users/aspnet/following{/other_user}","gists_url":"https://api.github.com/users/aspnet/gists{/gist_id}","starred_url":"https://api.github.com/users/aspnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aspnet/subscriptions","organizations_url":"https://api.github.com/users/aspnet/orgs","repos_url":"https://api.github.com/users/aspnet/repos","events_url":"https://api.github.com/users/aspnet/events{/privacy}","received_events_url":"https://api.github.com/users/aspnet/received_events","type":"Organization","site_admin":false},"repo":{"id":15126429,"node_id":"MDEwOlJlcG9zaXRvcnkxNTEyNjQyOQ==","name":"Mvc","full_name":"aspnet/Mvc","owner":{"login":"aspnet","id":6476660,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY0NzY2NjA=","avatar_url":"https://avatars3.githubusercontent.com/u/6476660?v=4","gravatar_id":"","url":"https://api.github.com/users/aspnet","html_url":"https://github.com/aspnet","followers_url":"https://api.github.com/users/aspnet/followers","following_url":"https://api.github.com/users/aspnet/following{/other_user}","gists_url":"https://api.github.com/users/aspnet/gists{/gist_id}","starred_url":"https://api.github.com/users/aspnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aspnet/subscriptions","organizations_url":"https://api.github.com/users/aspnet/orgs","repos_url":"https://api.github.com/users/aspnet/repos","events_url":"https://api.github.com/users/aspnet/events{/privacy}","received_events_url":"https://api.github.com/users/aspnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/aspnet/Mvc","description":"ASP.NET Core MVC is a model view controller framework for building dynamic web sites with clean separation of concerns, including the merged MVC, Web API, and Web Pages w/ Razor.","fork":false,"url":"https://api.github.com/repos/aspnet/Mvc","forks_url":"https://api.github.com/repos/aspnet/Mvc/forks","keys_url":"https://api.github.com/repos/aspnet/Mvc/keys{/key_id}","collaborators_url":"https://api.github.com/repos/aspnet/Mvc/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/aspnet/Mvc/teams","hooks_url":"https://api.github.com/repos/aspnet/Mvc/hooks","issue_events_url":"https://api.github.com/repos/aspnet/Mvc/issues/events{/number}","events_url":"https://api.github.com/repos/aspnet/Mvc/events","assignees_url":"https://api.github.com/repos/aspnet/Mvc/assignees{/user}","branches_url":"https://api.github.com/repos/aspnet/Mvc/branches{/branch}","tags_url":"https://api.github.com/repos/aspnet/Mvc/tags","blobs_url":"https://api.github.com/repos/aspnet/Mvc/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/aspnet/Mvc/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/aspnet/Mvc/git/refs{/sha}","trees_url":"https://api.github.com/repos/aspnet/Mvc/git/trees{/sha}","statuses_url":"https://api.github.com/repos/aspnet/Mvc/statuses/{sha}","languages_url":"https://api.github.com/repos/aspnet/Mvc/languages","stargazers_url":"https://api.github.com/repos/aspnet/Mvc/stargazers","contributors_url":"https://api.github.com/repos/aspnet/Mvc/contributors","subscribers_url":"https://api.github.com/repos/aspnet/Mvc/subscribers","subscription_url":"https://api.github.com/repos/aspnet/Mvc/subscription","commits_url":"https://api.github.com/repos/aspnet/Mvc/commits{/sha}","git_commits_url":"https://api.github.com/repos/aspnet/Mvc/git/commits{/sha}","comments_url":"https://api.github.com/repos/aspnet/Mvc/comments{/number}","issue_comment_url":"https://api.github.com/repos/aspnet/Mvc/issues/comments{/number}","contents_url":"https://api.github.com/repos/aspnet/Mvc/contents/{+path}","compare_url":"https://api.github.com/repos/aspnet/Mvc/compare/{base}...{head}","merges_url":"https://api.github.com/repos/aspnet/Mvc/merges","archive_url":"https://api.github.com/repos/aspnet/Mvc/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/aspnet/Mvc/downloads","issues_url":"https://api.github.com/repos/aspnet/Mvc/issues{/number}","pulls_url":"https://api.github.com/repos/aspnet/Mvc/pulls{/number}","milestones_url":"https://api.github.com/repos/aspnet/Mvc/milestones{/number}","notifications_url":"https://api.github.com/repos/aspnet/Mvc/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/aspnet/Mvc/labels{/name}","releases_url":"https://api.github.com/repos/aspnet/Mvc/releases{/id}","deployments_url":"https://api.github.com/repos/aspnet/Mvc/deployments","created_at":"2013-12-12T03:54:00Z","updated_at":"2018-06-08T17:51:56Z","pushed_at":"2018-06-08T16:07:56Z","git_url":"git://github.com/aspnet/Mvc.git","ssh_url":"git@github.com:aspnet/Mvc.git","clone_url":"https://github.com/aspnet/Mvc.git","svn_url":"https://github.com/aspnet/Mvc","homepage":"","size":69972,"stargazers_count":5352,"watchers_count":5352,"language":"C#","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2102,"mirror_url":null,"archived":false,"open_issues_count":216,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":2102,"open_issues":216,"watchers":5352,"default_branch":"dev"}},"base":{"label":"aspnet:dev","ref":"dev","sha":"b7064c576de0ae04eb7731b59069ecab54c51a99","user":{"login":"aspnet","id":6476660,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY0NzY2NjA=","avatar_url":"https://avatars3.githubusercontent.com/u/6476660?v=4","gravatar_id":"","url":"https://api.github.com/users/aspnet","html_url":"https://github.com/aspnet","followers_url":"https://api.github.com/users/aspnet/followers","following_url":"https://api.github.com/users/aspnet/following{/other_user}","gists_url":"https://api.github.com/users/aspnet/gists{/gist_id}","starred_url":"https://api.github.com/users/aspnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aspnet/subscriptions","organizations_url":"https://api.github.com/users/aspnet/orgs","repos_url":"https://api.github.com/users/aspnet/repos","events_url":"https://api.github.com/users/aspnet/events{/privacy}","received_events_url":"https://api.github.com/users/aspnet/received_events","type":"Organization","site_admin":false},"repo":{"id":15126429,"node_id":"MDEwOlJlcG9zaXRvcnkxNTEyNjQyOQ==","name":"Mvc","full_name":"aspnet/Mvc","owner":{"login":"aspnet","id":6476660,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY0NzY2NjA=","avatar_url":"https://avatars3.githubusercontent.com/u/6476660?v=4","gravatar_id":"","url":"https://api.github.com/users/aspnet","html_url":"https://github.com/aspnet","followers_url":"https://api.github.com/users/aspnet/followers","following_url":"https://api.github.com/users/aspnet/following{/other_user}","gists_url":"https://api.github.com/users/aspnet/gists{/gist_id}","starred_url":"https://api.github.com/users/aspnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/aspnet/subscriptions","organizations_url":"https://api.github.com/users/aspnet/orgs","repos_url":"https://api.github.com/users/aspnet/repos","events_url":"https://api.github.com/users/aspnet/events{/privacy}","received_events_url":"https://api.github.com/users/aspnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/aspnet/Mvc","description":"ASP.NET Core MVC is a model view controller framework for building dynamic web sites with clean separation of concerns, including the merged MVC, Web API, and Web Pages w/ Razor.","fork":false,"url":"https://api.github.com/repos/aspnet/Mvc","forks_url":"https://api.github.com/repos/aspnet/Mvc/forks","keys_url":"https://api.github.com/repos/aspnet/Mvc/keys{/key_id}","collaborators_url":"https://api.github.com/repos/aspnet/Mvc/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/aspnet/Mvc/teams","hooks_url":"https://api.github.com/repos/aspnet/Mvc/hooks","issue_events_url":"https://api.github.com/repos/aspnet/Mvc/issues/events{/number}","events_url":"https://api.github.com/repos/aspnet/Mvc/events","assignees_url":"https://api.github.com/repos/aspnet/Mvc/assignees{/user}","branches_url":"https://api.github.com/repos/aspnet/Mvc/branches{/branch}","tags_url":"https://api.github.com/repos/aspnet/Mvc/tags","blobs_url":"https://api.github.com/repos/aspnet/Mvc/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/aspnet/Mvc/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/aspnet/Mvc/git/refs{/sha}","trees_url":"https://api.github.com/repos/aspnet/Mvc/git/trees{/sha}","statuses_url":"https://api.github.com/repos/aspnet/Mvc/statuses/{sha}","languages_url":"https://api.github.com/repos/aspnet/Mvc/languages","stargazers_url":"https://api.github.com/repos/aspnet/Mvc/stargazers","contributors_url":"https://api.github.com/repos/aspnet/Mvc/contributors","subscribers_url":"https://api.github.com/repos/aspnet/Mvc/subscribers","subscription_url":"https://api.github.com/repos/aspnet/Mvc/subscription","commits_url":"https://api.github.com/repos/aspnet/Mvc/commits{/sha}","git_commits_url":"https://api.github.com/repos/aspnet/Mvc/git/commits{/sha}","comments_url":"https://api.github.com/repos/aspnet/Mvc/comments{/number}","issue_comment_url":"https://api.github.com/repos/aspnet/Mvc/issues/comments{/number}","contents_url":"https://api.github.com/repos/aspnet/Mvc/contents/{+path}","compare_url":"https://api.github.com/repos/aspnet/Mvc/compare/{base}...{head}","merges_url":"https://api.github.com/repos/aspnet/Mvc/merges","archive_url":"https://api.github.com/repos/aspnet/Mvc/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/aspnet/Mvc/downloads","issues_url":"https://api.github.com/repos/aspnet/Mvc/issues{/number}","pulls_url":"https://api.github.com/repos/aspnet/Mvc/pulls{/number}","milestones_url":"https://api.github.com/repos/aspnet/Mvc/milestones{/number}","notifications_url":"https://api.github.com/repos/aspnet/Mvc/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/aspnet/Mvc/labels{/name}","releases_url":"https://api.github.com/repos/aspnet/Mvc/releases{/id}","deployments_url":"https://api.github.com/repos/aspnet/Mvc/deployments","created_at":"2013-12-12T03:54:00Z","updated_at":"2018-06-08T17:51:56Z","pushed_at":"2018-06-08T16:07:56Z","git_url":"git://github.com/aspnet/Mvc.git","ssh_url":"git@github.com:aspnet/Mvc.git","clone_url":"https://github.com/aspnet/Mvc.git","svn_url":"https://github.com/aspnet/Mvc","homepage":"","size":69972,"stargazers_count":5352,"watchers_count":5352,"language":"C#","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2102,"mirror_url":null,"archived":false,"open_issues_count":216,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":2102,"open_issues":216,"watchers":5352,"default_branch":"dev"}},"_links":{"self":{"href":"https://api.github.com/repos/aspnet/Mvc/pulls/7889"},"html":{"href":"https://github.com/aspnet/Mvc/pull/7889"},"issue":{"href":"https://api.github.com/repos/aspnet/Mvc/issues/7889"},"comments":{"href":"https://api.github.com/repos/aspnet/Mvc/issues/7889/comments"},"review_comments":{"href":"https://api.github.com/repos/aspnet/Mvc/pulls/7889/comments"},"review_comment":{"href":"https://api.github.com/repos/aspnet/Mvc/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/aspnet/Mvc/pulls/7889/commits"},"statuses":{"href":"https://api.github.com/repos/aspnet/Mvc/statuses/84fdd8c0d936d5287c902e18a6163f402b34b6ed"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"kichalla"}}