mirror of
https://github.com/harness/drone.git
synced 2025-05-04 20:23:25 +08:00
68 lines
1.7 KiB
Go
68 lines
1.7 KiB
Go
// Source: https://github.com/distribution/distribution
|
|
|
|
// Copyright 2014 https://github.com/distribution/distribution Authors
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package requestutil
|
|
|
|
import (
|
|
"net"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/rs/zerolog/log"
|
|
)
|
|
|
|
func parseIP(ipStr string) net.IP {
|
|
ip := net.ParseIP(ipStr)
|
|
if ip == nil {
|
|
log.Warn().Msgf("invalid remote IP address: %q", ipStr)
|
|
}
|
|
return ip
|
|
}
|
|
|
|
// RemoteAddr extracts the remote address of the request, taking into
|
|
// account proxy headers.
|
|
func RemoteAddr(r *http.Request) string {
|
|
if prior := r.Header.Get("X-Forwarded-For"); prior != "" {
|
|
remoteAddr, _, _ := strings.Cut(prior, ",")
|
|
remoteAddr = strings.Trim(remoteAddr, " ")
|
|
if parseIP(remoteAddr) != nil {
|
|
return remoteAddr
|
|
}
|
|
}
|
|
// X-Real-Ip is less supported, but worth checking in the
|
|
// absence of X-Forwarded-For
|
|
if realIP := r.Header.Get("X-Real-Ip"); realIP != "" {
|
|
if parseIP(realIP) != nil {
|
|
return realIP
|
|
}
|
|
}
|
|
|
|
return r.RemoteAddr
|
|
}
|
|
|
|
// RemoteIP extracts the remote IP of the request, taking into
|
|
// account proxy headers.
|
|
func RemoteIP(r *http.Request) string {
|
|
addr := RemoteAddr(r)
|
|
|
|
// Try parsing it as "IP:port"
|
|
if ip, _, err := net.SplitHostPort(addr); err == nil {
|
|
return ip
|
|
}
|
|
|
|
return addr
|
|
}
|