toyohime/vanity.go
kare.nuorteva 05892d509d Review and clean vanity
git-svn-id: file:///srv/svn/repo/toyohime/trunk@21 922d331f-388e-da47-97a9-ad700dc0b8b9
2016-12-11 22:52:00 +00:00

69 lines
1.8 KiB
Go

package vanity // import "kkn.fi/vanity"
import (
"fmt"
"net/http"
)
type (
// Path is the path component of the request sent by Go tool or browser.
Path string
// Package defines Go package that has vanity import defined.
Package struct {
// Path is path component of vanity url.
Path Path
// VCSSystem is version control system used by the project.
// Usually 'git' or 'hg'.
VCSSystem string
// VCSURL is the HTTP URL for project's version control system.
VCSURL string
}
// Server is the actual HTTP server for Go vanity domains.
Server struct {
// Domain is the vanity domain.
Domain *string
// Config contains settings for vanity packages.
Config map[Path]Package
}
)
// NewPackage returns a new Package given a path, VCS system and VCS URL.
func NewPackage(path, vcssystem, vcsurl string) *Package {
p := &Package{
Path: Path(path),
VCSSystem: vcssystem,
VCSURL: vcsurl,
}
return p
}
// NewServer returns a new Vanity Server given domain name and vanity package configuration.
func NewServer(domain string, config map[Path]Package) *Server {
s := &Server{
Domain: &domain,
Config: config,
}
return s
}
func (s Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Header().Add("Content-Type", "text/html; charset=utf-8")
if r.Method != http.MethodGet {
http.Error(w, http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed)
return
}
conf, ok := s.Config[Path(r.URL.Path)]
if !ok {
http.NotFound(w, r)
return
}
if r.FormValue("go-get") != "1" {
url := fmt.Sprintf("https://godoc.org/%v%v", *s.Domain, r.URL.Path)
http.Redirect(w, r, url, http.StatusTemporaryRedirect)
return
}
i := fmt.Sprintf("%s%s %s %s", *s.Domain, conf.Path, conf.VCSSystem, conf.VCSURL)
fmt.Fprintf(w, `<meta name="go-import" content="%s">`, i)
}