aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2021-02-26 02:15:10 -0500
committerRuss Cox <rsc@golang.org>2021-06-14 17:41:39 +0000
commit5d72b68448e421d8f18f59e3171432b669f62499 (patch)
tree3c9c9cdb03fe72fbd1d77a09a34fa47c642fd337
parent5ee419f2eadb4e9213f52ffc1f6fea62bb55fbb7 (diff)
downloadgo-x-website-5d72b68448e421d8f18f59e3171432b669f62499.tar.xz
cmd/golangorg: introduce CodewalkServer
Preparation for moving to a new package. Change-Id: Ib246f694f950eadcb9afa78e6551c8fb22e109a8 Reviewed-on: https://go-review.googlesource.com/c/website/+/317660 Trust: Russ Cox <rsc@golang.org> Run-TryBot: Russ Cox <rsc@golang.org> Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
-rw-r--r--cmd/golangorg/codewalk.go47
-rw-r--r--cmd/golangorg/handlers.go10
2 files changed, 33 insertions, 24 deletions
diff --git a/cmd/golangorg/codewalk.go b/cmd/golangorg/codewalk.go
index d3e5cbd1..00a5ea50 100644
--- a/cmd/golangorg/codewalk.go
+++ b/cmd/golangorg/codewalk.go
@@ -36,36 +36,45 @@ import (
"golang.org/x/website/internal/web"
)
+type CodewalkServer struct {
+ fsys fs.FS
+ site *web.Site
+}
+
+func NewCodewalkServer(fsys fs.FS, site *web.Site) *CodewalkServer {
+ return &CodewalkServer{fsys, site}
+}
+
// Handler for /doc/codewalk/ and below.
-func codewalk(w http.ResponseWriter, r *http.Request) {
+func (s *CodewalkServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
relpath := path.Clean(r.URL.Path[1:])
r.ParseForm()
if f := r.FormValue("fileprint"); f != "" {
- codewalkFileprint(w, r, f)
+ s.codewalkFileprint(w, r, f)
return
}
// If directory exists, serve list of code walks.
- dir, err := fs.Stat(fsys, relpath)
+ dir, err := fs.Stat(s.fsys, relpath)
if err == nil && dir.IsDir() {
- codewalkDir(w, r, relpath)
+ s.codewalkDir(w, r, relpath)
return
}
// If file exists, serve using standard file server.
if err == nil {
- site.ServeHTTP(w, r)
+ s.site.ServeHTTP(w, r)
return
}
// Otherwise append .xml and hope to find
// a codewalk description, but before trim
// the trailing /.
- cw, err := loadCodewalk(relpath + ".xml")
+ cw, err := s.loadCodewalk(relpath + ".xml")
if err != nil {
log.Print(err)
- site.ServeError(w, r, err)
+ s.site.ServeError(w, r, err)
return
}
@@ -74,7 +83,7 @@ func codewalk(w http.ResponseWriter, r *http.Request) {
return
}
- site.ServePage(w, r, web.Page{
+ s.site.ServePage(w, r, web.Page{
Title: "Codewalk: " + cw.Title,
TabTitle: cw.Title,
Template: "codewalk.html",
@@ -138,8 +147,8 @@ func (st *Codestep) String() string {
}
// loadCodewalk reads a codewalk from the named XML file.
-func loadCodewalk(filename string) (*Codewalk, error) {
- f, err := fsys.Open(filename)
+func (s *CodewalkServer) loadCodewalk(filename string) (*Codewalk, error) {
+ f, err := s.fsys.Open(filename)
if err != nil {
return nil, err
}
@@ -160,7 +169,7 @@ func loadCodewalk(filename string) (*Codewalk, error) {
i = len(st.Src)
}
filename := st.Src[0:i]
- data, err := fs.ReadFile(fsys, filename)
+ data, err := fs.ReadFile(s.fsys, filename)
if err != nil {
st.Err = err
continue
@@ -201,16 +210,16 @@ func loadCodewalk(filename string) (*Codewalk, error) {
// codewalkDir serves the codewalk directory listing.
// It scans the directory for subdirectories or files named *.xml
// and prepares a table.
-func codewalkDir(w http.ResponseWriter, r *http.Request, relpath string) {
+func (s *CodewalkServer) codewalkDir(w http.ResponseWriter, r *http.Request, relpath string) {
type elem struct {
Name string
Title string
}
- dir, err := fs.ReadDir(fsys, relpath)
+ dir, err := fs.ReadDir(s.fsys, relpath)
if err != nil {
log.Print(err)
- site.ServeError(w, r, err)
+ s.site.ServeError(w, r, err)
return
}
var v []interface{}
@@ -219,7 +228,7 @@ func codewalkDir(w http.ResponseWriter, r *http.Request, relpath string) {
if fi.IsDir() {
v = append(v, &elem{name + "/", ""})
} else if strings.HasSuffix(name, ".xml") {
- cw, err := loadCodewalk(relpath + "/" + name)
+ cw, err := s.loadCodewalk(relpath + "/" + name)
if err != nil {
continue
}
@@ -227,7 +236,7 @@ func codewalkDir(w http.ResponseWriter, r *http.Request, relpath string) {
}
}
- site.ServePage(w, r, web.Page{
+ s.site.ServePage(w, r, web.Page{
Title: "Codewalks",
Template: "codewalkdir.html",
Data: v,
@@ -240,12 +249,12 @@ func codewalkDir(w http.ResponseWriter, r *http.Request, relpath string) {
// in the response. This format is used for the middle window pane
// of the codewalk pages. It is a separate iframe and does not get
// the usual godoc HTML wrapper.
-func codewalkFileprint(w http.ResponseWriter, r *http.Request, f string) {
+func (s *CodewalkServer) codewalkFileprint(w http.ResponseWriter, r *http.Request, f string) {
relpath := strings.Trim(path.Clean(f), "/")
- data, err := fs.ReadFile(fsys, relpath)
+ data, err := fs.ReadFile(s.fsys, relpath)
if err != nil {
log.Print(err)
- site.ServeError(w, r, err)
+ s.site.ServeError(w, r, err)
return
}
lo, _ := strconv.Atoi(r.FormValue("lo"))
diff --git a/cmd/golangorg/handlers.go b/cmd/golangorg/handlers.go
index ee2cb77f..6000ac34 100644
--- a/cmd/golangorg/handlers.go
+++ b/cmd/golangorg/handlers.go
@@ -67,13 +67,13 @@ func (h hostEnforcerHandler) validHost(host string) bool {
return false
}
-func registerHandlers(pres *web.Site) *http.ServeMux {
- if pres == nil {
- panic("nil Presentation")
+func registerHandlers(site *web.Site) *http.ServeMux {
+ if site == nil {
+ panic("nil Site")
}
mux := http.NewServeMux()
- mux.Handle("/", pres)
- mux.Handle("/doc/codewalk/", http.HandlerFunc(codewalk))
+ mux.Handle("/", site)
+ mux.Handle("/doc/codewalk/", NewCodewalkServer(fsys, site))
mux.Handle("/fmt", http.HandlerFunc(fmtHandler))
mux.Handle("/x/", http.HandlerFunc(xHandler))
redirect.Register(mux)