-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathChecker.go
126 lines (107 loc) · 2.55 KB
/
Checker.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package gotten
import (
"github.com/Hexilee/gotten/headers"
"net/http"
"net/textproto"
)
type (
CheckerFactory struct {
statusSet StatusSet
headerSet HeaderSet
}
CheckerFunc func(*http.Response) bool
Checker interface {
Check(*http.Response) bool
}
HeaderSet map[string]map[string]bool
StatusSet map[int]bool
)
func (fn CheckerFunc) Check(resp *http.Response) bool {
return fn(resp)
}
func (set HeaderSet) add(key string, values ...string) {
key = textproto.CanonicalMIMEHeaderKey(key)
for _, value := range values {
if set[key] == nil {
set[key] = map[string]bool{value: true}
} else {
set[key][value] = true
}
}
}
func (set HeaderSet) contain(key, value string) (contain bool) {
key = textproto.CanonicalMIMEHeaderKey(key)
if set[key] != nil {
_, contain = set[key][value]
}
return
}
func (set StatusSet) add(statuses ...int) {
for _, status := range statuses {
set[status] = true
}
}
func (set StatusSet) contain(status int) (contain bool) {
_, contain = set[status]
return
}
func (factory *CheckerFactory) When(key string, values ...string) *CheckerFactory {
if factory.headerSet == nil {
factory.headerSet = make(HeaderSet)
}
factory.headerSet.add(key, values...)
return factory
}
func (factory *CheckerFactory) WhenStatuses(statuses ...int) *CheckerFactory {
if factory.statusSet == nil {
factory.statusSet = make(StatusSet)
}
factory.statusSet.add(statuses...)
return factory
}
func (factory *CheckerFactory) WhenContentType(values ...string) *CheckerFactory {
return factory.When(headers.HeaderContentType, values...)
}
func (factory *CheckerFactory) statusChecker(response *http.Response) bool {
return factory.statusSet != nil && factory.statusSet.contain(response.StatusCode)
}
func (factory *CheckerFactory) headerChecker(response *http.Response) (ok bool) {
ok = true
if factory.headerSet != nil {
for key := range factory.headerSet {
value := response.Header.Get(key)
if !factory.headerSet.contain(key, value) {
ok = false
break
}
}
}
return
}
func (factory *CheckerFactory) Create() (checker CheckerFunc) {
flag := 1
if factory.statusSet != nil {
flag <<= 1
}
if factory.headerSet != nil {
flag <<= 2
}
switch flag {
case 1:
checker = Any
case 1 << 1:
checker = factory.statusChecker
case 1 << 2:
checker = factory.headerChecker
case 1 << 3:
checker = func(response *http.Response) bool {
return factory.statusChecker(response) && factory.headerChecker(response)
}
//default:
// never occur
}
return checker
}
func Any(_ *http.Response) bool {
return true
}