...
1 package request
2
3 import (
4 "errors"
5 "net/http"
6 "strings"
7 )
8
9
10 var (
11 ErrNoTokenInRequest = errors.New("no token present in request")
12 )
13
14
15
16
17 type Extractor interface {
18 ExtractToken(*http.Request) (string, error)
19 }
20
21
22
23 type HeaderExtractor []string
24
25 func (e HeaderExtractor) ExtractToken(req *http.Request) (string, error) {
26
27 for _, header := range e {
28 if ah := req.Header.Get(header); ah != "" {
29 return ah, nil
30 }
31 }
32 return "", ErrNoTokenInRequest
33 }
34
35
36
37
38 type ArgumentExtractor []string
39
40 func (e ArgumentExtractor) ExtractToken(req *http.Request) (string, error) {
41
42 req.ParseMultipartForm(10e6)
43
44
45 for _, arg := range e {
46 if ah := req.Form.Get(arg); ah != "" {
47 return ah, nil
48 }
49 }
50
51 return "", ErrNoTokenInRequest
52 }
53
54
55 type MultiExtractor []Extractor
56
57 func (e MultiExtractor) ExtractToken(req *http.Request) (string, error) {
58
59 for _, extractor := range e {
60 if tok, err := extractor.ExtractToken(req); tok != "" {
61 return tok, nil
62 } else if !errors.Is(err, ErrNoTokenInRequest) {
63 return "", err
64 }
65 }
66 return "", ErrNoTokenInRequest
67 }
68
69
70
71 type PostExtractionFilter struct {
72 Extractor
73 Filter func(string) (string, error)
74 }
75
76 func (e *PostExtractionFilter) ExtractToken(req *http.Request) (string, error) {
77 if tok, err := e.Extractor.ExtractToken(req); tok != "" {
78 return e.Filter(tok)
79 } else {
80 return "", err
81 }
82 }
83
84
85
86
87 type BearerExtractor struct{}
88
89 func (e BearerExtractor) ExtractToken(req *http.Request) (string, error) {
90 tokenHeader := req.Header.Get("Authorization")
91
92
93 if tokenHeader == "" || !strings.HasPrefix(strings.ToLower(tokenHeader), "bearer ") {
94 return "", ErrNoTokenInRequest
95 }
96 return tokenHeader[7:], nil
97 }
98
View as plain text