- The Go Programming Language (original) (raw)
1
2
3
4
5
6
7
8 package userip
9
10 import (
11 "context"
12 "fmt"
13 "net"
14 "net/http"
15 )
16
17
18 func FromRequest(req *http.Request) (net.IP, error) {
19 ip, _, err := net.SplitHostPort(req.RemoteAddr)
20 if err != nil {
21 return nil, fmt.Errorf("userip: %q is not IP:port", req.RemoteAddr)
22 }
23
24 userIP := net.ParseIP(ip)
25 if userIP == nil {
26 return nil, fmt.Errorf("userip: %q is not IP:port", req.RemoteAddr)
27 }
28 return userIP, nil
29 }
30
31
32
33 type key int
34
35
36
37
38 const userIPKey key = 0
39
40
41 func NewContext(ctx context.Context, userIP net.IP) context.Context {
42 return context.WithValue(ctx, userIPKey, userIP)
43 }
44
45
46 func FromContext(ctx context.Context) (net.IP, bool) {
47
48
49 userIP, ok := ctx.Value(userIPKey).(net.IP)
50 return userIP, ok
51 }
52
View as plain text