// 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 } // 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) { // 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() { handler := &GiteaHandler{ Domain: os.Getenv("DOMAIN"), Server: os.Getenv("GITEA_URL"), Token: os.Getenv("GITEA_TOKEN"), } 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) } }