gitea-pages-server/main.go

83 lines
1.8 KiB
Go

// 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)
}
}