github.com/jd-ly/tools@v0.5.7/godoc/page.go (about) 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 ( 8 "net/http" 9 "os" 10 "path/filepath" 11 "runtime" 12 "strings" 13 14 "github.com/jd-ly/tools/godoc/golangorgenv" 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 22 SrcPath string 23 Query string 24 Body []byte 25 GoogleCN bool // page is being served from golang.google.cn 26 TreeView bool // page needs to contain treeview related js and css 27 28 // filled in by ServePage 29 SearchBox bool 30 Playground bool 31 Version string 32 GoogleAnalytics string 33 } 34 35 func (p *Presentation) ServePage(w http.ResponseWriter, page Page) { 36 if page.Tabtitle == "" { 37 page.Tabtitle = page.Title 38 } 39 page.SearchBox = p.Corpus.IndexEnabled 40 page.Playground = p.ShowPlayground 41 page.Version = runtime.Version() 42 page.GoogleAnalytics = p.GoogleAnalytics 43 applyTemplateToResponseWriter(w, p.GodocHTML, page) 44 } 45 46 func (p *Presentation) ServeError(w http.ResponseWriter, r *http.Request, relpath string, err error) { 47 w.WriteHeader(http.StatusNotFound) 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 } 56 p.ServePage(w, Page{ 57 Title: "File " + relpath, 58 Subtitle: relpath, 59 Body: applyTemplate(p.ErrorHTML, "errorHTML", err), 60 GoogleCN: googleCN(r), 61 GoogleAnalytics: p.GoogleAnalytics, 62 }) 63 } 64 65 // googleCN reports whether request r is considered 66 // to be served from golang.google.cn. 67 func googleCN(r *http.Request) bool { 68 if r.FormValue("googlecn") != "" { 69 return true 70 } 71 if strings.HasSuffix(r.Host, ".cn") { 72 return true 73 } 74 if !golangorgenv.CheckCountry() { 75 return false 76 } 77 switch r.Header.Get("X-Appengine-Country") { 78 case "", "ZZ", "CN": 79 return true 80 } 81 return false 82 }