{"action":"created","comment":{"url":"https://api.github.com/repos/spring-projects/spring-security/pulls/comments/212437556","pull_request_review_id":149073027,"id":212437556,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxMjQzNzU1Ng==","diff_hunk":"@@ -151,120 +97,37 @@ public OAuth2AccessTokenResponse getTokenResponse(OAuth2ClientCredentialsGrantRe\n \t\treturn tokenResponse;\n \t}\n \n-\tprivate RequestEntity<MultiValueMap<String, String>> buildRequest(OAuth2ClientCredentialsGrantRequest clientCredentialsGrantRequest) {\n-\t\tHttpHeaders headers = this.buildHeaders(clientCredentialsGrantRequest);\n-\t\tMultiValueMap<String, String> formParameters = this.buildFormParameters(clientCredentialsGrantRequest);\n-\t\tURI uri = UriComponentsBuilder.fromUriString(clientCredentialsGrantRequest.getClientRegistration().getProviderDetails().getTokenUri())\n-\t\t\t\t.build()\n-\t\t\t\t.toUri();\n-\n-\t\treturn new RequestEntity<>(formParameters, headers, HttpMethod.POST, uri);\n-\t}\n-\n-\tprivate HttpHeaders buildHeaders(OAuth2ClientCredentialsGrantRequest clientCredentialsGrantRequest) {\n-\t\tClientRegistration clientRegistration = clientCredentialsGrantRequest.getClientRegistration();\n-\n-\t\tHttpHeaders headers = new HttpHeaders();\n-\t\theaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));\n-\t\theaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);\n-\t\tif (ClientAuthenticationMethod.BASIC.equals(clientRegistration.getClientAuthenticationMethod())) {\n-\t\t\theaders.setBasicAuth(clientRegistration.getClientId(), clientRegistration.getClientSecret());\n-\t\t}\n-\n-\t\treturn headers;\n-\t}\n-\n-\tprivate MultiValueMap<String, String> buildFormParameters(OAuth2ClientCredentialsGrantRequest clientCredentialsGrantRequest) {\n-\t\tClientRegistration clientRegistration = clientCredentialsGrantRequest.getClientRegistration();\n-\n-\t\tMultiValueMap<String, String> formParameters = new LinkedMultiValueMap<>();\n-\t\tformParameters.add(OAuth2ParameterNames.GRANT_TYPE, clientCredentialsGrantRequest.getGrantType().getValue());\n-\t\tif (!CollectionUtils.isEmpty(clientRegistration.getScopes())) {\n-\t\t\tformParameters.add(OAuth2ParameterNames.SCOPE,\n-\t\t\t\t\tStringUtils.collectionToDelimitedString(clientRegistration.getScopes(), \" \"));\n-\t\t}\n-\t\tif (ClientAuthenticationMethod.POST.equals(clientRegistration.getClientAuthenticationMethod())) {\n-\t\t\tformParameters.add(OAuth2ParameterNames.CLIENT_ID, clientRegistration.getClientId());\n-\t\t\tformParameters.add(OAuth2ParameterNames.CLIENT_SECRET, clientRegistration.getClientSecret());\n-\t\t}\n-\n-\t\treturn formParameters;\n-\t}\n-\n-\tprivate OAuth2Error parseErrorResponse(Map<String, String> responseParameters) {\n-\t\tif (CollectionUtils.isEmpty(responseParameters) ||\n-\t\t\t\t!responseParameters.containsKey(OAuth2ParameterNames.ERROR)) {\n-\t\t\treturn null;\n-\t\t}\n-\n-\t\tString errorCode = responseParameters.get(OAuth2ParameterNames.ERROR);\n-\t\tString errorDescription = responseParameters.get(OAuth2ParameterNames.ERROR_DESCRIPTION);\n-\t\tString errorUri = responseParameters.get(OAuth2ParameterNames.ERROR_URI);\n-\n-\t\treturn new OAuth2Error(errorCode, errorDescription, errorUri);\n-\t}\n-\n-\tprivate OAuth2AccessTokenResponse parseTokenResponse(Map<String, String> responseParameters) {\n-\t\tif (CollectionUtils.isEmpty(responseParameters) ||\n-\t\t\t\t!responseParameters.containsKey(OAuth2ParameterNames.ACCESS_TOKEN) ||\n-\t\t\t\t!responseParameters.containsKey(OAuth2ParameterNames.TOKEN_TYPE)) {\n-\t\t\treturn null;\n-\t\t}\n-\n-\t\tString accessToken = responseParameters.get(OAuth2ParameterNames.ACCESS_TOKEN);\n-\n-\t\tOAuth2AccessToken.TokenType accessTokenType = null;\n-\t\tif (OAuth2AccessToken.TokenType.BEARER.getValue().equalsIgnoreCase(\n-\t\t\t\tresponseParameters.get(OAuth2ParameterNames.TOKEN_TYPE))) {\n-\t\t\taccessTokenType = OAuth2AccessToken.TokenType.BEARER;\n-\t\t}\n-\n-\t\tlong expiresIn = 0;\n-\t\tif (responseParameters.containsKey(OAuth2ParameterNames.EXPIRES_IN)) {\n-\t\t\ttry {\n-\t\t\t\texpiresIn = Long.valueOf(responseParameters.get(OAuth2ParameterNames.EXPIRES_IN));\n-\t\t\t} catch (NumberFormatException ex) { }\n-\t\t}\n-\n-\t\tSet<String> scopes = Collections.emptySet();\n-\t\tif (responseParameters.containsKey(OAuth2ParameterNames.SCOPE)) {\n-\t\t\tString scope = responseParameters.get(OAuth2ParameterNames.SCOPE);\n-\t\t\tscopes = Arrays.stream(StringUtils.delimitedListToStringArray(scope, \" \")).collect(Collectors.toSet());\n-\t\t}\n-\n-\t\tMap<String, Object> additionalParameters = new LinkedHashMap<>();\n-\t\tSet<String> tokenResponseParameterNames = Stream.of(TOKEN_RESPONSE_PARAMETER_NAMES).collect(Collectors.toSet());\n-\t\tresponseParameters.entrySet().stream()\n-\t\t\t\t.filter(e -> !tokenResponseParameterNames.contains(e.getKey()))\n-\t\t\t\t.forEach(e -> additionalParameters.put(e.getKey(), e.getValue()));\n-\n-\t\treturn OAuth2AccessTokenResponse.withToken(accessToken)\n-\t\t\t\t.tokenType(accessTokenType)\n-\t\t\t\t.expiresIn(expiresIn)\n-\t\t\t\t.scopes(scopes)\n-\t\t\t\t.additionalParameters(additionalParameters)\n-\t\t\t\t.build();\n+\t/**\n+\t * Sets the {@link Converter} used for converting the {@link OAuth2ClientCredentialsGrantRequest}\n+\t * to a {@link RequestEntity} representation of the OAuth 2.0 Access Token Request.\n+\t *\n+\t * @param requestEntityConverter the {@link Converter} used for converting to a {@link RequestEntity} representation of the Access Token Request\n+\t */\n+\tpublic final void setRequestEntityConverter(Converter<OAuth2ClientCredentialsGrantRequest, RequestEntity<?>> requestEntityConverter) {\n+\t\tAssert.notNull(requestEntityConverter, \"requestEntityConverter cannot be null\");\n+\t\tthis.requestEntityConverter = requestEntityConverter;\n \t}\n \n \t/**\n-\t * Sets the {@link RestOperations} used when requesting the access token response.\n+\t * Sets the {@link RestOperations} used when requesting the OAuth 2.0 Access Token Response.\n \t *\n-\t * @param restOperations the {@link RestOperations} used when requesting the access token response\n+\t * @param restOperations the {@link RestOperations} used when requesting the Access Token Response\n \t */\n \tpublic final void setRestOperations(RestOperations restOperations) {","path":"oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/endpoint/DefaultClientCredentialsTokenResponseClient.java","position":255,"original_position":255,"commit_id":"d54e59864f46555b8487b85c29b78ce1bc012552","original_commit_id":"d54e59864f46555b8487b85c29b78ce1bc012552","user":{"login":"rwinch","id":362503,"node_id":"MDQ6VXNlcjM2MjUwMw==","avatar_url":"https://avatars0.githubusercontent.com/u/362503?v=4","gravatar_id":"","url":"https://api.github.com/users/rwinch","html_url":"https://github.com/rwinch","followers_url":"https://api.github.com/users/rwinch/followers","following_url":"https://api.github.com/users/rwinch/following{/other_user}","gists_url":"https://api.github.com/users/rwinch/gists{/gist_id}","starred_url":"https://api.github.com/users/rwinch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rwinch/subscriptions","organizations_url":"https://api.github.com/users/rwinch/orgs","repos_url":"https://api.github.com/users/rwinch/repos","events_url":"https://api.github.com/users/rwinch/events{/privacy}","received_events_url":"https://api.github.com/users/rwinch/received_events","type":"User","site_admin":false},"body":"How can someone inject the RestOperations and still get valid error handling? I think we may need to make OAuth2ErrorResponseErrorHandler public. ","created_at":"2018-08-23T19:57:53Z","updated_at":"2018-08-23T19:57:53Z","html_url":"https://github.com/spring-projects/spring-security/pull/5656#discussion_r212437556","pull_request_url":"https://api.github.com/repos/spring-projects/spring-security/pulls/5656","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/spring-projects/spring-security/pulls/comments/212437556"},"html":{"href":"https://github.com/spring-projects/spring-security/pull/5656#discussion_r212437556"},"pull_request":{"href":"https://api.github.com/repos/spring-projects/spring-security/pulls/5656"}}},"pull_request":{"url":"https://api.github.com/repos/spring-projects/spring-security/pulls/5656","id":207665888,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA3NjY1ODg4","html_url":"https://github.com/spring-projects/spring-security/pull/5656","diff_url":"https://github.com/spring-projects/spring-security/pull/5656.diff","patch_url":"https://github.com/spring-projects/spring-security/pull/5656.patch","issue_url":"https://api.github.com/repos/spring-projects/spring-security/issues/5656","number":5656,"state":"open","locked":false,"title":"Add support for customizing the Access Token Request","user":{"login":"jgrandja","id":10884212,"node_id":"MDQ6VXNlcjEwODg0MjEy","avatar_url":"https://avatars1.githubusercontent.com/u/10884212?v=4","gravatar_id":"","url":"https://api.github.com/users/jgrandja","html_url":"https://github.com/jgrandja","followers_url":"https://api.github.com/users/jgrandja/followers","following_url":"https://api.github.com/users/jgrandja/following{/other_user}","gists_url":"https://api.github.com/users/jgrandja/gists{/gist_id}","starred_url":"https://api.github.com/users/jgrandja/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jgrandja/subscriptions","organizations_url":"https://api.github.com/users/jgrandja/orgs","repos_url":"https://api.github.com/users/jgrandja/repos","events_url":"https://api.github.com/users/jgrandja/events{/privacy}","received_events_url":"https://api.github.com/users/jgrandja/received_events","type":"User","site_admin":false},"body":"This PR resolves #5547 and #5466 \r\n\r\nThe 1st commit pushes most of the code from `DefaultClientCredentialsTokenResponseClient` to an abstract implementation `AbstractOAuth2AccessTokenResponseClient` to allow for reuse in the next commit.\r\n\r\nThe 2nd commit adds a new implementation of `OAuth2AccessTokenResponseClient` for the `authorization_code` grant `DefaultAuthorizationCodeTokenResponseClient` - extending `AbstractOAuth2AccessTokenResponseClient`.\r\n\r\nThe 3rd commit makes `DefaultAuthorizationCodeTokenResponseClient` the default client replacing the previous default `NimbusAuthorizationCodeTokenResponseClient`.","created_at":"2018-08-10T16:43:25Z","updated_at":"2018-08-23T19:57:53Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e869bdfb745090f0e8cd0ad8a0f0bdb18213f2af","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/spring-projects/spring-security/pulls/5656/commits","review_comments_url":"https://api.github.com/repos/spring-projects/spring-security/pulls/5656/comments","review_comment_url":"https://api.github.com/repos/spring-projects/spring-security/pulls/comments{/number}","comments_url":"https://api.github.com/repos/spring-projects/spring-security/issues/5656/comments","statuses_url":"https://api.github.com/repos/spring-projects/spring-security/statuses/d54e59864f46555b8487b85c29b78ce1bc012552","head":{"label":"jgrandja:gh-5547-restops-token-client","ref":"gh-5547-restops-token-client","sha":"d54e59864f46555b8487b85c29b78ce1bc012552","user":{"login":"jgrandja","id":10884212,"node_id":"MDQ6VXNlcjEwODg0MjEy","avatar_url":"https://avatars1.githubusercontent.com/u/10884212?v=4","gravatar_id":"","url":"https://api.github.com/users/jgrandja","html_url":"https://github.com/jgrandja","followers_url":"https://api.github.com/users/jgrandja/followers","following_url":"https://api.github.com/users/jgrandja/following{/other_user}","gists_url":"https://api.github.com/users/jgrandja/gists{/gist_id}","starred_url":"https://api.github.com/users/jgrandja/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jgrandja/subscriptions","organizations_url":"https://api.github.com/users/jgrandja/orgs","repos_url":"https://api.github.com/users/jgrandja/repos","events_url":"https://api.github.com/users/jgrandja/events{/privacy}","received_events_url":"https://api.github.com/users/jgrandja/received_events","type":"User","site_admin":false},"repo":{"id":54121519,"node_id":"MDEwOlJlcG9zaXRvcnk1NDEyMTUxOQ==","name":"spring-security","full_name":"jgrandja/spring-security","owner":{"login":"jgrandja","id":10884212,"node_id":"MDQ6VXNlcjEwODg0MjEy","avatar_url":"https://avatars1.githubusercontent.com/u/10884212?v=4","gravatar_id":"","url":"https://api.github.com/users/jgrandja","html_url":"https://github.com/jgrandja","followers_url":"https://api.github.com/users/jgrandja/followers","following_url":"https://api.github.com/users/jgrandja/following{/other_user}","gists_url":"https://api.github.com/users/jgrandja/gists{/gist_id}","starred_url":"https://api.github.com/users/jgrandja/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jgrandja/subscriptions","organizations_url":"https://api.github.com/users/jgrandja/orgs","repos_url":"https://api.github.com/users/jgrandja/repos","events_url":"https://api.github.com/users/jgrandja/events{/privacy}","received_events_url":"https://api.github.com/users/jgrandja/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jgrandja/spring-security","description":"Spring Security","fork":true,"url":"https://api.github.com/repos/jgrandja/spring-security","forks_url":"https://api.github.com/repos/jgrandja/spring-security/forks","keys_url":"https://api.github.com/repos/jgrandja/spring-security/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jgrandja/spring-security/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jgrandja/spring-security/teams","hooks_url":"https://api.github.com/repos/jgrandja/spring-security/hooks","issue_events_url":"https://api.github.com/repos/jgrandja/spring-security/issues/events{/number}","events_url":"https://api.github.com/repos/jgrandja/spring-security/events","assignees_url":"https://api.github.com/repos/jgrandja/spring-security/assignees{/user}","branches_url":"https://api.github.com/repos/jgrandja/spring-security/branches{/branch}","tags_url":"https://api.github.com/repos/jgrandja/spring-security/tags","blobs_url":"https://api.github.com/repos/jgrandja/spring-security/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jgrandja/spring-security/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jgrandja/spring-security/git/refs{/sha}","trees_url":"https://api.github.com/repos/jgrandja/spring-security/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jgrandja/spring-security/statuses/{sha}","languages_url":"https://api.github.com/repos/jgrandja/spring-security/languages","stargazers_url":"https://api.github.com/repos/jgrandja/spring-security/stargazers","contributors_url":"https://api.github.com/repos/jgrandja/spring-security/contributors","subscribers_url":"https://api.github.com/repos/jgrandja/spring-security/subscribers","subscription_url":"https://api.github.com/repos/jgrandja/spring-security/subscription","commits_url":"https://api.github.com/repos/jgrandja/spring-security/commits{/sha}","git_commits_url":"https://api.github.com/repos/jgrandja/spring-security/git/commits{/sha}","comments_url":"https://api.github.com/repos/jgrandja/spring-security/comments{/number}","issue_comment_url":"https://api.github.com/repos/jgrandja/spring-security/issues/comments{/number}","contents_url":"https://api.github.com/repos/jgrandja/spring-security/contents/{+path}","compare_url":"https://api.github.com/repos/jgrandja/spring-security/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jgrandja/spring-security/merges","archive_url":"https://api.github.com/repos/jgrandja/spring-security/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jgrandja/spring-security/downloads","issues_url":"https://api.github.com/repos/jgrandja/spring-security/issues{/number}","pulls_url":"https://api.github.com/repos/jgrandja/spring-security/pulls{/number}","milestones_url":"https://api.github.com/repos/jgrandja/spring-security/milestones{/number}","notifications_url":"https://api.github.com/repos/jgrandja/spring-security/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jgrandja/spring-security/labels{/name}","releases_url":"https://api.github.com/repos/jgrandja/spring-security/releases{/id}","deployments_url":"https://api.github.com/repos/jgrandja/spring-security/deployments","created_at":"2016-03-17T13:50:21Z","updated_at":"2018-07-23T14:49:55Z","pushed_at":"2018-08-23T18:54:26Z","git_url":"git://github.com/jgrandja/spring-security.git","ssh_url":"git@github.com:jgrandja/spring-security.git","clone_url":"https://github.com/jgrandja/spring-security.git","svn_url":"https://github.com/jgrandja/spring-security","homepage":"http://spring.io/spring-security","size":30896,"stargazers_count":2,"watchers_count":2,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":2,"default_branch":"master"}},"base":{"label":"spring-projects:master","ref":"master","sha":"68878a167580d16755e7778383fa81dd7819f79b","user":{"login":"spring-projects","id":317776,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMxNzc3Ng==","avatar_url":"https://avatars0.githubusercontent.com/u/317776?v=4","gravatar_id":"","url":"https://api.github.com/users/spring-projects","html_url":"https://github.com/spring-projects","followers_url":"https://api.github.com/users/spring-projects/followers","following_url":"https://api.github.com/users/spring-projects/following{/other_user}","gists_url":"https://api.github.com/users/spring-projects/gists{/gist_id}","starred_url":"https://api.github.com/users/spring-projects/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spring-projects/subscriptions","organizations_url":"https://api.github.com/users/spring-projects/orgs","repos_url":"https://api.github.com/users/spring-projects/repos","events_url":"https://api.github.com/users/spring-projects/events{/privacy}","received_events_url":"https://api.github.com/users/spring-projects/received_events","type":"Organization","site_admin":false},"repo":{"id":3148979,"node_id":"MDEwOlJlcG9zaXRvcnkzMTQ4OTc5","name":"spring-security","full_name":"spring-projects/spring-security","owner":{"login":"spring-projects","id":317776,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMxNzc3Ng==","avatar_url":"https://avatars0.githubusercontent.com/u/317776?v=4","gravatar_id":"","url":"https://api.github.com/users/spring-projects","html_url":"https://github.com/spring-projects","followers_url":"https://api.github.com/users/spring-projects/followers","following_url":"https://api.github.com/users/spring-projects/following{/other_user}","gists_url":"https://api.github.com/users/spring-projects/gists{/gist_id}","starred_url":"https://api.github.com/users/spring-projects/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spring-projects/subscriptions","organizations_url":"https://api.github.com/users/spring-projects/orgs","repos_url":"https://api.github.com/users/spring-projects/repos","events_url":"https://api.github.com/users/spring-projects/events{/privacy}","received_events_url":"https://api.github.com/users/spring-projects/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/spring-projects/spring-security","description":"Spring Security","fork":false,"url":"https://api.github.com/repos/spring-projects/spring-security","forks_url":"https://api.github.com/repos/spring-projects/spring-security/forks","keys_url":"https://api.github.com/repos/spring-projects/spring-security/keys{/key_id}","collaborators_url":"https://api.github.com/repos/spring-projects/spring-security/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/spring-projects/spring-security/teams","hooks_url":"https://api.github.com/repos/spring-projects/spring-security/hooks","issue_events_url":"https://api.github.com/repos/spring-projects/spring-security/issues/events{/number}","events_url":"https://api.github.com/repos/spring-projects/spring-security/events","assignees_url":"https://api.github.com/repos/spring-projects/spring-security/assignees{/user}","branches_url":"https://api.github.com/repos/spring-projects/spring-security/branches{/branch}","tags_url":"https://api.github.com/repos/spring-projects/spring-security/tags","blobs_url":"https://api.github.com/repos/spring-projects/spring-security/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/spring-projects/spring-security/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/spring-projects/spring-security/git/refs{/sha}","trees_url":"https://api.github.com/repos/spring-projects/spring-security/git/trees{/sha}","statuses_url":"https://api.github.com/repos/spring-projects/spring-security/statuses/{sha}","languages_url":"https://api.github.com/repos/spring-projects/spring-security/languages","stargazers_url":"https://api.github.com/repos/spring-projects/spring-security/stargazers","contributors_url":"https://api.github.com/repos/spring-projects/spring-security/contributors","subscribers_url":"https://api.github.com/repos/spring-projects/spring-security/subscribers","subscription_url":"https://api.github.com/repos/spring-projects/spring-security/subscription","commits_url":"https://api.github.com/repos/spring-projects/spring-security/commits{/sha}","git_commits_url":"https://api.github.com/repos/spring-projects/spring-security/git/commits{/sha}","comments_url":"https://api.github.com/repos/spring-projects/spring-security/comments{/number}","issue_comment_url":"https://api.github.com/repos/spring-projects/spring-security/issues/comments{/number}","contents_url":"https://api.github.com/repos/spring-projects/spring-security/contents/{+path}","compare_url":"https://api.github.com/repos/spring-projects/spring-security/compare/{base}...{head}","merges_url":"https://api.github.com/repos/spring-projects/spring-security/merges","archive_url":"https://api.github.com/repos/spring-projects/spring-security/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/spring-projects/spring-security/downloads","issues_url":"https://api.github.com/repos/spring-projects/spring-security/issues{/number}","pulls_url":"https://api.github.com/repos/spring-projects/spring-security/pulls{/number}","milestones_url":"https://api.github.com/repos/spring-projects/spring-security/milestones{/number}","notifications_url":"https://api.github.com/repos/spring-projects/spring-security/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/spring-projects/spring-security/labels{/name}","releases_url":"https://api.github.com/repos/spring-projects/spring-security/releases{/id}","deployments_url":"https://api.github.com/repos/spring-projects/spring-security/deployments","created_at":"2012-01-10T21:50:57Z","updated_at":"2018-08-23T18:00:43Z","pushed_at":"2018-08-23T18:54:28Z","git_url":"git://github.com/spring-projects/spring-security.git","ssh_url":"git@github.com:spring-projects/spring-security.git","clone_url":"https://github.com/spring-projects/spring-security.git","svn_url":"https://github.com/spring-projects/spring-security","homepage":"http://spring.io/spring-security","size":31894,"stargazers_count":2718,"watchers_count":2718,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":2621,"mirror_url":null,"archived":false,"open_issues_count":880,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":2621,"open_issues":880,"watchers":2718,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/spring-projects/spring-security/pulls/5656"},"html":{"href":"https://github.com/spring-projects/spring-security/pull/5656"},"issue":{"href":"https://api.github.com/repos/spring-projects/spring-security/issues/5656"},"comments":{"href":"https://api.github.com/repos/spring-projects/spring-security/issues/5656/comments"},"review_comments":{"href":"https://api.github.com/repos/spring-projects/spring-security/pulls/5656/comments"},"review_comment":{"href":"https://api.github.com/repos/spring-projects/spring-security/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/spring-projects/spring-security/pulls/5656/commits"},"statuses":{"href":"https://api.github.com/repos/spring-projects/spring-security/statuses/d54e59864f46555b8487b85c29b78ce1bc012552"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"rwinch"}}