diff options
author | Runxi Yu <me@runxiyu.org> | 2025-03-22 20:55:25 +0800 |
---|---|---|
committer | Runxi Yu <me@runxiyu.org> | 2025-03-22 20:55:25 +0800 |
commit | 2c71f995b73774d5b910d49a024e51c4ac902f3a (patch) | |
tree | 34642fce293e62352e6b75aa92217afaae7319a9 | |
parent | Configurable timeout (diff) | |
download | forge-2c71f995b73774d5b910d49a024e51c4ac902f3a.tar.gz forge-2c71f995b73774d5b910d49a024e51c4ac902f3a.tar.zst forge-2c71f995b73774d5b910d49a024e51c4ac902f3a.zip |
Support X-Forwarded-For for reverse proxies
-rw-r--r-- | config.go | 1 | ||||
-rw-r--r-- | forge.scfg | 9 | ||||
-rw-r--r-- | http_server.go | 13 |
3 files changed, 21 insertions, 2 deletions
@@ -24,6 +24,7 @@ var config struct { ReadTimeout uint `scfg:"read_timeout"` WriteTimeout uint `scfg:"write_timeout"` IdleTimeout uint `scfg:"idle_timeout"` + ReverseProxy bool `scfg:"reverse_proxy"` } `scfg:"http"` Hooks struct { Socket string `scfg:"socket"` @@ -14,9 +14,16 @@ http { # What is the canonical URL of the web root? root https://forge.example.org + # General HTTP server context timeout settings. It's recommended to + # set them slightly higher than usual as Git operations over large + # repos may take a long time. read_timeout 120 - write_timeout 120 + write_timeout 1800 idle_timeout 120 + + # Are we running behind a reverse proxy? If so, we will trust + # X-Forwarded-For headers. + reverse_proxy true } irc { diff --git a/http_server.go b/http_server.go index c86dae6..6531748 100644 --- a/http_server.go +++ b/http_server.go @@ -16,7 +16,18 @@ import ( type forgeHTTPRouter struct{} func (router *forgeHTTPRouter) ServeHTTP(writer http.ResponseWriter, request *http.Request) { - clog.Info("Incoming HTTP: " + request.RemoteAddr + " " + request.Method + " " + request.RequestURI) + var remoteAddr string + if config.HTTP.ReverseProxy { + remoteAddrs, ok := request.Header["X-Forwarded-For"] + if ok && len(remoteAddrs) == 1 { + remoteAddr = remoteAddrs[0] + } else { + remoteAddr = request.RemoteAddr + } + } else { + remoteAddr = request.RemoteAddr + } + clog.Info("Incoming HTTP: " + remoteAddr + " " + request.Method + " " + request.RequestURI) var segments []string var err error |