@@ -5,13 +5,35 @@ import (
55 "mjpclab.dev/ghfs/src/util"
66 "net/http"
77 "net/url"
8+ "strconv"
89)
910
10- func logRequest (logger * serverLog.Logger , r * http.Request ) {
11+ type loggableResponseWriter struct {
12+ http.ResponseWriter
13+ request * http.Request
14+ logger * serverLog.Logger
15+ }
16+
17+ func (w loggableResponseWriter ) WriteHeader (statusCode int ) {
18+ w .ResponseWriter .WriteHeader (statusCode )
19+ logRequest (w .logger , w .request , statusCode )
20+ }
21+
22+ func tryGetLoggableResponseWriter (w http.ResponseWriter , r * http.Request , logger * serverLog.Logger ) http.ResponseWriter {
23+ if logger .CanLogAccess () {
24+ return loggableResponseWriter {w , r , logger }
25+ } else {
26+ return w
27+ }
28+ }
29+
30+ func logRequest (logger * serverLog.Logger , r * http.Request , statusCode int ) {
1131 if ! logger .CanLogAccess () {
1232 return
1333 }
1434
35+ code := strconv .Itoa (statusCode )
36+
1537 var unescapedUri []byte
1638 unescapedLen := 0
1739 unescapedStr , err := url .PathUnescape (r .RequestURI )
@@ -24,10 +46,12 @@ func logRequest(logger *serverLog.Logger, r *http.Request) {
2446
2547 uri := util .EscapeControllingRune (r .RequestURI )
2648
27- buf := serverLog .NewBuffer (2 + len (r .RemoteAddr ) + len (r .Method ) + unescapedLen + len (uri ))
49+ buf := serverLog .NewBuffer (3 + len (r .RemoteAddr ) + len ( code ) + len (r .Method ) + unescapedLen + len (uri ))
2850
2951 buf = append (buf , []byte (r .RemoteAddr )... ) // ~ 9-47 bytes, mainly 21 bytes
3052 buf = append (buf , ' ' ) // 1 byte
53+ buf = append (buf , []byte (code )... ) // 3 bytes
54+ buf = append (buf , ' ' ) // 1 byte
3155 buf = append (buf , []byte (r .Method )... ) // ~ 3-4 bytes
3256 buf = append (buf , ' ' ) // 1 byte
3357 if unescapedLen > 0 {
0 commit comments