|
@@ -1,6 +1,7 @@
|
|
package router
|
|
package router
|
|
|
|
|
|
import (
|
|
import (
|
|
|
|
+ "net"
|
|
"net/http"
|
|
"net/http"
|
|
"regexp"
|
|
"regexp"
|
|
"strings"
|
|
"strings"
|
|
@@ -83,6 +84,17 @@ func (r *Router) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
|
|
rw.Header().Set("Server", "imgproxy")
|
|
rw.Header().Set("Server", "imgproxy")
|
|
rw.Header().Set(xRequestIDHeader, reqID)
|
|
rw.Header().Set(xRequestIDHeader, reqID)
|
|
|
|
|
|
|
|
+ if ip := req.Header.Get("CF-Connecting-IP"); len(ip) != 0 {
|
|
|
|
+ replaceRemoteAddr(req, ip)
|
|
|
|
+ } else if ip := req.Header.Get("X-Forwarded-For"); len(ip) != 0 {
|
|
|
|
+ if index := strings.Index(ip, ","); index > 0 {
|
|
|
|
+ ip = ip[:index]
|
|
|
|
+ }
|
|
|
|
+ replaceRemoteAddr(req, ip)
|
|
|
|
+ } else if ip := req.Header.Get("X-Real-IP"); len(ip) != 0 {
|
|
|
|
+ replaceRemoteAddr(req, ip)
|
|
|
|
+ }
|
|
|
|
+
|
|
defer func() {
|
|
defer func() {
|
|
if rerr := recover(); rerr != nil {
|
|
if rerr := recover(); rerr != nil {
|
|
if err, ok := rerr.(error); ok && r.PanicHandler != nil {
|
|
if err, ok := rerr.(error); ok && r.PanicHandler != nil {
|
|
@@ -106,3 +118,12 @@ func (r *Router) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
|
|
|
|
|
|
rw.WriteHeader(404)
|
|
rw.WriteHeader(404)
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+func replaceRemoteAddr(req *http.Request, ip string) {
|
|
|
|
+ _, port, err := net.SplitHostPort(req.RemoteAddr)
|
|
|
|
+ if err != nil {
|
|
|
|
+ port = "80"
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ req.RemoteAddr = net.JoinHostPort(strings.TrimSpace(ip), port)
|
|
|
|
+}
|