clone

a self-hosted multitenant nostr relay with sites, file storage, git hosting, and inbox and outbox delivery

feat/ui-updates
tinyrelay / scripts / git-http-baseline / main.go
main.go 1.9K
1// This benchmark-only server exposes plain native Git Smart HTTP on loopback.2// It intentionally has no Nostr authorization; never deploy it as a relay.3package main45import (6 "compress/gzip"7 "flag"8 "io"9 "log"10 "net/http"11 "net/http/cgi"12 "os"13 "os/exec"14 "path/filepath"15)1617func main() {18 root := flag.String("root", "", "directory of bare benchmark repositories")19 listen := flag.String("listen", "127.0.0.1:17449", "loopback HTTP listener")20 flag.Parse()21 if *root == "" {22 log.Fatal("--root is required")23 }24 path, err := filepath.Abs(*root)25 if err != nil {26 log.Fatal(err)27 }28 git, err := exec.LookPath("git")29 if err != nil {30 log.Fatal(err)31 }32 handler := &cgi.Handler{33 Path: git, Args: []string{"http-backend"}, Dir: path,34 Env: []string{"GIT_PROJECT_ROOT=" + path, "GIT_HTTP_EXPORT_ALL=1"},35 }36 log.Printf("benchmark Git HTTP listening on %s", *listen)37 log.Fatal(http.ListenAndServe(*listen, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {38 // net/http has already decoded HTTP chunk framing. Git can consume an39 // unknown-length request from stdin; the generic CGI guard cannot.40 r.TransferEncoding = nil41 if r.Header.Get("Content-Encoding") == "gzip" {42 reader, err := gzip.NewReader(r.Body)43 if err != nil {44 http.Error(w, err.Error(), http.StatusBadRequest)45 return46 }47 defer reader.Close()48 file, err := os.CreateTemp("", "git-http-request-")49 if err != nil {50 http.Error(w, err.Error(), http.StatusInternalServerError)51 return52 }53 defer os.Remove(file.Name())54 defer file.Close()55 size, err := io.Copy(file, reader)56 if err != nil {57 http.Error(w, err.Error(), http.StatusBadRequest)58 return59 }60 if _, err := file.Seek(0, io.SeekStart); err != nil {61 http.Error(w, err.Error(), http.StatusInternalServerError)62 return63 }64 r.Body = file65 r.ContentLength = size66 r.Header.Del("Content-Encoding")67 }68 handler.ServeHTTP(w, r)69 })))70}