func()

in internal/pkgdoc/doc.go [419:513]


func (d *docs) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	if maybeRedirect(w, r) {
		return
	}

	// TODO(rsc): URL should be clean already.
	relpath := path.Clean(strings.TrimPrefix(r.URL.Path, "/pkg"))
	relpath = strings.TrimPrefix(relpath, "/")

	mode := parseMode(r.FormValue("m"))

	// Redirect to pkg.go.dev.
	// We provide two overrides for the redirect.
	// First, the request can set ?m=old to get the old pages.
	// Second, the request can come from China:
	// since pkg.go.dev is not available in China, we serve the docs directly.
	if mode&modeOld == 0 && (d.forceOld == nil || !d.forceOld(r)) {
		if relpath == "" {
			relpath = "std"
		}
		suffix := ""
		if r.Host == "tip.golang.org" {
			suffix = "@master"
		}
		if goos, goarch := r.FormValue("GOOS"), r.FormValue("GOARCH"); goos != "" || goarch != "" {
			suffix += "?"
			if goos != "" {
				suffix += "GOOS=" + url.QueryEscape(goos)
			}
			if goarch != "" {
				if goos != "" {
					suffix += "&"
				}
				suffix += "GOARCH=" + url.QueryEscape(goarch)
			}
		}
		http.Redirect(w, r, "https://pkg.go.dev/"+relpath+suffix, http.StatusTemporaryRedirect)
		return
	}

	if relpath == "builtin" {
		// The fake built-in package contains unexported identifiers,
		// but we want to show them. Also, disable type association,
		// since it's not helpful for this fake package (see issue 6645).
		mode |= modeAll | modeBuiltin
	}
	info := d.open("src/"+relpath, mode, r.FormValue("GOOS"), r.FormValue("GOARCH"))
	if info.Err != nil {
		log.Print(info.Err)
		d.site.ServeError(w, r, info.Err)
		return
	}
	info.OldDocs = mode&modeOld != 0

	var tabtitle, title, subtitle string
	switch {
	case info.PDoc != nil:
		tabtitle = info.PDoc.Name
	default:
		tabtitle = info.Dirname
		title = "Directory "
	}
	if title == "" {
		if info.IsMain {
			// assume that the directory name is the command name
			_, tabtitle = path.Split(relpath)
			title = "Command "
		} else {
			title = "Package "
		}
	}
	title += tabtitle

	// special cases for top-level package/command directories
	switch tabtitle {
	case "/src":
		title = "Packages"
		tabtitle = "Packages"
	case "/src/cmd":
		title = "Commands"
		tabtitle = "Commands"
	}

	layout := "pkg"
	if info.Dirname == "src" {
		layout = "pkgroot"
	}
	d.site.ServePage(w, r, web.Page{
		"title":    title,
		"tabTitle": tabtitle,
		"subtitle": subtitle,
		"layout":   layout,
		"pkg":      info,
	})
}