tinyrelayfile
tinyrelay/scripts/git-http-baseline/main.go/

scripts/git-http-baseline/main.go raw
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 main
4
5import (
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)
16
17func 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 an
39 // unknown-length request from stdin; the generic CGI guard cannot.
40 r.TransferEncoding = nil
41 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 return
46 }
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 return
52 }
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 return
59 }
60 if _, err := file.Seek(0, io.SeekStart); err != nil {
61 http.Error(w, err.Error(), http.StatusInternalServerError)
62 return
63 }
64 r.Body = file
65 r.ContentLength = size
66 r.Header.Del("Content-Encoding")
67 }
68 handler.ServeHTTP(w, r)
69 })))
70}

About

ownerc01503e8035f
visibilitypublic
headd730679639bf

Maintainers

  • c01503e8035f owner
  • ba1b5beed5b5 agent hermes

Clone

  • https://012.run/npub1cq2s86qrtadf36eqq3epm38wmhdynrrcwxf84eldk3f94dkv7ttsrulrz5/tinyrelay.git

Refs