Goit

Simple and lightweight Git web server
git clone http://git.omkov.net/Goit
Log | Tree | Refs | README | Download

Goit/src/goit/http.go (65 lines, 2.1 KiB) -rw-r--r-- blame download

012345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
// Copyright (C) 2023, Jakob Wakeling
// All rights reserved.

package goit

import (
	"fmt"
	"html/template"
	"net"
	"net/http"

	"github.com/Jamozed/Goit/res"
)

var Tmpl = template.Must(template.New("error").Parse(res.Error))

func init() {
	template.Must(Tmpl.New("index").Parse(res.Index))
	template.Must(Tmpl.New("base/head").Parse(res.BaseHead))

	template.Must(Tmpl.New("admin/header").Parse(res.AdminHeader))
	template.Must(Tmpl.New("admin/status").Parse(res.AdminStatus))
	template.Must(Tmpl.New("admin/users").Parse(res.AdminUsers))
	template.Must(Tmpl.New("admin/user/create").Parse(res.AdminUserCreate))
	template.Must(Tmpl.New("admin/user/edit").Parse(res.AdminUserEdit))
	template.Must(Tmpl.New("admin/repos").Parse(res.AdminRepos))
	template.Must(Tmpl.New("admin/repo/edit").Parse(res.AdminRepoEdit))
	template.Must(Tmpl.New("admin/cron").Parse(res.AdminCron))

	template.Must(Tmpl.New("user/header").Parse(res.UserHeader))
	template.Must(Tmpl.New("user/login").Parse(res.UserLogin))
	template.Must(Tmpl.New("user/sessions").Parse(res.UserSessions))
	template.Must(Tmpl.New("user/edit").Parse(res.UserEdit))

	template.Must(Tmpl.New("repo/header").Parse(res.RepoHeader))
	template.Must(Tmpl.New("repo/create").Parse(res.RepoCreate))
	template.Must(Tmpl.New("repo/edit").Parse(res.RepoEdit))

	template.Must(Tmpl.New("repo/log").Parse(res.RepoLog))
	template.Must(Tmpl.New("repo/commit").Parse(res.RepoCommit))
	template.Must(Tmpl.New("repo/tree").Parse(res.RepoTree))
	template.Must(Tmpl.New("repo/file").Parse(res.RepoFile))
	template.Must(Tmpl.New("repo/blame").Parse(res.RepoBlame))
	template.Must(Tmpl.New("repo/refs").Parse(res.RepoRefs))
}

func HttpError(w http.ResponseWriter, code int) {
	w.WriteHeader(code)
	s := fmt.Sprint(code) + " " + http.StatusText(code)
	Tmpl.ExecuteTemplate(w, "error", struct{ Status string }{s})
}

func HttpNotFound(w http.ResponseWriter, r *http.Request) {
	HttpError(w, http.StatusNotFound)
}

func Ip(r *http.Request) string {
	if fip := r.Header.Get("X-Forwarded-For"); Conf.IpForwarded && fip != "" {
		return fip
	}

	ip, _, _ := net.SplitHostPort(r.RemoteAddr)
	return ip
}