aboutsummaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2021-08-03 00:54:24 -0400
committerRuss Cox <rsc@golang.org>2021-08-18 19:48:35 +0000
commit6c6d3e7c40fa86abd6fe6d0dd6ddaf0155d738f6 (patch)
treed2b09af3aee08b81789abf8404f3eef669718e77 /cmd
parent9b8de9f9de492b179320c9aa0716a2cd2a631839 (diff)
downloadgo-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.go1
-rw-r--r--cmd/golangorg/godev.go35
-rw-r--r--cmd/golangorg/godev_test.go60
-rw-r--r--cmd/golangorg/server.go10
-rw-r--r--cmd/golangorg/server_test.go22
-rw-r--r--cmd/golangorg/testdata/blog.txt53
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{
+ "&amp;lt;",
+ "&amp;gt;",
+ "&amp;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&nbsp;&nbsp;</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