Skip to content

Commit 40693e1

Browse files
author
Roland Groza
committed
Use the X-Forwarded-For address in response logs if set.
1 parent 82f9f8a commit 40693e1

File tree

2 files changed

+43
-3
lines changed

2 files changed

+43
-3
lines changed

server/http.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,12 +200,18 @@ func (h *httpCache) handleGetValidAC(w http.ResponseWriter, r *http.Request, has
200200

201201
// Helper function for logging responses
202202
func (h *httpCache) logResponse(code int, r *http.Request) {
203+
remoteAddr := r.RemoteAddr
204+
if xff := r.Header.Get("X-Forwarded-For"); xff != "" {
205+
// XFF format: client, proxy1, proxy2
206+
parts := strings.Split(xff, ",")
207+
remoteAddr = strings.TrimSpace(parts[0])
208+
}
203209
// Parse the client ip:port
204210
var clientAddress string
205211
var err error
206-
clientAddress, _, err = net.SplitHostPort(r.RemoteAddr)
212+
clientAddress, _, err = net.SplitHostPort(remoteAddr)
207213
if err != nil {
208-
clientAddress = r.RemoteAddr
214+
clientAddress = remoteAddr
209215
}
210216
h.accessLogger.Printf("%4s %d %15s %s", r.Method, code, clientAddress, r.URL.Path)
211217
}

server/http_test.go

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,19 @@ import (
88
"encoding/json"
99
"fmt"
1010
"io"
11+
"log"
1112
"math"
1213
"net/http"
1314
"net/http/httptest"
1415
"net/url"
1516
"os"
17+
"strings"
1618
"sync"
1719
"testing"
1820

1921
"github.com/buchgr/bazel-remote/v2/cache"
2022
"github.com/buchgr/bazel-remote/v2/cache/disk"
21-
"github.com/buchgr/bazel-remote/v2/utils"
23+
testutils "github.com/buchgr/bazel-remote/v2/utils"
2224

2325
pb "github.com/buchgr/bazel-remote/v2/genproto/build/bazel/remote/execution/v2"
2426
"google.golang.org/protobuf/proto"
@@ -564,3 +566,35 @@ func TestManglingACKeys(t *testing.T) {
564566
t.Errorf("Wrong status code, expected %d, got %d", http.StatusNotFound, statusCode)
565567
}
566568
}
569+
570+
func TestResponseLog(t *testing.T) {
571+
cacheDir := testutils.TempDir(t)
572+
defer func() { _ = os.RemoveAll(cacheDir) }()
573+
574+
blobSize := int64(1024)
575+
576+
data, hash := testutils.RandomDataAndHash(blobSize)
577+
578+
// Add some overhead for likely CAS blob storage expansion.
579+
cacheSize := blobSize*2 + disk.BlockSize
580+
581+
c, err := disk.New(cacheDir, cacheSize, disk.WithAccessLogger(testutils.NewSilentLogger()))
582+
if err != nil {
583+
t.Fatal(err)
584+
}
585+
var w bytes.Buffer
586+
logger := log.New(&w, "bz-remote", 0)
587+
h := NewHTTPCache(c, logger, testutils.NewSilentLogger(), true, false, false, false, "", "", math.MaxInt64)
588+
589+
rr := httptest.NewRecorder()
590+
handler := http.HandlerFunc(h.CacheHandler)
591+
592+
pr := httptest.NewRequest("PUT", "/cas/"+hash, bytes.NewReader(data))
593+
pr.Header.Add("X-Forwarded-For", "10.11.12.13")
594+
handler.ServeHTTP(rr, pr)
595+
596+
logLine := w.String()
597+
if !strings.Contains(logLine, "10.11.12.13") {
598+
t.Errorf("expected logged IP to use X-Forwarded-For header but saw `%s`", logLine)
599+
}
600+
}

0 commit comments

Comments
 (0)