Brad Fitzpatrick | ca3319f | 2013-07-17 17:17:12 +1000 | [diff] [blame] | 1 | // Copyright 2009 The Go Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style |
| 3 | // license that can be found in the LICENSE file. |
| 4 | |
| 5 | package godoc |
| 6 | |
| 7 | import ( |
Brad Fitzpatrick | ca3319f | 2013-07-17 17:17:12 +1000 | [diff] [blame] | 8 | "net/http" |
Francesc Campoy | 3f4088e | 2016-09-20 16:58:29 -0700 | [diff] [blame] | 9 | "os" |
| 10 | "path/filepath" |
Brad Fitzpatrick | ca3319f | 2013-07-17 17:17:12 +1000 | [diff] [blame] | 11 | "runtime" |
Andrew Bonventre | 4e70a1b | 2017-08-02 16:37:59 -0400 | [diff] [blame] | 12 | "strings" |
Chris Broadfoot | ee6b031 | 2018-09-04 09:55:45 -0700 | [diff] [blame] | 13 | |
Dmitri Shuralyov | bd17c08 | 2019-03-05 16:56:02 -0500 | [diff] [blame] | 14 | "golang.org/x/tools/godoc/golangorgenv" |
Brad Fitzpatrick | ca3319f | 2013-07-17 17:17:12 +1000 | [diff] [blame] | 15 | ) |
| 16 | |
| 17 | // Page describes the contents of the top-level godoc webpage. |
| 18 | type Page struct { |
| 19 | Title string |
| 20 | Tabtitle string |
| 21 | Subtitle string |
Sina Siadat | 5128de7 | 2016-09-16 17:12:50 +0430 | [diff] [blame] | 22 | SrcPath string |
Brad Fitzpatrick | ca3319f | 2013-07-17 17:17:12 +1000 | [diff] [blame] | 23 | Query string |
| 24 | Body []byte |
Andrew Bonventre | 4e70a1b | 2017-08-02 16:37:59 -0400 | [diff] [blame] | 25 | GoogleCN bool // page is being served from golang.google.cn |
Agniva De Sarker | c75e7e6 | 2018-05-12 10:43:07 +0530 | [diff] [blame] | 26 | TreeView bool // page needs to contain treeview related js and css |
Brad Fitzpatrick | ca3319f | 2013-07-17 17:17:12 +1000 | [diff] [blame] | 27 | |
Chris Broadfoot | ee6b031 | 2018-09-04 09:55:45 -0700 | [diff] [blame] | 28 | // filled in by ServePage |
| 29 | SearchBox bool |
| 30 | Playground bool |
| 31 | Version string |
| 32 | GoogleAnalytics string |
Brad Fitzpatrick | ca3319f | 2013-07-17 17:17:12 +1000 | [diff] [blame] | 33 | } |
| 34 | |
Brad Fitzpatrick | 4fc6323 | 2013-07-18 09:52:45 +1000 | [diff] [blame] | 35 | func (p *Presentation) ServePage(w http.ResponseWriter, page Page) { |
Brad Fitzpatrick | ca3319f | 2013-07-17 17:17:12 +1000 | [diff] [blame] | 36 | if page.Tabtitle == "" { |
| 37 | page.Tabtitle = page.Title |
| 38 | } |
Brad Fitzpatrick | 4fc6323 | 2013-07-18 09:52:45 +1000 | [diff] [blame] | 39 | page.SearchBox = p.Corpus.IndexEnabled |
Brad Fitzpatrick | 5395cfe | 2013-07-18 13:14:09 +1000 | [diff] [blame] | 40 | page.Playground = p.ShowPlayground |
Brad Fitzpatrick | ca3319f | 2013-07-17 17:17:12 +1000 | [diff] [blame] | 41 | page.Version = runtime.Version() |
Chris Broadfoot | ee6b031 | 2018-09-04 09:55:45 -0700 | [diff] [blame] | 42 | page.GoogleAnalytics = p.GoogleAnalytics |
Brad Garcia | efd232e | 2014-01-29 10:53:45 -0500 | [diff] [blame] | 43 | applyTemplateToResponseWriter(w, p.GodocHTML, page) |
Brad Fitzpatrick | ca3319f | 2013-07-17 17:17:12 +1000 | [diff] [blame] | 44 | } |
| 45 | |
Brad Fitzpatrick | 4fc6323 | 2013-07-18 09:52:45 +1000 | [diff] [blame] | 46 | func (p *Presentation) ServeError(w http.ResponseWriter, r *http.Request, relpath string, err error) { |
Brad Fitzpatrick | ca3319f | 2013-07-17 17:17:12 +1000 | [diff] [blame] | 47 | w.WriteHeader(http.StatusNotFound) |
Francesc Campoy | 3f4088e | 2016-09-20 16:58:29 -0700 | [diff] [blame] | 48 | if perr, ok := err.(*os.PathError); ok { |
| 49 | rel, err := filepath.Rel(runtime.GOROOT(), perr.Path) |
| 50 | if err != nil { |
| 51 | perr.Path = "REDACTED" |
| 52 | } else { |
| 53 | perr.Path = filepath.Join("$GOROOT", rel) |
| 54 | } |
| 55 | } |
Brad Fitzpatrick | 4fc6323 | 2013-07-18 09:52:45 +1000 | [diff] [blame] | 56 | p.ServePage(w, Page{ |
Chris Broadfoot | ee6b031 | 2018-09-04 09:55:45 -0700 | [diff] [blame] | 57 | Title: "File " + relpath, |
| 58 | Subtitle: relpath, |
| 59 | Body: applyTemplate(p.ErrorHTML, "errorHTML", err), |
| 60 | GoogleCN: googleCN(r), |
| 61 | GoogleAnalytics: p.GoogleAnalytics, |
Brad Fitzpatrick | ca3319f | 2013-07-17 17:17:12 +1000 | [diff] [blame] | 62 | }) |
| 63 | } |
Andrew Gerrand | 1330b28 | 2015-09-02 09:49:30 +1000 | [diff] [blame] | 64 | |
Dmitri Shuralyov | bd17c08 | 2019-03-05 16:56:02 -0500 | [diff] [blame] | 65 | // googleCN reports whether request r is considered |
| 66 | // to be served from golang.google.cn. |
Andrew Bonventre | 4e70a1b | 2017-08-02 16:37:59 -0400 | [diff] [blame] | 67 | func googleCN(r *http.Request) bool { |
| 68 | if r.FormValue("googlecn") != "" { |
| 69 | return true |
| 70 | } |
Andrew Bonventre | 4e70a1b | 2017-08-02 16:37:59 -0400 | [diff] [blame] | 71 | if strings.HasSuffix(r.Host, ".cn") { |
Andrew Gerrand | 1330b28 | 2015-09-02 09:49:30 +1000 | [diff] [blame] | 72 | return true |
| 73 | } |
Dmitri Shuralyov | bd17c08 | 2019-03-05 16:56:02 -0500 | [diff] [blame] | 74 | if !golangorgenv.CheckCountry() { |
| 75 | return false |
| 76 | } |
| 77 | switch r.Header.Get("X-Appengine-Country") { |
Andrew Gerrand | e1d85eb | 2015-09-28 17:00:17 +1000 | [diff] [blame] | 78 | case "", "ZZ", "CN": |
Andrew Bonventre | 4e70a1b | 2017-08-02 16:37:59 -0400 | [diff] [blame] | 79 | return true |
Andrew Gerrand | 1330b28 | 2015-09-02 09:49:30 +1000 | [diff] [blame] | 80 | } |
Andrew Bonventre | 4e70a1b | 2017-08-02 16:37:59 -0400 | [diff] [blame] | 81 | return false |
Andrew Gerrand | 1330b28 | 2015-09-02 09:49:30 +1000 | [diff] [blame] | 82 | } |