{"action":"created","comment":{"url":"https://api.github.com/repos/codice/ddf/pulls/comments/220640523","pull_request_review_id":159087248,"id":220640523,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyMDY0MDUyMw==","diff_hunk":"@@ -98,63 +106,50 @@\n   private static final Logger LOGGER = LoggerFactory.getLogger(HttpSolrClientFactory.class);\n \n   @Override\n-  public org.codice.solr.client.solrj.SolrClient newClient(String core) {\n-    String solrUrl =\n-        StringUtils.defaultIfBlank(\n-            AccessController.doPrivileged(\n-                (PrivilegedAction<String>) () -> System.getProperty(SOLR_HTTP_URL)),\n-            getDefaultHttpsAddress());\n-    final String coreUrl = solrUrl + \"/\" + core;\n-    final String solrDataDir =\n-        AccessController.doPrivileged(\n-            (PrivilegedAction<String>) () -> System.getProperty(SOLR_DATA_DIR));\n-\n-    if (solrDataDir != null) {\n-      ConfigurationStore.getInstance().setDataDirectoryPath(solrDataDir);\n+  public org.codice.solr.client.solrj.SolrClient newClient(String coreName) {\n+    Args.notEmpty(coreName, \"Cannot create Solr client. Missing core name.\");\n+    if (getSolrDir() != null) {\n+      ConfigurationStore.getInstance().setDataDirectoryPath(getSolrDir());\n     }\n-    LOGGER.debug(\"Solr({}): Creating an HTTP Solr client using url [{}]\", core, coreUrl);\n-    return new SolrClientAdapter(core, () -> createSolrHttpClient(solrUrl, core, coreUrl));\n+    LOGGER.debug(\n+        \"Solr({}): Creating an HTTP Solr client using url [{}]\", coreName, getCoreUrl(coreName));\n+    return new SolrClientAdapter(coreName, () -> createSolrHttpClient(coreName));\n   }\n \n   @VisibleForTesting\n-  SolrClient createSolrHttpClient(String url, String coreName, String coreUrl)\n-      throws IOException, SolrServerException {\n-    final HttpClientBuilder builder =\n-        HttpClients.custom()\n-            .setDefaultCookieStore(new BasicCookieStore())\n-            .setMaxConnTotal(128)\n-            .setMaxConnPerRoute(32);\n+  SolrClient createSolrHttpClient(String coreName) throws IOException, SolrServerException {\n+    final HttpClientBuilder httpClientBuilder = createHttpBuilder();\n+    final HttpSolrClient.Builder solrClientBuilder =\n+        new HttpSolrClient.Builder(getCoreUrl(coreName));\n \n-    if (StringUtils.startsWithIgnoreCase(url, \"https\")) {\n-      builder.setSSLSocketFactory(\n-          new SSLConnectionSocketFactory(\n-              getSslContext(),\n-              getProtocols(),\n-              getCipherSuites(),\n-              SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER));\n-    }\n-    createSolrCore(url, coreName, null, builder.build());\n     try (final Closer closer = new Closer()) {\n-      final HttpSolrClient noRetryClient =\n-          closer.with(new HttpSolrClient.Builder(coreUrl).withHttpClient(builder.build()).build());\n-      final HttpSolrClient retryClient =\n-          closer.with(\n-              new HttpSolrClient.Builder(coreUrl)\n-                  .withHttpClient(\n-                      builder.setRetryHandler(new SolrHttpRequestRetryHandler(coreName)).build())\n-                  .build());\n-\n-      return closer.returning(new PingAwareSolrClientProxy(retryClient, noRetryClient));\n+\n+      createSolrCore(coreName, null, httpClientBuilder.build());\n+\n+      CloseableHttpClient noRetryHttpClient = httpClientBuilder.build();\n+      final HttpSolrClient noRetrySolrClient =\n+          closer.with(solrClientBuilder.withHttpClient(noRetryHttpClient).build());\n+\n+      CloseableHttpClient yesRetryHttpClient =\n+          httpClientBuilder.setRetryHandler(new SolrHttpRequestRetryHandler(coreName)).build();\n+      final HttpSolrClient retrySolrClient =\n+          closer.with(solrClientBuilder.withHttpClient(yesRetryHttpClient).build());\n+\n+      return closer.returning(new PingAwareSolrClientProxy(retrySolrClient, noRetrySolrClient));\n     }\n   }\n \n+  private boolean useTls() {\n+    return StringUtils.startsWithIgnoreCase(getSolrUrl(), \"https\");","path":"platform/solr/solr-factory/src/main/java/org/codice/solr/factory/impl/HttpSolrClientFactory.java","position":172,"original_position":125,"commit_id":"f9c71591277c955f34aee2e4ac664d435de90832","original_commit_id":"58c7bcaf47a8be001e420cc17cdfe2ac36b470f0","user":{"login":"stustison","id":4391679,"node_id":"MDQ6VXNlcjQzOTE2Nzk=","avatar_url":"https://avatars0.githubusercontent.com/u/4391679?v=4","gravatar_id":"","url":"https://api.github.com/users/stustison","html_url":"https://github.com/stustison","followers_url":"https://api.github.com/users/stustison/followers","following_url":"https://api.github.com/users/stustison/following{/other_user}","gists_url":"https://api.github.com/users/stustison/gists{/gist_id}","starred_url":"https://api.github.com/users/stustison/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stustison/subscriptions","organizations_url":"https://api.github.com/users/stustison/orgs","repos_url":"https://api.github.com/users/stustison/repos","events_url":"https://api.github.com/users/stustison/events{/privacy}","received_events_url":"https://api.github.com/users/stustison/received_events","type":"User","site_admin":false},"body":"Definitely cache and reuse this URL.","created_at":"2018-09-26T16:45:18Z","updated_at":"2018-09-26T16:51:16Z","html_url":"https://github.com/codice/ddf/pull/3746#discussion_r220640523","pull_request_url":"https://api.github.com/repos/codice/ddf/pulls/3746","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/codice/ddf/pulls/comments/220640523"},"html":{"href":"https://github.com/codice/ddf/pull/3746#discussion_r220640523"},"pull_request":{"href":"https://api.github.com/repos/codice/ddf/pulls/3746"}},"in_reply_to_id":217846724},"pull_request":{"url":"https://api.github.com/repos/codice/ddf/pulls/3746","id":215712244,"node_id":"MDExOlB1bGxSZXF1ZXN0MjE1NzEyMjQ0","html_url":"https://github.com/codice/ddf/pull/3746","diff_url":"https://github.com/codice/ddf/pull/3746.diff","patch_url":"https://github.com/codice/ddf/pull/3746.patch","issue_url":"https://api.github.com/repos/codice/ddf/issues/3746","number":3746,"state":"open","locked":false,"title":"DDF-4133 Improve communication with Solr","user":{"login":"ahoffer","id":133284,"node_id":"MDQ6VXNlcjEzMzI4NA==","avatar_url":"https://avatars3.githubusercontent.com/u/133284?v=4","gravatar_id":"","url":"https://api.github.com/users/ahoffer","html_url":"https://github.com/ahoffer","followers_url":"https://api.github.com/users/ahoffer/followers","following_url":"https://api.github.com/users/ahoffer/following{/other_user}","gists_url":"https://api.github.com/users/ahoffer/gists{/gist_id}","starred_url":"https://api.github.com/users/ahoffer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ahoffer/subscriptions","organizations_url":"https://api.github.com/users/ahoffer/orgs","repos_url":"https://api.github.com/users/ahoffer/repos","events_url":"https://api.github.com/users/ahoffer/events{/privacy}","received_events_url":"https://api.github.com/users/ahoffer/received_events","type":"User","site_admin":false},"body":"#### What does this PR do?\r\nThe two goals of this PR  are:\r\n    1. Use SSL to communicate between DDF and Solr with no client authorization. \r\n    2. Use basic auth over SSL so that Solr can grant access to DDF and no one else.\r\n\r\n#### Who is reviewing it? \r\n@mcalcote @austinsteffes @paouelle \r\n\r\n#### Ask 2 committers to review/merge the PR and tag them here.\r\n@clockard\r\n@stustison \r\n@pklinef \r\n\r\n#### Tag the appropriate codice teams\r\n@codice/solr \r\n@codice/security \r\n\r\n#### How should this be tested?\r\nFor heroing, there are several scenarios to test:\r\n 1. Verify DDF \"just works\" out of the box. This is, can it communicate with Solr without configuration.\r\n 2.  Attempt to log into the Solr admin console. Verify that it does not permit access unless provided with the username and password.\r\n 3.  Change the password and username for the Solr user. Update the DDF system.properties file with the new username and password. Restart DDF and Solr. Verify they can still communicate.\r\n\r\n#### Any background context you want to provide?\r\nGetting this to work was a little tricky because the Apache HTTP client only sends basic auth headers for GET requests. However, Solr requires that the basic auth header be present for POST and DELETE requests as well. The effort is large enough that some work must exist as sub-tickets.\r\n\r\nDocumentation - https://codice.atlassian.net/browse/DDF-4148\r\nSecurity - https://codice.atlassian.net/browse/DDF-4149 \r\n\r\n#### What are the relevant tickets?\r\n[](https://codice.atlassian.net/browse/)\r\n#### Screenshots\r\n<!--(if appropriate)-->\r\n#### Checklist:\r\n- [ ] Documentation Updated\r\n- [X] Update / Add Unit Tests\r\n- [N/A] Update / Add Integration Tests\r\n\r\n#### Notes on Review Process\r\nPlease see [Notes on Review Process](https://codice.atlassian.net/wiki/spaces/DDF/pages/71946981/Pull+Request+Guidelines) for further guidance on requirements for merging and abbreviated reviews. \r\n\r\n#### Review Comment Legend:\r\n- ✏️ (Pencil) This comment is a nitpick or style suggestion, no action required for approval. This comment should provide a suggestion either as an in line code snippet or a gist. \r\n- ❓ (Question Mark) This comment is to gain a clearer understanding of design or code choices, clarification is required but action may not be necessary for approval.\r\n- ❗ (Exclamation Mark) This comment is critical and requires clarification or action before approval.\r\n","created_at":"2018-09-14T21:10:06Z","updated_at":"2018-09-26T16:51:16Z","closed_at":null,"merged_at":null,"merge_commit_sha":"632e9762ed70e0ed57da01eb21e628f0e748876b","assignee":{"login":"pklinef","id":700518,"node_id":"MDQ6VXNlcjcwMDUxOA==","avatar_url":"https://avatars1.githubusercontent.com/u/700518?v=4","gravatar_id":"","url":"https://api.github.com/users/pklinef","html_url":"https://github.com/pklinef","followers_url":"https://api.github.com/users/pklinef/followers","following_url":"https://api.github.com/users/pklinef/following{/other_user}","gists_url":"https://api.github.com/users/pklinef/gists{/gist_id}","starred_url":"https://api.github.com/users/pklinef/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pklinef/subscriptions","organizations_url":"https://api.github.com/users/pklinef/orgs","repos_url":"https://api.github.com/users/pklinef/repos","events_url":"https://api.github.com/users/pklinef/events{/privacy}","received_events_url":"https://api.github.com/users/pklinef/received_events","type":"User","site_admin":false},"assignees":[{"login":"pklinef","id":700518,"node_id":"MDQ6VXNlcjcwMDUxOA==","avatar_url":"https://avatars1.githubusercontent.com/u/700518?v=4","gravatar_id":"","url":"https://api.github.com/users/pklinef","html_url":"https://github.com/pklinef","followers_url":"https://api.github.com/users/pklinef/followers","following_url":"https://api.github.com/users/pklinef/following{/other_user}","gists_url":"https://api.github.com/users/pklinef/gists{/gist_id}","starred_url":"https://api.github.com/users/pklinef/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pklinef/subscriptions","organizations_url":"https://api.github.com/users/pklinef/orgs","repos_url":"https://api.github.com/users/pklinef/repos","events_url":"https://api.github.com/users/pklinef/events{/privacy}","received_events_url":"https://api.github.com/users/pklinef/received_events","type":"User","site_admin":false},{"login":"stustison","id":4391679,"node_id":"MDQ6VXNlcjQzOTE2Nzk=","avatar_url":"https://avatars0.githubusercontent.com/u/4391679?v=4","gravatar_id":"","url":"https://api.github.com/users/stustison","html_url":"https://github.com/stustison","followers_url":"https://api.github.com/users/stustison/followers","following_url":"https://api.github.com/users/stustison/following{/other_user}","gists_url":"https://api.github.com/users/stustison/gists{/gist_id}","starred_url":"https://api.github.com/users/stustison/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stustison/subscriptions","organizations_url":"https://api.github.com/users/stustison/orgs","repos_url":"https://api.github.com/users/stustison/repos","events_url":"https://api.github.com/users/stustison/events{/privacy}","received_events_url":"https://api.github.com/users/stustison/received_events","type":"User","site_admin":false},{"login":"clockard","id":5248090,"node_id":"MDQ6VXNlcjUyNDgwOTA=","avatar_url":"https://avatars1.githubusercontent.com/u/5248090?v=4","gravatar_id":"","url":"https://api.github.com/users/clockard","html_url":"https://github.com/clockard","followers_url":"https://api.github.com/users/clockard/followers","following_url":"https://api.github.com/users/clockard/following{/other_user}","gists_url":"https://api.github.com/users/clockard/gists{/gist_id}","starred_url":"https://api.github.com/users/clockard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/clockard/subscriptions","organizations_url":"https://api.github.com/users/clockard/orgs","repos_url":"https://api.github.com/users/clockard/repos","events_url":"https://api.github.com/users/clockard/events{/privacy}","received_events_url":"https://api.github.com/users/clockard/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/codice/ddf/pulls/3746/commits","review_comments_url":"https://api.github.com/repos/codice/ddf/pulls/3746/comments","review_comment_url":"https://api.github.com/repos/codice/ddf/pulls/comments{/number}","comments_url":"https://api.github.com/repos/codice/ddf/issues/3746/comments","statuses_url":"https://api.github.com/repos/codice/ddf/statuses/f9c71591277c955f34aee2e4ac664d435de90832","head":{"label":"ahoffer:DDF-4133","ref":"DDF-4133","sha":"f9c71591277c955f34aee2e4ac664d435de90832","user":{"login":"ahoffer","id":133284,"node_id":"MDQ6VXNlcjEzMzI4NA==","avatar_url":"https://avatars3.githubusercontent.com/u/133284?v=4","gravatar_id":"","url":"https://api.github.com/users/ahoffer","html_url":"https://github.com/ahoffer","followers_url":"https://api.github.com/users/ahoffer/followers","following_url":"https://api.github.com/users/ahoffer/following{/other_user}","gists_url":"https://api.github.com/users/ahoffer/gists{/gist_id}","starred_url":"https://api.github.com/users/ahoffer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ahoffer/subscriptions","organizations_url":"https://api.github.com/users/ahoffer/orgs","repos_url":"https://api.github.com/users/ahoffer/repos","events_url":"https://api.github.com/users/ahoffer/events{/privacy}","received_events_url":"https://api.github.com/users/ahoffer/received_events","type":"User","site_admin":false},"repo":{"id":42614877,"node_id":"MDEwOlJlcG9zaXRvcnk0MjYxNDg3Nw==","name":"ddf","full_name":"ahoffer/ddf","private":false,"owner":{"login":"ahoffer","id":133284,"node_id":"MDQ6VXNlcjEzMzI4NA==","avatar_url":"https://avatars3.githubusercontent.com/u/133284?v=4","gravatar_id":"","url":"https://api.github.com/users/ahoffer","html_url":"https://github.com/ahoffer","followers_url":"https://api.github.com/users/ahoffer/followers","following_url":"https://api.github.com/users/ahoffer/following{/other_user}","gists_url":"https://api.github.com/users/ahoffer/gists{/gist_id}","starred_url":"https://api.github.com/users/ahoffer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ahoffer/subscriptions","organizations_url":"https://api.github.com/users/ahoffer/orgs","repos_url":"https://api.github.com/users/ahoffer/repos","events_url":"https://api.github.com/users/ahoffer/events{/privacy}","received_events_url":"https://api.github.com/users/ahoffer/received_events","type":"User","site_admin":false},"html_url":"https://github.com/ahoffer/ddf","description":"The Distributed Data Framework - Distribution, SDK, and Test","fork":true,"url":"https://api.github.com/repos/ahoffer/ddf","forks_url":"https://api.github.com/repos/ahoffer/ddf/forks","keys_url":"https://api.github.com/repos/ahoffer/ddf/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ahoffer/ddf/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ahoffer/ddf/teams","hooks_url":"https://api.github.com/repos/ahoffer/ddf/hooks","issue_events_url":"https://api.github.com/repos/ahoffer/ddf/issues/events{/number}","events_url":"https://api.github.com/repos/ahoffer/ddf/events","assignees_url":"https://api.github.com/repos/ahoffer/ddf/assignees{/user}","branches_url":"https://api.github.com/repos/ahoffer/ddf/branches{/branch}","tags_url":"https://api.github.com/repos/ahoffer/ddf/tags","blobs_url":"https://api.github.com/repos/ahoffer/ddf/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ahoffer/ddf/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ahoffer/ddf/git/refs{/sha}","trees_url":"https://api.github.com/repos/ahoffer/ddf/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ahoffer/ddf/statuses/{sha}","languages_url":"https://api.github.com/repos/ahoffer/ddf/languages","stargazers_url":"https://api.github.com/repos/ahoffer/ddf/stargazers","contributors_url":"https://api.github.com/repos/ahoffer/ddf/contributors","subscribers_url":"https://api.github.com/repos/ahoffer/ddf/subscribers","subscription_url":"https://api.github.com/repos/ahoffer/ddf/subscription","commits_url":"https://api.github.com/repos/ahoffer/ddf/commits{/sha}","git_commits_url":"https://api.github.com/repos/ahoffer/ddf/git/commits{/sha}","comments_url":"https://api.github.com/repos/ahoffer/ddf/comments{/number}","issue_comment_url":"https://api.github.com/repos/ahoffer/ddf/issues/comments{/number}","contents_url":"https://api.github.com/repos/ahoffer/ddf/contents/{+path}","compare_url":"https://api.github.com/repos/ahoffer/ddf/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ahoffer/ddf/merges","archive_url":"https://api.github.com/repos/ahoffer/ddf/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ahoffer/ddf/downloads","issues_url":"https://api.github.com/repos/ahoffer/ddf/issues{/number}","pulls_url":"https://api.github.com/repos/ahoffer/ddf/pulls{/number}","milestones_url":"https://api.github.com/repos/ahoffer/ddf/milestones{/number}","notifications_url":"https://api.github.com/repos/ahoffer/ddf/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ahoffer/ddf/labels{/name}","releases_url":"https://api.github.com/repos/ahoffer/ddf/releases{/id}","deployments_url":"https://api.github.com/repos/ahoffer/ddf/deployments","created_at":"2015-09-16T21:39:29Z","updated_at":"2018-04-03T15:50:18Z","pushed_at":"2018-09-20T21:10:17Z","git_url":"git://github.com/ahoffer/ddf.git","ssh_url":"git@github.com:ahoffer/ddf.git","clone_url":"https://github.com/ahoffer/ddf.git","svn_url":"https://github.com/ahoffer/ddf","homepage":"","size":203472,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"codice:master","ref":"master","sha":"6627fa3d6e2a80f9321ff952859ab271cb8a8c60","user":{"login":"codice","id":2386734,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIzODY3MzQ=","avatar_url":"https://avatars2.githubusercontent.com/u/2386734?v=4","gravatar_id":"","url":"https://api.github.com/users/codice","html_url":"https://github.com/codice","followers_url":"https://api.github.com/users/codice/followers","following_url":"https://api.github.com/users/codice/following{/other_user}","gists_url":"https://api.github.com/users/codice/gists{/gist_id}","starred_url":"https://api.github.com/users/codice/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/codice/subscriptions","organizations_url":"https://api.github.com/users/codice/orgs","repos_url":"https://api.github.com/users/codice/repos","events_url":"https://api.github.com/users/codice/events{/privacy}","received_events_url":"https://api.github.com/users/codice/received_events","type":"Organization","site_admin":false},"repo":{"id":15173563,"node_id":"MDEwOlJlcG9zaXRvcnkxNTE3MzU2Mw==","name":"ddf","full_name":"codice/ddf","private":false,"owner":{"login":"codice","id":2386734,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIzODY3MzQ=","avatar_url":"https://avatars2.githubusercontent.com/u/2386734?v=4","gravatar_id":"","url":"https://api.github.com/users/codice","html_url":"https://github.com/codice","followers_url":"https://api.github.com/users/codice/followers","following_url":"https://api.github.com/users/codice/following{/other_user}","gists_url":"https://api.github.com/users/codice/gists{/gist_id}","starred_url":"https://api.github.com/users/codice/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/codice/subscriptions","organizations_url":"https://api.github.com/users/codice/orgs","repos_url":"https://api.github.com/users/codice/repos","events_url":"https://api.github.com/users/codice/events{/privacy}","received_events_url":"https://api.github.com/users/codice/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/codice/ddf","description":"DDF Distributed Data Framework - an open source, modular integration framework.","fork":false,"url":"https://api.github.com/repos/codice/ddf","forks_url":"https://api.github.com/repos/codice/ddf/forks","keys_url":"https://api.github.com/repos/codice/ddf/keys{/key_id}","collaborators_url":"https://api.github.com/repos/codice/ddf/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/codice/ddf/teams","hooks_url":"https://api.github.com/repos/codice/ddf/hooks","issue_events_url":"https://api.github.com/repos/codice/ddf/issues/events{/number}","events_url":"https://api.github.com/repos/codice/ddf/events","assignees_url":"https://api.github.com/repos/codice/ddf/assignees{/user}","branches_url":"https://api.github.com/repos/codice/ddf/branches{/branch}","tags_url":"https://api.github.com/repos/codice/ddf/tags","blobs_url":"https://api.github.com/repos/codice/ddf/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/codice/ddf/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/codice/ddf/git/refs{/sha}","trees_url":"https://api.github.com/repos/codice/ddf/git/trees{/sha}","statuses_url":"https://api.github.com/repos/codice/ddf/statuses/{sha}","languages_url":"https://api.github.com/repos/codice/ddf/languages","stargazers_url":"https://api.github.com/repos/codice/ddf/stargazers","contributors_url":"https://api.github.com/repos/codice/ddf/contributors","subscribers_url":"https://api.github.com/repos/codice/ddf/subscribers","subscription_url":"https://api.github.com/repos/codice/ddf/subscription","commits_url":"https://api.github.com/repos/codice/ddf/commits{/sha}","git_commits_url":"https://api.github.com/repos/codice/ddf/git/commits{/sha}","comments_url":"https://api.github.com/repos/codice/ddf/comments{/number}","issue_comment_url":"https://api.github.com/repos/codice/ddf/issues/comments{/number}","contents_url":"https://api.github.com/repos/codice/ddf/contents/{+path}","compare_url":"https://api.github.com/repos/codice/ddf/compare/{base}...{head}","merges_url":"https://api.github.com/repos/codice/ddf/merges","archive_url":"https://api.github.com/repos/codice/ddf/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/codice/ddf/downloads","issues_url":"https://api.github.com/repos/codice/ddf/issues{/number}","pulls_url":"https://api.github.com/repos/codice/ddf/pulls{/number}","milestones_url":"https://api.github.com/repos/codice/ddf/milestones{/number}","notifications_url":"https://api.github.com/repos/codice/ddf/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/codice/ddf/labels{/name}","releases_url":"https://api.github.com/repos/codice/ddf/releases{/id}","deployments_url":"https://api.github.com/repos/codice/ddf/deployments","created_at":"2013-12-13T20:38:28Z","updated_at":"2018-09-26T15:09:52Z","pushed_at":"2018-09-26T16:46:24Z","git_url":"git://github.com/codice/ddf.git","ssh_url":"git@github.com:codice/ddf.git","clone_url":"https://github.com/codice/ddf.git","svn_url":"https://github.com/codice/ddf","homepage":"http://ddf.codice.org","size":404825,"stargazers_count":89,"watchers_count":89,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":153,"mirror_url":null,"archived":false,"open_issues_count":43,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":153,"open_issues":43,"watchers":89,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/codice/ddf/pulls/3746"},"html":{"href":"https://github.com/codice/ddf/pull/3746"},"issue":{"href":"https://api.github.com/repos/codice/ddf/issues/3746"},"comments":{"href":"https://api.github.com/repos/codice/ddf/issues/3746/comments"},"review_comments":{"href":"https://api.github.com/repos/codice/ddf/pulls/3746/comments"},"review_comment":{"href":"https://api.github.com/repos/codice/ddf/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/codice/ddf/pulls/3746/commits"},"statuses":{"href":"https://api.github.com/repos/codice/ddf/statuses/f9c71591277c955f34aee2e4ac664d435de90832"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"stustison"}}