mvputil

package
v0.3.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 29, 2024 License: MIT Imports: 10 Imported by: 1

Documentation

Index

Examples

Constants

View Source
const (
	XForwardedFor   = "X-Forwarded-For"
	XForwardedHost  = "X-Forwarded-Host"
	XForwardedProto = "X-Forwarded-Proto"
)

Variables

View Source
var (
	LoopbackIPv4CIRD = MustParseCIDR("127.0.0.1/32")
	LoopbackIPv6CIRD = MustParseCIDR("::1/128")
	AnyIPv4CIRD      = MustParseCIDR("0.0.0.0/0")
	AnyIPv6CIRD      = MustParseCIDR("::0/0")

	IPForwardingFromNoone     = &IPForwarding{}
	IPForwardingFromAnyone    = &IPForwarding{[]*net.IPNet{LoopbackIPv4CIRD, LoopbackIPv6CIRD}}
	IPForwardingFromLocalhost = &IPForwarding{[]*net.IPNet{LoopbackIPv4CIRD, LoopbackIPv6CIRD}}
)

Functions

func BumpMax

func BumpMax[T Ordered](d *T, s T)

func BumpMaxIfNonZero

func BumpMaxIfNonZero[T Ordered](d *T, s T)

func BumpMaxTime

func BumpMaxTime(d *time.Time, s time.Time)

func BumpMin

func BumpMin[T Ordered](d *T, s T)

func BumpMinIfNonZero

func BumpMinIfNonZero[T Ordered](d *T, s T)

func BumpMinTime

func BumpMinTime(d *time.Time, s time.Time)

func CopyURLValues added in v0.2.2

func CopyURLValues(dest, src url.Values)

func EnumChunks

func EnumChunks[T any](list []T, chunkSize int, f func(chunk []T))

func FilterFunc added in v0.2.2

func FilterFunc[S ~[]E, E comparable](s S, f func(E) bool) S

func FilterOut added in v0.2.2

func FilterOut[S ~[]E, E comparable](s S, undesired E) S

func FuncName

func FuncName(f interface{}) string

func IsValidDomain added in v0.2.2

func IsValidDomain(domain string) bool

func IsValidEmail added in v0.2.2

func IsValidEmail(email string) bool

func MustParseCIDR added in v0.2.2

func MustParseCIDR(s string) *net.IPNet

func MustParseCIDRs added in v0.2.2

func MustParseCIDRs(s string) []*net.IPNet

func Prepend added in v0.2.2

func Prepend[S ~[]E, E any](s S, elems ...E) S

func PureFuncName

func PureFuncName(s string) string

func TrimPort added in v0.2.2

func TrimPort(hostport string) string

TrimPort removes :port part (if any) from the given string and returns just the hostname.

func URLWithValues added in v0.2.2

func URLWithValues(urlStr string, values url.Values) string

func VerifyBasicAuth added in v0.2.2

func VerifyBasicAuth(w http.ResponseWriter, r *http.Request, lookupUserPasswordHash func(username string) (canonicalUsername, passwordHash string)) (username string, authenticated bool)

func YesNo added in v0.2.2

func YesNo(v bool, yes, no string) string

Types

type IPForwarding added in v0.2.2

type IPForwarding struct {
	ProxyIPs []*net.IPNet
}
Example
forwardingFrom127 := &IPForwarding{
	ProxyIPs: MustParseCIDRs("127.0.0.0/8"),
}

try := func(desc string, r *http.Request) {
	fmt.Printf("\n== %s from %v via %v:\n", desc, r.RemoteAddr, strings.Join(r.Header.Values(XForwardedFor), " | "))
	fmt.Printf("IPForwardingFrom127 => ")
	fmt.Println(forwardingFrom127.FromRequest(r))
	fmt.Printf("IPForwardingFromLocalhost => ")
	fmt.Println(IPForwardingFromLocalhost.FromRequest(r))
	fmt.Printf("IPForwardingFromNoone => ")
	fmt.Println(IPForwardingFromNoone.FromRequest(r))
}

try("direct request", &http.Request{
	RemoteAddr: "127.0.0.1:23456",
	Host:       "localhost",
	Header:     http.Header{},
})

try("localhost-proxied request", &http.Request{
	RemoteAddr: "127.0.0.1:23456",
	Host:       "localhost",
	Header: http.Header{
		XForwardedFor:   {"1.2.3.4"},
		XForwardedHost:  {"example.com"},
		XForwardedProto: {"https"},
	},
})

try("remotely-proxied request", &http.Request{
	RemoteAddr: "11.22.33.44:23456",
	Host:       "localhost",
	Header: http.Header{
		XForwardedFor:   {"1.2.3.4"},
		XForwardedHost:  {"example.com"},
		XForwardedProto: {"https"},
	},
})

try("request with multiple proxies", &http.Request{
	RemoteAddr: "127.0.0.1:23456",
	Host:       "localhost",
	Header: http.Header{
		XForwardedFor:   {"1.2.3.4, 127.1.2.3"},
		XForwardedHost:  {"example.com"},
		XForwardedProto: {"https"},
	},
})

try("request with multiple proxies in several headers", &http.Request{
	RemoteAddr: "127.0.0.1:23456",
	Host:       "localhost",
	Header: http.Header{
		XForwardedFor:   {"1.2.3.4, 1.2.3.5", "1.2.3.6", "127.1.2.3"},
		XForwardedHost:  {"example.com"},
		XForwardedProto: {"https"},
	},
})
Output:

== direct request from 127.0.0.1:23456 via :
IPForwardingFrom127 => 127.0.0.1 localhost false
IPForwardingFromLocalhost => 127.0.0.1 localhost false
IPForwardingFromNoone => 127.0.0.1 localhost false

== localhost-proxied request from 127.0.0.1:23456 via 1.2.3.4:
IPForwardingFrom127 => 1.2.3.4 example.com true
IPForwardingFromLocalhost => 1.2.3.4 example.com true
IPForwardingFromNoone => 127.0.0.1 localhost false

== remotely-proxied request from 11.22.33.44:23456 via 1.2.3.4:
IPForwardingFrom127 => 11.22.33.44 localhost false
IPForwardingFromLocalhost => 11.22.33.44 localhost false
IPForwardingFromNoone => 11.22.33.44 localhost false

== request with multiple proxies from 127.0.0.1:23456 via 1.2.3.4, 127.1.2.3:
IPForwardingFrom127 => 1.2.3.4 example.com true
IPForwardingFromLocalhost => 127.1.2.3 example.com true
IPForwardingFromNoone => 127.0.0.1 localhost false

== request with multiple proxies in several headers from 127.0.0.1:23456 via 1.2.3.4, 1.2.3.5 | 1.2.3.6 | 127.1.2.3:
IPForwardingFrom127 => 1.2.3.6 example.com true
IPForwardingFromLocalhost => 127.1.2.3 example.com true
IPForwardingFromNoone => 127.0.0.1 localhost false

func (*IPForwarding) FromRequest added in v0.2.2

func (conf *IPForwarding) FromRequest(r *http.Request) (ip net.IP, host string, isTLS bool)

func (*IPForwarding) IsWhitelistedProxy added in v0.2.2

func (conf *IPForwarding) IsWhitelistedProxy(ip net.IP) bool

type Ordered

type Ordered interface {
	~int | ~int8 | ~int16 | ~int32 | ~int64 |
		~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr |
		~float32 | ~float64 |
		~string
}

TODO: use cmp.Ordered in Go.1.21

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL