Compare commits
5 Commits
master
...
release-br
Author | SHA1 | Date |
---|---|---|
|
3b2b05e9f5 | |
|
77187f3c2d | |
|
5682db0e91 | |
|
9f028c45f3 | |
|
8187b5f3e6 |
|
@ -10,7 +10,7 @@ binary. It can be tedious to recompile assets every time, but you can pass a
|
|||
flag to load CSS/JS/templates from disk every time a page loads:
|
||||
|
||||
```
|
||||
godoc --templates=$GOPATH/src/golang.org/x/tools/godoc/static --http=:6060
|
||||
godoc -templates=$GOPATH/src/golang.org/x/tools/godoc/static -http=:6060
|
||||
```
|
||||
|
||||
## Recompiling static assets
|
||||
|
|
|
@ -438,9 +438,9 @@ func sanitizeFunc(src string) string {
|
|||
}
|
||||
|
||||
type PageInfo struct {
|
||||
Dirname string // directory containing the package
|
||||
Err error // error or nil
|
||||
Share bool // show share button on examples
|
||||
Dirname string // directory containing the package
|
||||
Err error // error or nil
|
||||
GoogleCN bool // page is being served from golang.google.cn
|
||||
|
||||
// package info
|
||||
FSet *token.FileSet // nil if no package documentation
|
||||
|
@ -650,8 +650,8 @@ func (p *Presentation) example_htmlFunc(info *PageInfo, funcName string) string
|
|||
|
||||
err := p.ExampleHTML.Execute(&buf, struct {
|
||||
Name, Doc, Code, Play, Output string
|
||||
Share bool
|
||||
}{eg.Name, eg.Doc, code, play, out, info.Share})
|
||||
GoogleCN bool
|
||||
}{eg.Name, eg.Doc, code, play, out, info.GoogleCN})
|
||||
if err != nil {
|
||||
log.Print(err)
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ import (
|
|||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Page describes the contents of the top-level godoc webpage.
|
||||
|
@ -18,7 +19,7 @@ type Page struct {
|
|||
Subtitle string
|
||||
Query string
|
||||
Body []byte
|
||||
Share bool
|
||||
GoogleCN bool // page is being served from golang.google.cn
|
||||
|
||||
// filled in by servePage
|
||||
SearchBox bool
|
||||
|
@ -50,19 +51,25 @@ func (p *Presentation) ServeError(w http.ResponseWriter, r *http.Request, relpat
|
|||
Title: "File " + relpath,
|
||||
Subtitle: relpath,
|
||||
Body: applyTemplate(p.ErrorHTML, "errorHTML", err),
|
||||
Share: allowShare(r),
|
||||
GoogleCN: googleCN(r),
|
||||
})
|
||||
}
|
||||
|
||||
var onAppengine = false // overriden in appengine.go when on app engine
|
||||
var onAppengine = false // overridden in appengine.go when on app engine
|
||||
|
||||
func allowShare(r *http.Request) bool {
|
||||
func googleCN(r *http.Request) bool {
|
||||
if r.FormValue("googlecn") != "" {
|
||||
return true
|
||||
}
|
||||
if !onAppengine {
|
||||
return false
|
||||
}
|
||||
if strings.HasSuffix(r.Host, ".cn") {
|
||||
return true
|
||||
}
|
||||
switch r.Header.Get("X-AppEngine-Country") {
|
||||
case "", "ZZ", "CN":
|
||||
return false
|
||||
return true
|
||||
}
|
||||
return true
|
||||
return false
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@ import (
|
|||
"net/http"
|
||||
"net/http/httputil"
|
||||
"net/url"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"golang.org/x/net/context"
|
||||
|
@ -147,8 +148,8 @@ func cacheKey(body string) string {
|
|||
}
|
||||
|
||||
func share(w http.ResponseWriter, r *http.Request) {
|
||||
if !allowShare(r) {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
if googleCN(r) {
|
||||
http.Error(w, http.StatusText(http.StatusForbidden), http.StatusForbidden)
|
||||
return
|
||||
}
|
||||
target, _ := url.Parse(playgroundURL)
|
||||
|
@ -157,13 +158,19 @@ func share(w http.ResponseWriter, r *http.Request) {
|
|||
p.ServeHTTP(w, r)
|
||||
}
|
||||
|
||||
func allowShare(r *http.Request) bool {
|
||||
func googleCN(r *http.Request) bool {
|
||||
if r.FormValue("googlecn") != "" {
|
||||
return true
|
||||
}
|
||||
if appengine.IsDevAppServer() {
|
||||
return false
|
||||
}
|
||||
if strings.HasSuffix(r.Host, ".cn") {
|
||||
return true
|
||||
}
|
||||
switch r.Header.Get("X-AppEngine-Country") {
|
||||
case "", "ZZ", "CN":
|
||||
return false
|
||||
return true
|
||||
}
|
||||
return true
|
||||
return false
|
||||
}
|
||||
|
|
|
@ -196,7 +196,7 @@ func clHandler(w http.ResponseWriter, r *http.Request) {
|
|||
if n, err := strconv.Atoi(id); err == nil && n > 150000 {
|
||||
target = "https://codereview.appspot.com/" + id
|
||||
} else {
|
||||
target = "https://go-review.googlesource.com/r/" + id
|
||||
target = "https://go-review.googlesource.com/" + id
|
||||
}
|
||||
http.Redirect(w, r, target, http.StatusFound)
|
||||
}
|
||||
|
|
|
@ -55,8 +55,8 @@ func TestRedirects(t *testing.T) {
|
|||
"/design/123-foo": {302, "https://github.com/golang/proposal/blob/master/design/123-foo.md"},
|
||||
"/design/text/123-foo": {302, "https://github.com/golang/proposal/blob/master/design/text/123-foo.md"},
|
||||
|
||||
"/cl/1": {302, "https://go-review.googlesource.com/r/1"},
|
||||
"/cl/1/": {302, "https://go-review.googlesource.com/r/1"},
|
||||
"/cl/1": {302, "https://go-review.googlesource.com/1"},
|
||||
"/cl/1/": {302, "https://go-review.googlesource.com/1"},
|
||||
"/cl/267120043": {302, "https://codereview.appspot.com/267120043"},
|
||||
"/cl/267120043/": {302, "https://codereview.appspot.com/267120043"},
|
||||
}
|
||||
|
|
|
@ -126,7 +126,7 @@ func (p *Presentation) HandleSearch(w http.ResponseWriter, r *http.Request) {
|
|||
Tabtitle: query,
|
||||
Query: query,
|
||||
Body: body.Bytes(),
|
||||
Share: allowShare(r),
|
||||
GoogleCN: googleCN(r),
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
@ -307,13 +307,13 @@ func (h *handlerServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|||
info.TypeInfoIndex[ti.Name] = i
|
||||
}
|
||||
|
||||
info.Share = allowShare(r)
|
||||
info.GoogleCN = googleCN(r)
|
||||
h.p.ServePage(w, Page{
|
||||
Title: title,
|
||||
Tabtitle: tabtitle,
|
||||
Subtitle: subtitle,
|
||||
Body: applyTemplate(h.p.PackageHTML, "packageHTML", info),
|
||||
Share: info.Share,
|
||||
GoogleCN: info.GoogleCN,
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -555,7 +555,7 @@ func (p *Presentation) serveTextFile(w http.ResponseWriter, r *http.Request, abs
|
|||
Title: title + " " + relpath,
|
||||
Tabtitle: relpath,
|
||||
Body: buf.Bytes(),
|
||||
Share: allowShare(r),
|
||||
GoogleCN: googleCN(r),
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -616,7 +616,7 @@ func (p *Presentation) serveDirectory(w http.ResponseWriter, r *http.Request, ab
|
|||
Title: "Directory " + relpath,
|
||||
Tabtitle: relpath,
|
||||
Body: applyTemplate(p.DirlistHTML, "dirlistHTML", list),
|
||||
Share: allowShare(r),
|
||||
GoogleCN: googleCN(r),
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -645,7 +645,7 @@ func (p *Presentation) ServeHTMLDoc(w http.ResponseWriter, r *http.Request, absp
|
|||
page := Page{
|
||||
Title: meta.Title,
|
||||
Subtitle: meta.Subtitle,
|
||||
Share: allowShare(r),
|
||||
GoogleCN: googleCN(r),
|
||||
}
|
||||
|
||||
// evaluate as template if indicated
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
<div class="buttons">
|
||||
<a class="run" title="Run this code [shift-enter]">Run</a>
|
||||
<a class="fmt" title="Format this code">Format</a>
|
||||
{{if $.Share}}
|
||||
{{if not $.GoogleCN}}
|
||||
<a class="share" title="Share this code">Share</a>
|
||||
{{end}}
|
||||
</div>
|
||||
|
|
|
@ -55,7 +55,7 @@ func main() {
|
|||
<div class="buttons">
|
||||
<a class="run" title="Run this code [shift-enter]">Run</a>
|
||||
<a class="fmt" title="Format this code">Format</a>
|
||||
{{if $.Share}}
|
||||
{{if not $.GoogleCN}}
|
||||
<a class="share" title="Share this code">Share</a>
|
||||
{{end}}
|
||||
</div>
|
||||
|
@ -85,7 +85,7 @@ Except as <a href="https://developers.google.com/site-policies#restrictions">not
|
|||
the content of this page is licensed under the
|
||||
Creative Commons Attribution 3.0 License,
|
||||
and code is licensed under a <a href="/LICENSE">BSD license</a>.<br>
|
||||
<a href="/doc/tos.html">Terms of Service</a> |
|
||||
<a href="/doc/tos.html">Terms of Service</a> |
|
||||
<a href="http://www.google.com/intl/en/policies/privacy/">Privacy Policy</a>
|
||||
</div>
|
||||
|
||||
|
|
Loading…
Reference in New Issue