Skip to content

Commit c1544b9

Browse files
add file server to tests http source + update examples to use http source
1 parent d1a3784 commit c1544b9

File tree

5 files changed

+107
-4
lines changed

5 files changed

+107
-4
lines changed

cmd/detect-latest-release/main.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,13 @@ func usage() {
3030

3131
func main() {
3232
var help, verbose bool
33-
var cvsType, forceOS, forceArch string
33+
var cvsType, forceOS, forceArch, baseURL string
3434
flag.BoolVar(&help, "h", false, "Show help")
3535
flag.BoolVar(&verbose, "v", false, "Display debugging information")
36-
flag.StringVar(&cvsType, "t", "auto", "Version control: \"github\", \"gitea\" or \"gitlab\"")
36+
flag.StringVar(&cvsType, "t", "auto", "Version control: \"github\", \"gitea\", \"gitlab\" or \"http\"")
3737
flag.StringVar(&forceOS, "o", "", "OS name to use (windows, darwin, linux, etc)")
3838
flag.StringVar(&forceArch, "a", "", "CPU architecture to use (amd64, arm64, etc)")
39+
flag.StringVar(&baseURL, "u", "", "Base URL for VCS on http or dedicated instances")
3940

4041
flag.Usage = usage
4142
flag.Parse()
@@ -57,6 +58,10 @@ func main() {
5758
os.Exit(1)
5859
}
5960

61+
if domain == "" && baseURL != "" {
62+
domain = baseURL
63+
}
64+
6065
if verbose {
6166
fmt.Printf("slug %q on domain %q\n", slug, domain)
6267
}

cmd/get-release/main.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@ import (
1919

2020
func main() {
2121
var help, verbose bool
22-
var cvsType string
22+
var cvsType, baseURL string
2323
flag.BoolVar(&help, "h", false, "Show help")
2424
flag.BoolVar(&verbose, "v", false, "Display debugging information")
25-
flag.StringVar(&cvsType, "t", "auto", "Version control: \"github\", \"gitea\" or \"gitlab\"")
25+
flag.StringVar(&cvsType, "t", "auto", "Version control: \"github\", \"gitea\", \"gitlab\" or \"http\"")
26+
flag.StringVar(&baseURL, "u", "", "Base URL for VCS on http or dedicated instances")
2627

2728
flag.Usage = usage
2829
flag.Parse()
@@ -44,6 +45,10 @@ func main() {
4445
os.Exit(1)
4546
}
4647

48+
if domain == "" && baseURL != "" {
49+
domain = baseURL
50+
}
51+
4752
if verbose {
4853
fmt.Printf("slug %q on domain %q\n", slug, domain)
4954
}

cmd/serve-repo/logger.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package main
2+
3+
import (
4+
"log/slog"
5+
"net/http"
6+
"time"
7+
)
8+
9+
type (
10+
// struct for holding response details
11+
responseData struct {
12+
status int
13+
size int
14+
}
15+
16+
// our http.ResponseWriter implementation
17+
loggingResponseWriter struct {
18+
http.ResponseWriter // compose original http.ResponseWriter
19+
responseData *responseData
20+
}
21+
)
22+
23+
func (r *loggingResponseWriter) Write(b []byte) (int, error) {
24+
size, err := r.ResponseWriter.Write(b) // write response using original http.ResponseWriter
25+
r.responseData.size += size // capture size
26+
return size, err
27+
}
28+
29+
func (r *loggingResponseWriter) WriteHeader(statusCode int) {
30+
r.ResponseWriter.WriteHeader(statusCode) // write status code using original http.ResponseWriter
31+
r.responseData.status = statusCode // capture status code
32+
}
33+
34+
func WithLogging(h http.Handler) http.Handler {
35+
loggingFn := func(rw http.ResponseWriter, req *http.Request) {
36+
start := time.Now()
37+
38+
responseData := &responseData{
39+
status: 0,
40+
size: 0,
41+
}
42+
lrw := loggingResponseWriter{
43+
ResponseWriter: rw, // compose original http.ResponseWriter
44+
responseData: responseData,
45+
}
46+
h.ServeHTTP(&lrw, req) // inject our implementation of http.ResponseWriter
47+
48+
duration := time.Since(start)
49+
50+
slog.Info("request completed",
51+
"uri", req.RequestURI,
52+
"method", req.Method,
53+
"status", responseData.status, // get captured status code
54+
"duration", duration,
55+
"size", responseData.size, // get captured size
56+
)
57+
}
58+
return http.HandlerFunc(loggingFn)
59+
}

cmd/serve-repo/main.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// Simple implementation of a HTTP server to be used by the updater with the http source
2+
package main
3+
4+
import (
5+
"flag"
6+
"log"
7+
"net/http"
8+
"path"
9+
"time"
10+
)
11+
12+
func main() {
13+
var root, listen, prefix, fixedSlug string
14+
flag.StringVar(&root, "repo", "", "Root path of the file server")
15+
flag.StringVar(&listen, "listen", "localhost:9947", "IP address and port used for the HTTP server")
16+
flag.StringVar(&prefix, "path-prefix", "/repo", "Prefix to the root path of the HTTP server")
17+
flag.StringVar(&fixedSlug, "fixed-slug", "creativeprojects/resticprofile", "Only answer on this particular slug. When NOT specified the files will be served with the slug in the path.")
18+
flag.Parse()
19+
20+
mux := http.NewServeMux()
21+
fs := http.FileServer(http.Dir(root))
22+
pathPrefix := path.Join("/", prefix, fixedSlug)
23+
log.Printf("listening on http://" + listen + pathPrefix)
24+
mux.Handle(pathPrefix+"/", http.StripPrefix(pathPrefix, WithLogging(fs)))
25+
server := http.Server{
26+
Addr: listen,
27+
Handler: mux,
28+
ReadHeaderTimeout: 15 * time.Second,
29+
}
30+
server.ListenAndServe()
31+
}

cmd/source.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ func getSourceFromName(name, domain string) (selfupdate.Source, error) {
7575
case "gitlab":
7676
return selfupdate.NewGitLabSource(selfupdate.GitLabConfig{BaseURL: domain})
7777

78+
case "http":
79+
return selfupdate.NewHttpSource(selfupdate.HttpConfig{BaseURL: domain})
80+
7881
default:
7982
return newGitHubSource(domain)
8083
}

0 commit comments

Comments
 (0)