{"action":"created","comment":{"url":"https://api.github.com/repos/briandowns/simple-httpd/pulls/comments/122560267","pull_request_review_id":44692530,"id":122560267,"diff_hunk":"@@ -290,49 +264,122 @@ func main() {\n \tvar port int\n \tvar le string\n \tvar gs bool\n-\n+\tvar tlsPort int\n+\tvar tlsCert string\n+\tvar vers bool\n \tpwd := getpwd()\n \n-\tflag.IntVar(&port, \"p\", 8000, \"bind port\")\n-\tflag.StringVar(&le, \"l\", \"\", \"enable TLS with Let's Encrypt for the given domain name. Port = port + 1 \")\n-\tflag.BoolVar(&gs, \"g\", false, \"generate and use a self signed certificate\")\n-\tflag.Parse()\n-\n-\tif le != \"\" {\n-\t\tvar srv http.Server\n-\t\thttp2.ConfigureServer(&srv, new(http2.Server))\n+\tflag.Usage = func() {\n+\t\tw := os.Stderr\n+\t\tfor _, arg := range os.Args {\n+\t\t\tif arg == \"-?\" || arg == \"-h\" {\n+\t\t\t\tw = os.Stdout\n+\t\t\t\tbreak\n+\t\t\t}\n+\t\t}\n+\t\tfmt.Fprintf(w, \"simple-httpd version: %s\\n\", name+pathSeperator+version)\n+\t\tfmt.Fprintf(w, \"Usage: simple-httpd [-p port] [-l domain]\\n\")\n+\t\tfmt.Fprintf(w, \"\\n\")\n+\t\tfmt.Fprintf(w, \"Examples: simple-httpd                        start server. http://localhost:8000\\n\")\n+\t\tfmt.Fprintf(w, \"      or: simple-httpd -p 80                  use HTTP port 80. http://localhost\\n\")\n+\t\tfmt.Fprintf(w, \"      or: simple-httpd -g                     enable HTTPS generated certificate. https://localhost:4433\\n\")\n+\t\tfmt.Fprintf(w, \"      or: simple-httpd -p 80 -l example.com   enable HTTPS with Let's Encrypt. https://example.com\\n\")\n+\t\tfmt.Fprintf(w, \"\\n\")\n+\t\tfmt.Fprintf(w, \"Options:\\n\")\n+\t\tfmt.Fprintf(w, \"  -?,-h        : this help\\n\")\n+\t\tfmt.Fprintf(w, \"  -v           : show version and exit\\n\")\n+\t\tfmt.Fprintf(w, \"  -g           : enable TLS/HTTPS generate and use a self signed certificate\\n\")\n+\t\tfmt.Fprintf(w, \"  -p port      : bind HTTP port (default: 8000)\\n\")\n+\t\tfmt.Fprintf(w, \"  -l domain    : enable TLS/HTTPS with Let's Encrypt for the given domain name.\\n\")\n+\t\tfmt.Fprintf(w, \"  -c path      : enable TLS/HTTPS use a predefined HTTPS certificate\\n\")\n+\t\tfmt.Fprintf(w, \"  -t port      : bind HTTPS port (default: 443, 4433 for -g)\\n\")\n+\t\tfmt.Fprintf(w, \"\\n\")\n+\t}\n \n-\t\ttlsPort := port + 1\n+\tflag.BoolVar(&vers, \"v\", false, \"\")\n+\tflag.IntVar(&port, \"p\", 8000, \"\")\n+\tflag.StringVar(&le, \"l\", \"\", \"\")\n+\tflag.StringVar(&tlsCert, \"c\", \"\", \"\")\n+\tflag.BoolVar(&gs, \"g\", false, \"\")\n+\tflag.IntVar(&tlsPort, \"t\", -1, \"\")\n+\tflag.Parse()\n \n-\t\tgo func() {\n-\t\t\tfmt.Printf(\"Serving HTTPS on 0.0.0.0 port %v ...\\n\", tlsPort)\n-\t\t\tlog.Fatal(serveTLS(le, tlsPort))\n-\t\t}()\n+\tif vers {\n+\t\tfmt.Fprintf(os.Stdout, \"simple-httpd version: %s\\n\", name+pathSeperator+version)\n+\t\treturn\n+\t}\n+\tif tlsPort == -1 {\n+\t\tif gs {\n+\t\t\ttlsPort = 4433\n+\t\t} else {\n+\t\t\ttlsPort = 443\n+\t\t}\n \t}\n-\n \th := &httpServer{\n \t\tPort:      port,\n+\t\tTLSPort:   tlsPort,\n \t\tDirectory: pwd,\n \t\ttemplate:  template.Must(template.New(\"listing\").Parse(htmlTemplate)),\n \t}\n \n-\tif gs {\n-\t\thd := homeDir()\n-\n-\t\tcertPath := hd + certDir + pathSeperator + cert\n-\t\tkeyPath := hd + certDir + pathSeperator + key\n-\n-\t\tif err := generateCertificates(certPath, keyPath); err != nil {\n-\t\t\tlog.Fatalln(err)\n+\tif le != \"\" || tlsCert != \"\" || gs {\n+\t\th.HTTPS = true\n+\t\tvar tlsServer *http.Server\n+\t\tvar certPath, keyPath string\n+\t\tswitch {\n+\t\tcase tlsCert != \"\":\n+\t\t\tif gs {\n+\t\t\t\tlog.Fatal(\"cannot specify both -tls-cert and -g\")\n+\t\t\t}\n+\t\t\tcertPath, keyPath = tlsCert, tlsCert // assume a single PEM format\n+\t\tcase gs:\n+\t\t\thd := homeDir()\n+\t\t\tcertPath = filepath.Join(hd, certDir, cert)\n+\t\t\tkeyPath = filepath.Join(hd, certDir, key)\n+\t\t\tif err := generateCertificates(certPath, keyPath); err != nil {\n+\t\t\t\tlog.Fatalln(err)\n+\t\t\t}\n+\t\tdefault:\n+\t\t\tif tlsPort != 443 {\n+\t\t\t\tlog.Fatal(\"invalid -tls-port. It must be 443 when LetsEncrypt is specified.\")\n+\t\t\t}\n+\t\t\tcacheDir := filepath.Join(homeDir(), certDir)\n+\t\t\tif err := os.MkdirAll(cacheDir, 0700); err != nil {\n+\t\t\t\tlog.Fatalf(\"could not create cache directory: %s\" + err.Error())\n+\t\t\t}\n+\t\t\tcertManager := autocert.Manager{\n+\t\t\t\tCache:      autocert.DirCache(cacheDir),\n+\t\t\t\tPrompt:     autocert.AcceptTOS,\n+\t\t\t\tHostPolicy: autocert.HostWhitelist(le),\n+\t\t\t}\n+\t\t\ttlsServer = &http.Server{\n+\t\t\t\tAddr: fmt.Sprintf(\":%d\", tlsPort),\n+\t\t\t\tTLSConfig: &tls.Config{\n+\t\t\t\t\tGetCertificate: certManager.GetCertificate,\n+\t\t\t\t},\n+\t\t\t\tHandler: h,\n+\t\t\t}\n \t\t}\n-\n-\t\tfmt.Printf(\"Serving HTTPS on 0.0.0.0 port %v ...\\n\", h.Port+1)\n-\t\tlog.Fatal(http.ListenAndServeTLS(fmt.Sprintf(\"0.0.0.0:%d\", port+1), certPath, keyPath, h))\n+\t\tgo func() {\n+\t\t\tvar err error\n+\t\t\tif tlsServer == nil {\n+\t\t\t\terr = http.ListenAndServeTLS(fmt.Sprintf(\"0.0.0.0:%d\", tlsPort), certPath, keyPath, h)\n+\t\t\t} else {\n+\t\t\t\terr = tlsServer.ListenAndServeTLS(\"\", \"\")\n+\t\t\t}\n+\t\t\tif err != nil {\n+\t\t\t\tlog.Fatal(err)\n+\t\t\t}\n+\t\t}()\n+\t\ttime.Sleep(time.Millisecond * 10) // give a little warmup time to the TLS","path":"main.go","position":245,"original_position":245,"commit_id":"9f6348992c63cc89442037019c2fce568300ea17","original_commit_id":"9f6348992c63cc89442037019c2fce568300ea17","user":{"login":"briandowns","id":5714074,"avatar_url":"https://avatars2.githubusercontent.com/u/5714074?v=3","gravatar_id":"","url":"https://api.github.com/users/briandowns","html_url":"https://github.com/briandowns","followers_url":"https://api.github.com/users/briandowns/followers","following_url":"https://api.github.com/users/briandowns/following{/other_user}","gists_url":"https://api.github.com/users/briandowns/gists{/gist_id}","starred_url":"https://api.github.com/users/briandowns/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/briandowns/subscriptions","organizations_url":"https://api.github.com/users/briandowns/orgs","repos_url":"https://api.github.com/users/briandowns/repos","events_url":"https://api.github.com/users/briandowns/events{/privacy}","received_events_url":"https://api.github.com/users/briandowns/received_events","type":"User","site_admin":false},"body":"Sounds good to me. :)","created_at":"2017-06-17T04:09:46Z","updated_at":"2017-06-17T04:09:46Z","html_url":"https://github.com/briandowns/simple-httpd/pull/22#discussion_r122560267","pull_request_url":"https://api.github.com/repos/briandowns/simple-httpd/pulls/22","_links":{"self":{"href":"https://api.github.com/repos/briandowns/simple-httpd/pulls/comments/122560267"},"html":{"href":"https://github.com/briandowns/simple-httpd/pull/22#discussion_r122560267"},"pull_request":{"href":"https://api.github.com/repos/briandowns/simple-httpd/pulls/22"}}},"pull_request":{"url":"https://api.github.com/repos/briandowns/simple-httpd/pulls/22","id":126130592,"html_url":"https://github.com/briandowns/simple-httpd/pull/22","diff_url":"https://github.com/briandowns/simple-httpd/pull/22.diff","patch_url":"https://github.com/briandowns/simple-httpd/pull/22.patch","issue_url":"https://api.github.com/repos/briandowns/simple-httpd/issues/22","number":22,"state":"open","locked":false,"title":"Let's Encrypt fix, redirects, custom cert, go1.9","user":{"login":"tidwall","id":1156077,"avatar_url":"https://avatars2.githubusercontent.com/u/1156077?v=3","gravatar_id":"","url":"https://api.github.com/users/tidwall","html_url":"https://github.com/tidwall","followers_url":"https://api.github.com/users/tidwall/followers","following_url":"https://api.github.com/users/tidwall/following{/other_user}","gists_url":"https://api.github.com/users/tidwall/gists{/gist_id}","starred_url":"https://api.github.com/users/tidwall/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tidwall/subscriptions","organizations_url":"https://api.github.com/users/tidwall/orgs","repos_url":"https://api.github.com/users/tidwall/repos","events_url":"https://api.github.com/users/tidwall/events{/privacy}","received_events_url":"https://api.github.com/users/tidwall/received_events","type":"User","site_admin":false},"body":"This commit include the following updates:\r\n\r\n  - Fixes an issue with Let's Encrypt where a publically facing website does not receive a callback from the Let's Encrypt server due to non-443 port. Now simple-httpd requires port 443 when the -l flag is specified.\r\n  - HTTP requests will now automatcailly redirect to HTTPS when TLS is enabled. fixes #14\r\n  - Adds support for Go 1.9 - fixes #15\r\n  - Adds support for custom SSL certificates.\r\n  - Updated help menu with usage and examples.\r\n  - The -g flag now uses port 4433, otherwise all TLS use 443.\r\n  - Added -t flag to specify a custom TLS port.\r\n  - The -v flag displays the version information.","created_at":"2017-06-16T23:14:41Z","updated_at":"2017-06-17T04:09:46Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d8addbe11ec0f6545198e64a8cb98a5fb529d925","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/briandowns/simple-httpd/pulls/22/commits","review_comments_url":"https://api.github.com/repos/briandowns/simple-httpd/pulls/22/comments","review_comment_url":"https://api.github.com/repos/briandowns/simple-httpd/pulls/comments{/number}","comments_url":"https://api.github.com/repos/briandowns/simple-httpd/issues/22/comments","statuses_url":"https://api.github.com/repos/briandowns/simple-httpd/statuses/9f6348992c63cc89442037019c2fce568300ea17","head":{"label":"tidwall:https-various","ref":"https-various","sha":"9f6348992c63cc89442037019c2fce568300ea17","user":{"login":"tidwall","id":1156077,"avatar_url":"https://avatars2.githubusercontent.com/u/1156077?v=3","gravatar_id":"","url":"https://api.github.com/users/tidwall","html_url":"https://github.com/tidwall","followers_url":"https://api.github.com/users/tidwall/followers","following_url":"https://api.github.com/users/tidwall/following{/other_user}","gists_url":"https://api.github.com/users/tidwall/gists{/gist_id}","starred_url":"https://api.github.com/users/tidwall/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tidwall/subscriptions","organizations_url":"https://api.github.com/users/tidwall/orgs","repos_url":"https://api.github.com/users/tidwall/repos","events_url":"https://api.github.com/users/tidwall/events{/privacy}","received_events_url":"https://api.github.com/users/tidwall/received_events","type":"User","site_admin":false},"repo":{"id":94259425,"name":"simple-httpd","full_name":"tidwall/simple-httpd","owner":{"login":"tidwall","id":1156077,"avatar_url":"https://avatars2.githubusercontent.com/u/1156077?v=3","gravatar_id":"","url":"https://api.github.com/users/tidwall","html_url":"https://github.com/tidwall","followers_url":"https://api.github.com/users/tidwall/followers","following_url":"https://api.github.com/users/tidwall/following{/other_user}","gists_url":"https://api.github.com/users/tidwall/gists{/gist_id}","starred_url":"https://api.github.com/users/tidwall/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tidwall/subscriptions","organizations_url":"https://api.github.com/users/tidwall/orgs","repos_url":"https://api.github.com/users/tidwall/repos","events_url":"https://api.github.com/users/tidwall/events{/privacy}","received_events_url":"https://api.github.com/users/tidwall/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/tidwall/simple-httpd","description":"Simple HTTP server replacement for Python SimpleHTTPServer and provides automatic TLS via Let's Encrypt over HTTP2. ","fork":true,"url":"https://api.github.com/repos/tidwall/simple-httpd","forks_url":"https://api.github.com/repos/tidwall/simple-httpd/forks","keys_url":"https://api.github.com/repos/tidwall/simple-httpd/keys{/key_id}","collaborators_url":"https://api.github.com/repos/tidwall/simple-httpd/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/tidwall/simple-httpd/teams","hooks_url":"https://api.github.com/repos/tidwall/simple-httpd/hooks","issue_events_url":"https://api.github.com/repos/tidwall/simple-httpd/issues/events{/number}","events_url":"https://api.github.com/repos/tidwall/simple-httpd/events","assignees_url":"https://api.github.com/repos/tidwall/simple-httpd/assignees{/user}","branches_url":"https://api.github.com/repos/tidwall/simple-httpd/branches{/branch}","tags_url":"https://api.github.com/repos/tidwall/simple-httpd/tags","blobs_url":"https://api.github.com/repos/tidwall/simple-httpd/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/tidwall/simple-httpd/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/tidwall/simple-httpd/git/refs{/sha}","trees_url":"https://api.github.com/repos/tidwall/simple-httpd/git/trees{/sha}","statuses_url":"https://api.github.com/repos/tidwall/simple-httpd/statuses/{sha}","languages_url":"https://api.github.com/repos/tidwall/simple-httpd/languages","stargazers_url":"https://api.github.com/repos/tidwall/simple-httpd/stargazers","contributors_url":"https://api.github.com/repos/tidwall/simple-httpd/contributors","subscribers_url":"https://api.github.com/repos/tidwall/simple-httpd/subscribers","subscription_url":"https://api.github.com/repos/tidwall/simple-httpd/subscription","commits_url":"https://api.github.com/repos/tidwall/simple-httpd/commits{/sha}","git_commits_url":"https://api.github.com/repos/tidwall/simple-httpd/git/commits{/sha}","comments_url":"https://api.github.com/repos/tidwall/simple-httpd/comments{/number}","issue_comment_url":"https://api.github.com/repos/tidwall/simple-httpd/issues/comments{/number}","contents_url":"https://api.github.com/repos/tidwall/simple-httpd/contents/{+path}","compare_url":"https://api.github.com/repos/tidwall/simple-httpd/compare/{base}...{head}","merges_url":"https://api.github.com/repos/tidwall/simple-httpd/merges","archive_url":"https://api.github.com/repos/tidwall/simple-httpd/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/tidwall/simple-httpd/downloads","issues_url":"https://api.github.com/repos/tidwall/simple-httpd/issues{/number}","pulls_url":"https://api.github.com/repos/tidwall/simple-httpd/pulls{/number}","milestones_url":"https://api.github.com/repos/tidwall/simple-httpd/milestones{/number}","notifications_url":"https://api.github.com/repos/tidwall/simple-httpd/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/tidwall/simple-httpd/labels{/name}","releases_url":"https://api.github.com/repos/tidwall/simple-httpd/releases{/id}","deployments_url":"https://api.github.com/repos/tidwall/simple-httpd/deployments","created_at":"2017-06-13T21:25:15Z","updated_at":"2017-06-14T15:13:27Z","pushed_at":"2017-06-16T23:13:33Z","git_url":"git://github.com/tidwall/simple-httpd.git","ssh_url":"git@github.com:tidwall/simple-httpd.git","clone_url":"https://github.com/tidwall/simple-httpd.git","svn_url":"https://github.com/tidwall/simple-httpd","homepage":"","size":14517,"stargazers_count":2,"watchers_count":2,"language":"Go","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":2,"default_branch":"master"}},"base":{"label":"briandowns:master","ref":"master","sha":"9380bfb6a78a3f712092973f7935c6c15615484f","user":{"login":"briandowns","id":5714074,"avatar_url":"https://avatars2.githubusercontent.com/u/5714074?v=3","gravatar_id":"","url":"https://api.github.com/users/briandowns","html_url":"https://github.com/briandowns","followers_url":"https://api.github.com/users/briandowns/followers","following_url":"https://api.github.com/users/briandowns/following{/other_user}","gists_url":"https://api.github.com/users/briandowns/gists{/gist_id}","starred_url":"https://api.github.com/users/briandowns/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/briandowns/subscriptions","organizations_url":"https://api.github.com/users/briandowns/orgs","repos_url":"https://api.github.com/users/briandowns/repos","events_url":"https://api.github.com/users/briandowns/events{/privacy}","received_events_url":"https://api.github.com/users/briandowns/received_events","type":"User","site_admin":false},"repo":{"id":93986229,"name":"simple-httpd","full_name":"briandowns/simple-httpd","owner":{"login":"briandowns","id":5714074,"avatar_url":"https://avatars2.githubusercontent.com/u/5714074?v=3","gravatar_id":"","url":"https://api.github.com/users/briandowns","html_url":"https://github.com/briandowns","followers_url":"https://api.github.com/users/briandowns/followers","following_url":"https://api.github.com/users/briandowns/following{/other_user}","gists_url":"https://api.github.com/users/briandowns/gists{/gist_id}","starred_url":"https://api.github.com/users/briandowns/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/briandowns/subscriptions","organizations_url":"https://api.github.com/users/briandowns/orgs","repos_url":"https://api.github.com/users/briandowns/repos","events_url":"https://api.github.com/users/briandowns/events{/privacy}","received_events_url":"https://api.github.com/users/briandowns/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/briandowns/simple-httpd","description":"Simple HTTP server is a replacement for Python SimpleHTTPServer. It optionally provides automatic TLS via Let's Encrypt over HTTP2 or generated self-signed certificates.","fork":false,"url":"https://api.github.com/repos/briandowns/simple-httpd","forks_url":"https://api.github.com/repos/briandowns/simple-httpd/forks","keys_url":"https://api.github.com/repos/briandowns/simple-httpd/keys{/key_id}","collaborators_url":"https://api.github.com/repos/briandowns/simple-httpd/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/briandowns/simple-httpd/teams","hooks_url":"https://api.github.com/repos/briandowns/simple-httpd/hooks","issue_events_url":"https://api.github.com/repos/briandowns/simple-httpd/issues/events{/number}","events_url":"https://api.github.com/repos/briandowns/simple-httpd/events","assignees_url":"https://api.github.com/repos/briandowns/simple-httpd/assignees{/user}","branches_url":"https://api.github.com/repos/briandowns/simple-httpd/branches{/branch}","tags_url":"https://api.github.com/repos/briandowns/simple-httpd/tags","blobs_url":"https://api.github.com/repos/briandowns/simple-httpd/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/briandowns/simple-httpd/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/briandowns/simple-httpd/git/refs{/sha}","trees_url":"https://api.github.com/repos/briandowns/simple-httpd/git/trees{/sha}","statuses_url":"https://api.github.com/repos/briandowns/simple-httpd/statuses/{sha}","languages_url":"https://api.github.com/repos/briandowns/simple-httpd/languages","stargazers_url":"https://api.github.com/repos/briandowns/simple-httpd/stargazers","contributors_url":"https://api.github.com/repos/briandowns/simple-httpd/contributors","subscribers_url":"https://api.github.com/repos/briandowns/simple-httpd/subscribers","subscription_url":"https://api.github.com/repos/briandowns/simple-httpd/subscription","commits_url":"https://api.github.com/repos/briandowns/simple-httpd/commits{/sha}","git_commits_url":"https://api.github.com/repos/briandowns/simple-httpd/git/commits{/sha}","comments_url":"https://api.github.com/repos/briandowns/simple-httpd/comments{/number}","issue_comment_url":"https://api.github.com/repos/briandowns/simple-httpd/issues/comments{/number}","contents_url":"https://api.github.com/repos/briandowns/simple-httpd/contents/{+path}","compare_url":"https://api.github.com/repos/briandowns/simple-httpd/compare/{base}...{head}","merges_url":"https://api.github.com/repos/briandowns/simple-httpd/merges","archive_url":"https://api.github.com/repos/briandowns/simple-httpd/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/briandowns/simple-httpd/downloads","issues_url":"https://api.github.com/repos/briandowns/simple-httpd/issues{/number}","pulls_url":"https://api.github.com/repos/briandowns/simple-httpd/pulls{/number}","milestones_url":"https://api.github.com/repos/briandowns/simple-httpd/milestones{/number}","notifications_url":"https://api.github.com/repos/briandowns/simple-httpd/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/briandowns/simple-httpd/labels{/name}","releases_url":"https://api.github.com/repos/briandowns/simple-httpd/releases{/id}","deployments_url":"https://api.github.com/repos/briandowns/simple-httpd/deployments","created_at":"2017-06-11T06:30:12Z","updated_at":"2017-06-17T02:26:16Z","pushed_at":"2017-06-16T23:14:42Z","git_url":"git://github.com/briandowns/simple-httpd.git","ssh_url":"git@github.com:briandowns/simple-httpd.git","clone_url":"https://github.com/briandowns/simple-httpd.git","svn_url":"https://github.com/briandowns/simple-httpd","homepage":"","size":14512,"stargazers_count":136,"watchers_count":136,"language":"Go","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":7,"mirror_url":null,"open_issues_count":4,"forks":7,"open_issues":4,"watchers":136,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/briandowns/simple-httpd/pulls/22"},"html":{"href":"https://github.com/briandowns/simple-httpd/pull/22"},"issue":{"href":"https://api.github.com/repos/briandowns/simple-httpd/issues/22"},"comments":{"href":"https://api.github.com/repos/briandowns/simple-httpd/issues/22/comments"},"review_comments":{"href":"https://api.github.com/repos/briandowns/simple-httpd/pulls/22/comments"},"review_comment":{"href":"https://api.github.com/repos/briandowns/simple-httpd/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/briandowns/simple-httpd/pulls/22/commits"},"statuses":{"href":"https://api.github.com/repos/briandowns/simple-httpd/statuses/9f6348992c63cc89442037019c2fce568300ea17"}}}}
{"actor":{"display_login":"briandowns"}}