{"action":"created","comment":{"url":"https://api.github.com/repos/venicegeo/bf-api/pulls/comments/169454552","pull_request_review_id":97983258,"id":169454552,"diff_hunk":"@@ -92,4 +98,183 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons\n \t\t\t});\n \t\t}\n \t}\n-}\n+\n+\t@Configuration\n+\t@Profile({ \"basic-geoserver-auth\" })\n+\tprotected static class BasicAuthenticationConfig {\n+\n+\t\t@Value(\"${http.max.total}\")\n+\t\tprivate int httpMaxTotal;\n+\n+\t\t@Value(\"${http.max.route}\")\n+\t\tprivate int httpMaxRoute;\n+\n+\t\t@Bean\n+\t\tpublic RestTemplate restTemplate() {\n+\t\t\tfinal RestTemplate restTemplate = new RestTemplate();\n+\t\t\tfinal HttpClient httpClient = HttpClientBuilder.create()\n+\t\t\t\t\t.setMaxConnTotal(httpMaxTotal)\n+\t\t\t\t\t.setMaxConnPerRoute(httpMaxRoute)\n+\t\t\t\t\t.setSSLHostnameVerifier(new NoopHostnameVerifier())\n+\t\t\t\t\t.setKeepAliveStrategy(getKeepAliveStrategy())\n+\t\t\t\t\t.build();\n+\n+\t\t\trestTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));\n+\n+\t\t\treturn restTemplate;\n+\t\t}\n+\n+\t\t@Bean\n+\t\tpublic AuthHeaders authHeaders() {\n+\t\t\treturn new BasicAuthHeaders();\n+\t\t}\n+\t}\n+\n+\t@Configuration\n+\t@Profile({ \"pki-geoserver-auth\" })\n+\tprotected static class PKIAuthenticationConfig {\n+\n+\t\t@Value(\"${http.max.total}\")\n+\t\tprivate int httpMaxTotal;\n+\n+\t\t@Value(\"${http.max.route}\")\n+\t\tprivate int httpMaxRoute;\n+\n+\t\t@Value(\"${JKS_FILE}\")\n+\t\tprivate String keystoreFileName;\n+\n+\t\t@Value(\"${JKS_PASSPHRASE}\")\n+\t\tprivate String keystorePassphrase;\n+\n+\t\t@Value(\"${PZ_PASSPHRASE}\")\n+\t\tprivate String piazzaKeyPassphrase;\n+\n+\t\t@Bean\n+\t\tpublic RestTemplate restTemplate() throws KeyManagementException, UnrecoverableKeyException,\n+\t\t\t\tNoSuchAlgorithmException, KeyStoreException, CertificateException, IOException {\n+\n+\t\t\tfinal SSLContext sslContext = SSLContexts.custom()\n+\t\t\t\t\t.loadKeyMaterial(getStore(), piazzaKeyPassphrase.toCharArray())\n+\t\t\t\t\t.loadTrustMaterial(null, new TrustSelfSignedStrategy())\n+\t\t\t\t\t.useProtocol(\"TLS\")\n+\t\t\t\t\t.build();\n+\n+\t\t\tfinal Registry<CookieSpecProvider> registry = RegistryBuilder.<CookieSpecProvider>create()\n+\t\t\t\t\t.register(\"myspec\", new MySpecProvider())\n+\t\t\t\t\t.build();\n+\n+\t\t\tfinal RequestConfig requestConfig = RequestConfig.custom()\n+\t\t\t\t\t.setCookieSpec(\"myspec\")\n+\t\t\t\t\t.setCircularRedirectsAllowed(true)\n+\t\t\t\t\t.build();\n+\n+\t\t\tfinal HttpClient httpClient = HttpClientBuilder.create()\n+\t\t\t\t\t.setDefaultRequestConfig(requestConfig)\n+\t\t\t\t\t.setMaxConnTotal(httpMaxTotal)\n+\t\t\t\t\t.setSSLContext(sslContext)\n+\t\t\t\t\t.setSSLHostnameVerifier(new NoopHostnameVerifier())\n+\t\t\t\t\t.setDefaultCookieStore(new BasicCookieStore())\n+\t\t\t\t\t.setDefaultCookieSpecRegistry(registry)\n+\t\t\t\t\t.setRedirectStrategy(new MyRedirectStrategy())\n+\t\t\t\t\t.setMaxConnPerRoute(httpMaxRoute)\n+\t\t\t\t\t.setKeepAliveStrategy(getKeepAliveStrategy())\n+\t\t\t\t\t.build();\n+\n+\t\t\tfinal RestTemplate restTemplate = new RestTemplate();\n+\t\t\trestTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));\n+\n+\t\t\tfinal List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();\n+\t\t\tmessageConverters.add(new StringHttpMessageConverter());\n+\t\t\tmessageConverters.add(new MappingJackson2HttpMessageConverter());\n+\t\t\trestTemplate.setMessageConverters(messageConverters);\n+\n+\t\t\treturn restTemplate;\n+\t\t}\n+\n+\t\t@Bean\n+\t\tpublic AuthHeaders authHeaders() {\n+\t\t\treturn new PKIAuthHeaders();\n+\t\t}\n+\n+\t\tprotected KeyStore getStore()\n+\t\t\t\tthrows KeyStoreException, IOException, CertificateException, NoSuchAlgorithmException {\n+\t\t\tfinal KeyStore store = KeyStore.getInstance(KeyStore.getDefaultType());\n+\t\t\tfinal InputStream inputStream = getClass().getClassLoader().getResourceAsStream(keystoreFileName);\n+\t\t\ttry {\n+\t\t\t\tstore.load(inputStream, keystorePassphrase.toCharArray());\n+\t\t\t} \n+\t\t\tfinally {\n+\t\t\t\tinputStream.close();\n+\t\t\t}\n+\n+\t\t\treturn store;\n+\t\t}\n+\n+\t\tprotected class MyCookieSpec extends DefaultCookieSpec {\n+\n+\t\t\t@Override\n+\t\t\tpublic void validate(Cookie c, CookieOrigin co) throws MalformedCookieException {\n+\t\t\t\t// Do nothing; accept all cookies\n+\t\t\t}\n+\t\t}\n+\n+\t\tprotected class MySpecProvider implements CookieSpecProvider {\n+\n+\t\t\t@Override\n+\t\t\tpublic CookieSpec create(HttpContext context) {\n+\n+\t\t\t\treturn new MyCookieSpec();\n+\t\t\t}\n+\t\t}\n+\n+\t\tprotected class MyRedirectStrategy extends DefaultRedirectStrategy {\n+\n+\t\t\t@Override\n+\t\t\tprotected boolean isRedirectable(final String method) {\n+\n+\t\t\t\treturn true;\n+\t\t\t}\n+\n+\t\t\t@Override\n+\t\t\tpublic HttpUriRequest getRedirect(final HttpRequest request, final HttpResponse response,\n+\t\t\t\t\tfinal HttpContext context) throws ProtocolException {\n+\n+\t\t\t\tfinal URI uri = getLocationURI(request, response, context);\n+\t\t\t\tfinal String method = request.getRequestLine().getMethod();\n+\n+\t\t\t\tif (method.equalsIgnoreCase(HttpHead.METHOD_NAME)) {\n+\t\t\t\t\treturn new HttpHead(uri);\n+\t\t\t\t} \n+\t\t\t\telse if (method.equalsIgnoreCase(HttpGet.METHOD_NAME)) {\n+\t\t\t\t\treturn new HttpGet(uri);\n+\t\t\t\t}\n+\t\t\t\telse {\n+\t\t\t\t\tfinal int status = response.getStatusLine().getStatusCode();\n+\n+\t\t\t\t\tif (status == HttpStatus.SC_TEMPORARY_REDIRECT || status == HttpStatus.SC_MOVED_PERMANENTLY\n+\t\t\t\t\t\t\t|| status == HttpStatus.SC_MOVED_TEMPORARILY) {\n+\t\t\t\t\t\treturn RequestBuilder.copy(request).setUri(uri).build();\n+\t\t\t\t\t} \n+\t\t\t\t\telse {\n+\t\t\t\t\t\treturn new HttpGet(uri);\n+\t\t\t\t\t}\n+\t\t\t\t}\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\tprivate static ConnectionKeepAliveStrategy getKeepAliveStrategy() {\n+\t\treturn (HttpResponse response, HttpContext context) -> {\n+\t\t\tHeaderElementIterator it = new BasicHeaderElementIterator(response.headerIterator(HTTP.CONN_KEEP_ALIVE));\n+\t\t\twhile (it.hasNext()) {\n+\t\t\t\tfinal HeaderElement headerElement = it.nextElement();\n+\t\t\t\tfinal String param = headerElement.getName();\n+\t\t\t\tfinal String value = headerElement.getValue();\n+\t\t\t\tif (value != null && param.equalsIgnoreCase(\"timeout\")) {\n+\t\t\t\t\treturn Long.parseLong(value) * 1000;\n+\t\t\t\t}\n+\t\t\t}\n+\t\t\treturn 5 * 1000; // TODO: Probably want this configurable","path":"src/main/java/org/venice/beachfront/bfapi/BfApiConfig.java","position":297,"original_position":297,"commit_id":"9d17592fc48d6b49a1148bd6595dc64f08087e18","original_commit_id":"9d17592fc48d6b49a1148bd6595dc64f08087e18","user":{"login":"russellorf","id":16306731,"avatar_url":"https://avatars0.githubusercontent.com/u/16306731?v=4","gravatar_id":"","url":"https://api.github.com/users/russellorf","html_url":"https://github.com/russellorf","followers_url":"https://api.github.com/users/russellorf/followers","following_url":"https://api.github.com/users/russellorf/following{/other_user}","gists_url":"https://api.github.com/users/russellorf/gists{/gist_id}","starred_url":"https://api.github.com/users/russellorf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/russellorf/subscriptions","organizations_url":"https://api.github.com/users/russellorf/orgs","repos_url":"https://api.github.com/users/russellorf/repos","events_url":"https://api.github.com/users/russellorf/events{/privacy}","received_events_url":"https://api.github.com/users/russellorf/received_events","type":"User","site_admin":false},"body":"This was leftover from the original code, I'll put it in a properties file.","created_at":"2018-02-20T20:50:28Z","updated_at":"2018-02-20T20:50:29Z","html_url":"https://github.com/venicegeo/bf-api/pull/73#discussion_r169454552","pull_request_url":"https://api.github.com/repos/venicegeo/bf-api/pulls/73","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/venicegeo/bf-api/pulls/comments/169454552"},"html":{"href":"https://github.com/venicegeo/bf-api/pull/73#discussion_r169454552"},"pull_request":{"href":"https://api.github.com/repos/venicegeo/bf-api/pulls/73"}},"in_reply_to_id":168799542},"pull_request":{"url":"https://api.github.com/repos/venicegeo/bf-api/pulls/73","id":169476408,"html_url":"https://github.com/venicegeo/bf-api/pull/73","diff_url":"https://github.com/venicegeo/bf-api/pull/73.diff","patch_url":"https://github.com/venicegeo/bf-api/pull/73.patch","issue_url":"https://api.github.com/repos/venicegeo/bf-api/issues/73","number":73,"state":"open","locked":false,"title":"orfr: intial commit of geoserver changes","user":{"login":"russellorf","id":16306731,"avatar_url":"https://avatars0.githubusercontent.com/u/16306731?v=4","gravatar_id":"","url":"https://api.github.com/users/russellorf","html_url":"https://github.com/russellorf","followers_url":"https://api.github.com/users/russellorf/followers","following_url":"https://api.github.com/users/russellorf/following{/other_user}","gists_url":"https://api.github.com/users/russellorf/gists{/gist_id}","starred_url":"https://api.github.com/users/russellorf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/russellorf/subscriptions","organizations_url":"https://api.github.com/users/russellorf/orgs","repos_url":"https://api.github.com/users/russellorf/repos","events_url":"https://api.github.com/users/russellorf/events{/privacy}","received_events_url":"https://api.github.com/users/russellorf/received_events","type":"User","site_admin":false},"body":"orfr: adding profile configurations to the SpringBoot configuration file\r\n\r\norfr: fixing bugs that now allow the service calls to succeed\r\n\r\norfr: bug fix\r\n\r\norfr: adding parameter for style creation","created_at":"2018-02-15T20:26:13Z","updated_at":"2018-02-20T20:50:29Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5c057f4adfbe0f25f48324c6cfa3daccf3143113","assignee":null,"assignees":[],"requested_reviewers":[{"login":"mlynum","id":12052181,"avatar_url":"https://avatars1.githubusercontent.com/u/12052181?v=4","gravatar_id":"","url":"https://api.github.com/users/mlynum","html_url":"https://github.com/mlynum","followers_url":"https://api.github.com/users/mlynum/followers","following_url":"https://api.github.com/users/mlynum/following{/other_user}","gists_url":"https://api.github.com/users/mlynum/gists{/gist_id}","starred_url":"https://api.github.com/users/mlynum/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mlynum/subscriptions","organizations_url":"https://api.github.com/users/mlynum/orgs","repos_url":"https://api.github.com/users/mlynum/repos","events_url":"https://api.github.com/users/mlynum/events{/privacy}","received_events_url":"https://api.github.com/users/mlynum/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/venicegeo/bf-api/pulls/73/commits","review_comments_url":"https://api.github.com/repos/venicegeo/bf-api/pulls/73/comments","review_comment_url":"https://api.github.com/repos/venicegeo/bf-api/pulls/comments{/number}","comments_url":"https://api.github.com/repos/venicegeo/bf-api/issues/73/comments","statuses_url":"https://api.github.com/repos/venicegeo/bf-api/statuses/9d17592fc48d6b49a1148bd6595dc64f08087e18","head":{"label":"venicegeo:BT-113-orfr-adding-geoserver-resource-creation","ref":"BT-113-orfr-adding-geoserver-resource-creation","sha":"9d17592fc48d6b49a1148bd6595dc64f08087e18","user":{"login":"venicegeo","id":15457149,"avatar_url":"https://avatars2.githubusercontent.com/u/15457149?v=4","gravatar_id":"","url":"https://api.github.com/users/venicegeo","html_url":"https://github.com/venicegeo","followers_url":"https://api.github.com/users/venicegeo/followers","following_url":"https://api.github.com/users/venicegeo/following{/other_user}","gists_url":"https://api.github.com/users/venicegeo/gists{/gist_id}","starred_url":"https://api.github.com/users/venicegeo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/venicegeo/subscriptions","organizations_url":"https://api.github.com/users/venicegeo/orgs","repos_url":"https://api.github.com/users/venicegeo/repos","events_url":"https://api.github.com/users/venicegeo/events{/privacy}","received_events_url":"https://api.github.com/users/venicegeo/received_events","type":"Organization","site_admin":false},"repo":{"id":73200854,"name":"bf-api","full_name":"venicegeo/bf-api","owner":{"login":"venicegeo","id":15457149,"avatar_url":"https://avatars2.githubusercontent.com/u/15457149?v=4","gravatar_id":"","url":"https://api.github.com/users/venicegeo","html_url":"https://github.com/venicegeo","followers_url":"https://api.github.com/users/venicegeo/followers","following_url":"https://api.github.com/users/venicegeo/following{/other_user}","gists_url":"https://api.github.com/users/venicegeo/gists{/gist_id}","starred_url":"https://api.github.com/users/venicegeo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/venicegeo/subscriptions","organizations_url":"https://api.github.com/users/venicegeo/orgs","repos_url":"https://api.github.com/users/venicegeo/repos","events_url":"https://api.github.com/users/venicegeo/events{/privacy}","received_events_url":"https://api.github.com/users/venicegeo/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/venicegeo/bf-api","description":"Web service providing automated global vector shoreline extraction.","fork":false,"url":"https://api.github.com/repos/venicegeo/bf-api","forks_url":"https://api.github.com/repos/venicegeo/bf-api/forks","keys_url":"https://api.github.com/repos/venicegeo/bf-api/keys{/key_id}","collaborators_url":"https://api.github.com/repos/venicegeo/bf-api/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/venicegeo/bf-api/teams","hooks_url":"https://api.github.com/repos/venicegeo/bf-api/hooks","issue_events_url":"https://api.github.com/repos/venicegeo/bf-api/issues/events{/number}","events_url":"https://api.github.com/repos/venicegeo/bf-api/events","assignees_url":"https://api.github.com/repos/venicegeo/bf-api/assignees{/user}","branches_url":"https://api.github.com/repos/venicegeo/bf-api/branches{/branch}","tags_url":"https://api.github.com/repos/venicegeo/bf-api/tags","blobs_url":"https://api.github.com/repos/venicegeo/bf-api/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/venicegeo/bf-api/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/venicegeo/bf-api/git/refs{/sha}","trees_url":"https://api.github.com/repos/venicegeo/bf-api/git/trees{/sha}","statuses_url":"https://api.github.com/repos/venicegeo/bf-api/statuses/{sha}","languages_url":"https://api.github.com/repos/venicegeo/bf-api/languages","stargazers_url":"https://api.github.com/repos/venicegeo/bf-api/stargazers","contributors_url":"https://api.github.com/repos/venicegeo/bf-api/contributors","subscribers_url":"https://api.github.com/repos/venicegeo/bf-api/subscribers","subscription_url":"https://api.github.com/repos/venicegeo/bf-api/subscription","commits_url":"https://api.github.com/repos/venicegeo/bf-api/commits{/sha}","git_commits_url":"https://api.github.com/repos/venicegeo/bf-api/git/commits{/sha}","comments_url":"https://api.github.com/repos/venicegeo/bf-api/comments{/number}","issue_comment_url":"https://api.github.com/repos/venicegeo/bf-api/issues/comments{/number}","contents_url":"https://api.github.com/repos/venicegeo/bf-api/contents/{+path}","compare_url":"https://api.github.com/repos/venicegeo/bf-api/compare/{base}...{head}","merges_url":"https://api.github.com/repos/venicegeo/bf-api/merges","archive_url":"https://api.github.com/repos/venicegeo/bf-api/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/venicegeo/bf-api/downloads","issues_url":"https://api.github.com/repos/venicegeo/bf-api/issues{/number}","pulls_url":"https://api.github.com/repos/venicegeo/bf-api/pulls{/number}","milestones_url":"https://api.github.com/repos/venicegeo/bf-api/milestones{/number}","notifications_url":"https://api.github.com/repos/venicegeo/bf-api/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/venicegeo/bf-api/labels{/name}","releases_url":"https://api.github.com/repos/venicegeo/bf-api/releases{/id}","deployments_url":"https://api.github.com/repos/venicegeo/bf-api/deployments","created_at":"2016-11-08T15:41:07Z","updated_at":"2017-12-30T10:57:08Z","pushed_at":"2018-02-20T18:57:41Z","git_url":"git://github.com/venicegeo/bf-api.git","ssh_url":"git@github.com:venicegeo/bf-api.git","clone_url":"https://github.com/venicegeo/bf-api.git","svn_url":"https://github.com/venicegeo/bf-api","homepage":"","size":91045,"stargazers_count":1,"watchers_count":1,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":2,"license":null,"forks":1,"open_issues":2,"watchers":1,"default_branch":"master"}},"base":{"label":"venicegeo:2.0-master","ref":"2.0-master","sha":"6bde4085632b46e625c91c4b3d707dc666e0af85","user":{"login":"venicegeo","id":15457149,"avatar_url":"https://avatars2.githubusercontent.com/u/15457149?v=4","gravatar_id":"","url":"https://api.github.com/users/venicegeo","html_url":"https://github.com/venicegeo","followers_url":"https://api.github.com/users/venicegeo/followers","following_url":"https://api.github.com/users/venicegeo/following{/other_user}","gists_url":"https://api.github.com/users/venicegeo/gists{/gist_id}","starred_url":"https://api.github.com/users/venicegeo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/venicegeo/subscriptions","organizations_url":"https://api.github.com/users/venicegeo/orgs","repos_url":"https://api.github.com/users/venicegeo/repos","events_url":"https://api.github.com/users/venicegeo/events{/privacy}","received_events_url":"https://api.github.com/users/venicegeo/received_events","type":"Organization","site_admin":false},"repo":{"id":73200854,"name":"bf-api","full_name":"venicegeo/bf-api","owner":{"login":"venicegeo","id":15457149,"avatar_url":"https://avatars2.githubusercontent.com/u/15457149?v=4","gravatar_id":"","url":"https://api.github.com/users/venicegeo","html_url":"https://github.com/venicegeo","followers_url":"https://api.github.com/users/venicegeo/followers","following_url":"https://api.github.com/users/venicegeo/following{/other_user}","gists_url":"https://api.github.com/users/venicegeo/gists{/gist_id}","starred_url":"https://api.github.com/users/venicegeo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/venicegeo/subscriptions","organizations_url":"https://api.github.com/users/venicegeo/orgs","repos_url":"https://api.github.com/users/venicegeo/repos","events_url":"https://api.github.com/users/venicegeo/events{/privacy}","received_events_url":"https://api.github.com/users/venicegeo/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/venicegeo/bf-api","description":"Web service providing automated global vector shoreline extraction.","fork":false,"url":"https://api.github.com/repos/venicegeo/bf-api","forks_url":"https://api.github.com/repos/venicegeo/bf-api/forks","keys_url":"https://api.github.com/repos/venicegeo/bf-api/keys{/key_id}","collaborators_url":"https://api.github.com/repos/venicegeo/bf-api/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/venicegeo/bf-api/teams","hooks_url":"https://api.github.com/repos/venicegeo/bf-api/hooks","issue_events_url":"https://api.github.com/repos/venicegeo/bf-api/issues/events{/number}","events_url":"https://api.github.com/repos/venicegeo/bf-api/events","assignees_url":"https://api.github.com/repos/venicegeo/bf-api/assignees{/user}","branches_url":"https://api.github.com/repos/venicegeo/bf-api/branches{/branch}","tags_url":"https://api.github.com/repos/venicegeo/bf-api/tags","blobs_url":"https://api.github.com/repos/venicegeo/bf-api/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/venicegeo/bf-api/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/venicegeo/bf-api/git/refs{/sha}","trees_url":"https://api.github.com/repos/venicegeo/bf-api/git/trees{/sha}","statuses_url":"https://api.github.com/repos/venicegeo/bf-api/statuses/{sha}","languages_url":"https://api.github.com/repos/venicegeo/bf-api/languages","stargazers_url":"https://api.github.com/repos/venicegeo/bf-api/stargazers","contributors_url":"https://api.github.com/repos/venicegeo/bf-api/contributors","subscribers_url":"https://api.github.com/repos/venicegeo/bf-api/subscribers","subscription_url":"https://api.github.com/repos/venicegeo/bf-api/subscription","commits_url":"https://api.github.com/repos/venicegeo/bf-api/commits{/sha}","git_commits_url":"https://api.github.com/repos/venicegeo/bf-api/git/commits{/sha}","comments_url":"https://api.github.com/repos/venicegeo/bf-api/comments{/number}","issue_comment_url":"https://api.github.com/repos/venicegeo/bf-api/issues/comments{/number}","contents_url":"https://api.github.com/repos/venicegeo/bf-api/contents/{+path}","compare_url":"https://api.github.com/repos/venicegeo/bf-api/compare/{base}...{head}","merges_url":"https://api.github.com/repos/venicegeo/bf-api/merges","archive_url":"https://api.github.com/repos/venicegeo/bf-api/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/venicegeo/bf-api/downloads","issues_url":"https://api.github.com/repos/venicegeo/bf-api/issues{/number}","pulls_url":"https://api.github.com/repos/venicegeo/bf-api/pulls{/number}","milestones_url":"https://api.github.com/repos/venicegeo/bf-api/milestones{/number}","notifications_url":"https://api.github.com/repos/venicegeo/bf-api/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/venicegeo/bf-api/labels{/name}","releases_url":"https://api.github.com/repos/venicegeo/bf-api/releases{/id}","deployments_url":"https://api.github.com/repos/venicegeo/bf-api/deployments","created_at":"2016-11-08T15:41:07Z","updated_at":"2017-12-30T10:57:08Z","pushed_at":"2018-02-20T18:57:41Z","git_url":"git://github.com/venicegeo/bf-api.git","ssh_url":"git@github.com:venicegeo/bf-api.git","clone_url":"https://github.com/venicegeo/bf-api.git","svn_url":"https://github.com/venicegeo/bf-api","homepage":"","size":91045,"stargazers_count":1,"watchers_count":1,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":2,"license":null,"forks":1,"open_issues":2,"watchers":1,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/venicegeo/bf-api/pulls/73"},"html":{"href":"https://github.com/venicegeo/bf-api/pull/73"},"issue":{"href":"https://api.github.com/repos/venicegeo/bf-api/issues/73"},"comments":{"href":"https://api.github.com/repos/venicegeo/bf-api/issues/73/comments"},"review_comments":{"href":"https://api.github.com/repos/venicegeo/bf-api/pulls/73/comments"},"review_comment":{"href":"https://api.github.com/repos/venicegeo/bf-api/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/venicegeo/bf-api/pulls/73/commits"},"statuses":{"href":"https://api.github.com/repos/venicegeo/bf-api/statuses/9d17592fc48d6b49a1148bd6595dc64f08087e18"}},"author_association":"NONE"}}
{"actor":{"display_login":"russellorf"}}