diff --git a/website/camweb.go b/website/camweb.go index cb0b01447..f9a1d0ce0 100644 --- a/website/camweb.go +++ b/website/camweb.go @@ -316,6 +316,13 @@ func mainHandler(rw http.ResponseWriter, req *http.Request) { return } + // try to serve godoc if requested path exists + if req.URL.Path != "/" { + if err := serveGodoc(rw, req); err == nil { + return + } + } + findAndServeFile(rw, req, filepath.Join(*root, "content")) } @@ -871,9 +878,6 @@ func main() { mux.Handle("/robots.txt", http.FileServer(http.Dir(filepath.Join(*root, "static")))) mux.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir(filepath.Join(*root, "static"))))) mux.Handle("/talks/", http.StripPrefix("/talks/", http.FileServer(http.Dir(filepath.Join(*root, "talks"))))) - mux.Handle(pkgPattern, godocHandler{}) - mux.Handle(cmdPattern, godocHandler{}) - mux.Handle(appPattern, godocHandler{}) mux.HandleFunc(errPattern, errHandler) // Google Webmaster Tools ownership proof: diff --git a/website/godoc.go b/website/godoc.go index c0fb57ea6..917f20ec7 100644 --- a/website/godoc.go +++ b/website/godoc.go @@ -42,9 +42,7 @@ import ( ) const ( - pkgPattern = "/pkg/" cmdPattern = "/cmd/" - appPattern = "/app/" fileembedPattern = "fileembed.go" ) @@ -244,13 +242,6 @@ func (pi *PageInfo) populateDirs(diskPath string, depth int) { } func getPageInfo(pkgName, diskPath string) (pi PageInfo, err error) { - if pkgName == pathpkg.Join(domainName, pkgPattern) || - pkgName == pathpkg.Join(domainName, cmdPattern) || - pkgName == pathpkg.Join(domainName, appPattern) { - pi.Dirname = diskPath - pi.populateDirs(diskPath, -1) - return - } bpkg, err := build.ImportDir(diskPath, 0) if err != nil { if _, ok := err.(*build.NoGoError); ok { @@ -289,7 +280,7 @@ func getPageInfo(pkgName, diskPath string) (pi PageInfo, err error) { pi.Dirname = diskPath pi.PDoc = doc.New(aPkg, pkgName, 0) - pi.IsPkg = strings.Contains(pkgName, domainName+pkgPattern) + pi.IsPkg = pi.PDoc.Name != "main" // get directory information pi.populateDirs(diskPath, -1) @@ -407,33 +398,30 @@ func serveTextFile(w http.ResponseWriter, r *http.Request, abspath, relpath, tit }) } -type godocHandler struct{} - -func (godocHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { - m := docRx.FindStringSubmatch(r.URL.Path) - suffix := "" - if m == nil { - if r.URL.Path != pkgPattern && r.URL.Path != cmdPattern && r.URL.Path != appPattern { - http.NotFound(w, r) - return - } - suffix = r.URL.Path - } else { - suffix = m[1] - } +func serveGodoc(w http.ResponseWriter, r *http.Request) error { + suffix := r.URL.Path diskPath := filepath.Join(*root, "..", suffix) - switch pathpkg.Ext(suffix) { - case ".go": + fi, err := os.Stat(diskPath) + if err != nil { + return err + } + + switch { + case isGoFile(fi): serveTextFile(w, r, diskPath, suffix, "Source file") - return + return nil + case isPkgDir(fi): + break + default: + return os.ErrInvalid } pkgName := pathpkg.Join(domainName, suffix) pi, err := getPageInfo(pkgName, diskPath) if err != nil { log.Print(err) - return + return err } subtitle := pathpkg.Base(diskPath) @@ -443,4 +431,5 @@ func (godocHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { subtitle: subtitle, content: applyTextTemplate(packageHTML, "packageHTML", pi), }) + return nil }