// Package main ... package main import ( "fmt" "io" "log" "mime" "net/http" "os" "path" "strings" "git.mills.io/prologic/pages-server/gitea" ) // GiteaHandler ... type GiteaHandler struct { Client *gitea.Client Server string Domain string Token string DomainsMap map[string]string } // Init ... func (h *GiteaHandler) Init() error { var err error h.Client, err = gitea.NewClient(h.Server, h.Token, h.Domain) return err } // ServeHTTP ... func (h *GiteaHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { // use domain from the map if mapped, ok := h.DomainsMap[r.Host]; ok { r.Host = mapped } // remove the domain if it's set (works fine if it's empty) user := strings.TrimRight(strings.TrimSuffix(r.Host, h.Domain), ".") log.Printf("user: %s", user) f, err := h.Client.Open(user, r.URL.Path) if err != nil { http.Error(w, fmt.Sprintf("error resource not found: %s", err.Error()), http.StatusNotFound) return } extension := path.Ext(r.URL.Path) mimeType := mime.TypeByExtension(extension) w.Header().Add("content-type", mimeType) if _, err := io.Copy(w, f); err != nil { http.Error(w, "Internal Server Error", http.StatusInternalServerError) } } func main() { domainsMap := map[string]string{} items := strings.Split(os.Getenv("DOMAINS_MAP"), ";") for _, item := range items { itemParts := strings.Split(item, ":") if len(itemParts) == 2 { domainsMap[itemParts[0]] = itemParts[1] } } handler := &GiteaHandler{ Domain: os.Getenv("DOMAIN"), Server: os.Getenv("GITEA_URL"), Token: os.Getenv("GITEA_TOKEN"), DomainsMap: domainsMap, } if err := handler.Init(); err != nil { log.Fatalf("error initializing handler: %s", err) } if err := http.ListenAndServe("0.0.0.0:8000", handler); err != nil { log.Fatalf("error running server: %s", err) } }