Skip to content

Commit d8ee5da

Browse files
committed
feat(http-server): add logging middleware
1 parent 10eb84f commit d8ee5da

File tree

2 files changed

+56
-3
lines changed

2 files changed

+56
-3
lines changed

cmd/gogit-http-server/logging.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package main
2+
3+
import (
4+
"log"
5+
"net/http"
6+
"strings"
7+
"time"
8+
)
9+
10+
type logWriter struct {
11+
http.ResponseWriter
12+
code, bytes int
13+
}
14+
15+
func (r *logWriter) Write(p []byte) (int, error) {
16+
written, err := r.ResponseWriter.Write(p)
17+
r.bytes += written
18+
return written, err
19+
}
20+
21+
// Note this is generally only called when sending an HTTP error, so it's
22+
// important to set the `code` value to 200 as a default
23+
func (r *logWriter) WriteHeader(code int) {
24+
r.code = code
25+
r.ResponseWriter.WriteHeader(code)
26+
}
27+
28+
// LoggingMiddleware is the logging middleware where we log incoming and
29+
// outgoing requests for a multiplexer. It should be the first middleware
30+
// called so it can log request times accurately.
31+
func LoggingMiddleware(logger *log.Logger, next http.Handler) http.Handler {
32+
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
33+
addr := r.RemoteAddr
34+
if colon := strings.LastIndex(addr, ":"); colon != -1 {
35+
addr = addr[:colon]
36+
}
37+
38+
writer := &logWriter{
39+
ResponseWriter: w,
40+
code: http.StatusOK, // default. so important! see above.
41+
}
42+
43+
startTime := time.Now()
44+
45+
next.ServeHTTP(writer, r)
46+
47+
elapsedTime := time.Since(startTime)
48+
logger.Printf("%s %s %s %s %d %dB %v", addr, r.Method, r.RequestURI, r.Proto, writer.code, writer.bytes, elapsedTime)
49+
})
50+
}

cmd/gogit-http-server/main.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
"path/filepath"
99

1010
"github.com/go-git/go-billy/v5/osfs"
11-
githttp "github.com/go-git/go-git/v6/plumbing/http"
11+
githttp "github.com/go-git/go-git/v6/backend/http"
1212
"github.com/go-git/go-git/v6/plumbing/transport"
1313
"github.com/spf13/cobra"
1414
)
@@ -32,11 +32,14 @@ var rootCmd = &cobra.Command{
3232
}
3333

3434
log.Printf("Using absolute path: %q", abs)
35+
logger := log.Default()
3536
loader := transport.NewFilesystemLoader(osfs.New(abs, osfs.WithBoundOS()), false)
36-
handler := &githttp.Handler{
37+
gitmw := &githttp.Handler{
3738
Loader: loader,
38-
ErrorLog: log.Default(),
39+
ErrorLog: logger,
3940
}
41+
42+
handler := LoggingMiddleware(logger, gitmw)
4043
log.Printf("Starting server on %q for directory %q", addr, directory)
4144
if err := http.ListenAndServe(addr, handler); !errors.Is(err, http.ErrServerClosed) {
4245
return err

0 commit comments

Comments
 (0)