- The Go Programming Language (original) (raw)

Source file blog/context/userip/userip.go

 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