diff options
| author | Russ Cox <rsc@golang.org> | 2021-08-03 00:54:24 -0400 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2021-08-18 19:48:35 +0000 |
| commit | 6c6d3e7c40fa86abd6fe6d0dd6ddaf0155d738f6 (patch) | |
| tree | d2b09af3aee08b81789abf8404f3eef669718e77 /cmd | |
| parent | 9b8de9f9de492b179320c9aa0716a2cd2a631839 (diff) | |
| download | go-x-website-6c6d3e7c40fa86abd6fe6d0dd6ddaf0155d738f6.tar.xz | |
cmd/golangorg: move blog from blog.golang.org to go.dev/blog
This is the first of a sequence of consolidations of web sites into
the single site go.dev. An accompanying blog post (next CL) will
explain the change.
The blog/_content tree moves to go.dev/_content/blog.
The *.article files were converted to *.md files using rsc.io/tmp/blog2md.
The old dot directives are now template function invocations,
so that blog content files are now exactly the same format and
semantics as regular site content files.
All the old blog redirects are carried forward, of course.
Also add exhaustive test that every .md file renders correctly.
Also rename rawhtml to raw, because it gets used for raw Markdown too.
The raw Markdown issue is working around a bigger problem
(html/template is not really right for Markdown) that we will have
to solve at some point, but not in this CL.
Change-Id: Ifa9b3b8d656a72af30d0d4e57e4c7bc8dacbc386
Reviewed-on: https://go-review.googlesource.com/c/website/+/342091
Trust: Russ Cox <rsc@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Jamal Carvalho <jamal@golang.org>
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/golangorg/csp.go | 1 | ||||
| -rw-r--r-- | cmd/golangorg/godev.go | 35 | ||||
| -rw-r--r-- | cmd/golangorg/godev_test.go | 60 | ||||
| -rw-r--r-- | cmd/golangorg/server.go | 10 | ||||
| -rw-r--r-- | cmd/golangorg/server_test.go | 22 | ||||
| -rw-r--r-- | cmd/golangorg/testdata/blog.txt | 53 |
6 files changed, 85 insertions, 96 deletions
diff --git a/cmd/golangorg/csp.go b/cmd/golangorg/csp.go index e67f07f1..af204f5d 100644 --- a/cmd/golangorg/csp.go +++ b/cmd/golangorg/csp.go @@ -42,6 +42,7 @@ const ( var csp = map[string][]string{ "connect-src": { + "'self'", "https://golang.org", "www.google-analytics.com", "stats.g.doubleclick.net", diff --git a/cmd/golangorg/godev.go b/cmd/golangorg/godev.go index ca280d20..8fc92750 100644 --- a/cmd/golangorg/godev.go +++ b/cmd/golangorg/godev.go @@ -6,22 +6,16 @@ package main import ( "net/http" - "net/url" "sort" "strings" "time" "golang.org/x/website/internal/backport/html/template" "golang.org/x/website/internal/backport/osfs" + "golang.org/x/website/internal/blog" "golang.org/x/website/internal/web" ) -var discoveryHosts = map[string]string{ - "": "pkg.go.dev", - "dev.go.dev": "dev-pkg.go.dev", - "staging.go.dev": "staging-pkg.go.dev", -} - func godevHandler(dir string) (http.Handler, error) { godev := web.NewSite(osfs.DirFS(dir)) godev.Funcs(template.FuncMap{ @@ -30,8 +24,12 @@ func godevHandler(dir string) (http.Handler, error) { }) mux := http.NewServeMux() mux.Handle("/", addCSP(godev)) - mux.Handle("/explore/", http.StripPrefix("/explore/", redirectHosts(discoveryHosts))) - mux.Handle("learn.go.dev/", http.HandlerFunc(redirectLearn)) + mux.Handle("/explore/", http.StripPrefix("/explore/", redirectPrefix("https://pkg.go.dev/"))) + + if err := blog.RegisterFeeds(mux, "", godev); err != nil { + return nil, err + } + return mux, nil } @@ -79,22 +77,3 @@ func section(p web.Page) string { } return u[:1+i+1] } - -func redirectLearn(w http.ResponseWriter, r *http.Request) { - http.Redirect(w, r, "https://go.dev/learn/"+strings.TrimPrefix(r.URL.Path, "/"), http.StatusMovedPermanently) -} - -type redirectHosts map[string]string - -func (rh redirectHosts) ServeHTTP(w http.ResponseWriter, r *http.Request) { - u := &url.URL{Scheme: "https", Path: r.URL.Path, RawQuery: r.URL.RawQuery} - if h, ok := rh[r.Host]; ok { - u.Host = h - } else if h, ok := rh[""]; ok { - u.Host = h - } else { - http.NotFound(w, r) - return - } - http.Redirect(w, r, u.String(), http.StatusFound) -} diff --git a/cmd/golangorg/godev_test.go b/cmd/golangorg/godev_test.go index 962c1af7..19ebaad9 100644 --- a/cmd/golangorg/godev_test.go +++ b/cmd/golangorg/godev_test.go @@ -6,71 +6,11 @@ package main import ( "bytes" - "net/http" "net/http/httptest" "strings" "testing" ) -var testHosts = map[string]string{ - "": "foo.example.test", - "dev.example.test": "foo-dev.example.test", - "staging.example.test": "foo-staging.example.test", -} - -func TestRedirect(t *testing.T) { - tests := []struct { - desc string - target string - hosts map[string]string - want string - wantCode int - }{ - { - desc: "basic redirect", - target: "/", - hosts: testHosts, - want: "https://foo.example.test/", - wantCode: http.StatusFound, - }, - { - desc: "redirect keeps query and path", - target: "/github.com/golang/glog?tab=overview", - hosts: testHosts, - want: "https://foo.example.test/github.com/golang/glog?tab=overview", - wantCode: http.StatusFound, - }, - { - desc: "redirects to the correct host", - target: "https://dev.example.test/", - hosts: testHosts, - want: "https://foo-dev.example.test/", - wantCode: http.StatusFound, - }, - { - desc: "renders 404 if hosts are missing", - target: "https://dev.example.test/", - hosts: nil, - wantCode: http.StatusNotFound, - }, - } - for _, tt := range tests { - t.Run(tt.desc, func(t *testing.T) { - req := httptest.NewRequest("GET", tt.target, nil) - w := httptest.NewRecorder() - redirectHosts(tt.hosts).ServeHTTP(w, req) - resp := w.Result() - if resp.StatusCode != tt.wantCode { - t.Errorf("w.Result().StatusCode = %v, wanted %v", resp.StatusCode, tt.wantCode) - } - l, err := resp.Location() - if resp.StatusCode == http.StatusFound && (l == nil || l.String() != tt.want || err != nil) { - t.Errorf("resp.Location() = %v, %v, wanted %v, no error", l, err, tt.want) - } - }) - } -} - var siteTests = []struct { target string want []string diff --git a/cmd/golangorg/server.go b/cmd/golangorg/server.go index 6f61dcbe..838eab00 100644 --- a/cmd/golangorg/server.go +++ b/cmd/golangorg/server.go @@ -55,6 +55,8 @@ var ( runningOnAppEngine = os.Getenv("PORT") != "" + tipFlag = flag.Bool("tip", runningOnAppEngine, "load git content for tip.golang.org") + googleAnalytics string ) @@ -123,8 +125,6 @@ func main() { } } -var isTestBinary = false - // NewHandler returns the http.Handler for the web site, // given the directory where the content can be found // (can be "", in which case an internal copy is used) @@ -176,7 +176,7 @@ func NewHandler(contentDir, goroot string) http.Handler { // which broke the redirect. mux.Handle("m.golang.org/", http.RedirectHandler("https://mail.google.com/a/golang.org/", http.StatusMovedPermanently)) - if !isTestBinary { + if *tipFlag { go watchTip(&tipGoroot) } @@ -206,7 +206,9 @@ func NewHandler(contentDir, goroot string) http.Handler { log.Fatalf("godevHandler: %v", err) } mux.Handle("go.dev/", godev) - mux.Handle("learn.go.dev/", godev) + + mux.Handle("blog.golang.org/", redirectPrefix("https://go.dev/blog/")) + mux.Handle("learn.go.dev/", redirectPrefix("https://go.dev/learn/")) var h http.Handler = mux if env.EnforceHosts() { diff --git a/cmd/golangorg/server_test.go b/cmd/golangorg/server_test.go index ec994055..0b6524e4 100644 --- a/cmd/golangorg/server_test.go +++ b/cmd/golangorg/server_test.go @@ -16,10 +16,6 @@ import ( "golang.org/x/website/internal/webtest" ) -func init() { - isTestBinary = true -} - func TestWeb(t *testing.T) { h := NewHandler("../../_content", runtime.GOROOT()) @@ -34,6 +30,15 @@ func TestWeb(t *testing.T) { } } +var bad = []string{ + "&lt;", + "&gt;", + "&amp;", + " < ", + "<-", + "& ", +} + func TestAll(t *testing.T) { h := NewHandler("../../_content", runtime.GOROOT()) @@ -53,6 +58,15 @@ func TestAll(t *testing.T) { h.ServeHTTP(rec, httptest.NewRequest("GET", url, nil)) if rec.Code != 200 && rec.Code != 301 { t.Errorf("GET %s: %d, want 200\n%s", url, rec.Code, rec.Body.String()) + return nil + } + + s := rec.Body.String() + for _, b := range bad { + if strings.Contains(s, b) { + t.Errorf("GET %s: contains %s\n%s", url, b, s) + break + } } } return nil diff --git a/cmd/golangorg/testdata/blog.txt b/cmd/golangorg/testdata/blog.txt new file mode 100644 index 00000000..4c7afc25 --- /dev/null +++ b/cmd/golangorg/testdata/blog.txt @@ -0,0 +1,53 @@ +GET https://go.dev/blog/ +body contains The Go Blog +header Content-Type == text/html; charset=utf-8 + +GET https://go.dev/blog/2010/08/defer-panic-and-recover.html +redirect == /blog/defer-panic-and-recover + +GET https://go.dev/blog/upcoming-google-io-go-events +redirect == /blog/io2010-preview + +GET https://go.dev/blog/strings +body contains produces this mess +body contains <div class="playground" +body contains <pre contenteditable="true" spellcheck="false">package main + +GET https://go.dev/blog/race-detector +body contains <span class="number">11 </span> start := time.Now() + +GET https://go.dev/blog/go2draft +body contains <iframe + +GET https://go.dev/blog/gouk15 +body contains <img + +GET https://golang.org/blog/ +redirect == /blog + +GET https://golang.org/blog +redirect == https://go.dev/blog + +GET https://go.dev/blog +redirect == /blog/ + +GET https://blog.golang.org/ +redirect == https://go.dev/blog/ + +GET https://go.dev/blog/ +body contains The Go Blog + +GET https://blog.golang.org/x +redirect == /x/ + +GET https://blog.golang.org/x/ +redirect == https://go.dev/blog/x/ + +GET https://go.dev/blog/x/ +code == 404 + +GET https://blog.golang.org/go1.16 +redirect == https://go.dev/blog/go1.16 + +GET https://go.dev/blog/go1.16 +body contains Go 1.16 |
