/
errors.go
103 lines (86 loc) · 2.02 KB
/
errors.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
/*
* @Author: thepoy
* @Email: 2021-11-05 12:11:41
* @File Name: errors.go
* @Created: 2021-11-05 12:11:41
* @Modified: 2021-11-07 13:20:59
*/
package proxy
import (
"fmt"
"regexp"
"sort"
"strings"
)
type ErrCode uint8
const (
ErrWrongFormatCode ErrCode = iota
ErrUnknownProtocolCode
ErrProxyExpiredCode
ErrOnlyOneProxyIPCode
ErrUnkownProxyIPCode
ErrIPOrPortIsNullCode
ErrEmptyProxyPoolCode
ErrUnableToConnectCode
ErrInvalidProxyCode
)
func (ec ErrCode) String() string {
return fmt.Sprintf("proxy error [ %d ]", ec)
}
type ProxyErr struct {
Code ErrCode
Args map[string]string
Msg string
}
func (pe ProxyErr) Error() string {
var s strings.Builder
s.WriteString(pe.Code.String())
if len(pe.Msg) > 0 || len(pe.Args) > 0 {
s.WriteByte(' ')
}
if pe.Msg != "" {
s.WriteString("err=")
s.WriteString(pe.Msg)
s.WriteByte(',')
s.WriteByte(' ')
}
keys := make([]string, 0, len(pe.Args))
for k := range pe.Args {
keys = append(keys, k)
}
sort.Strings(keys)
for i, k := range keys {
if i > 0 {
s.WriteByte(',')
s.WriteByte(' ')
}
s.WriteString(k)
s.WriteByte('=')
s.WriteString(pe.Args[k])
}
return s.String()
}
func IsProxyInvalid(err error) (string, bool) {
// TODO: http err可以处理了,但socks err因为不是我们定义的,所以尚不能处理。自定义socks,或删除socks代理
if e, ok := err.(ProxyErr); ok {
switch e.Code {
case ErrProxyExpiredCode, ErrUnableToConnectCode, ErrInvalidProxyCode:
return e.Args["proxy"], true
}
return "", false
}
if len(err.Error()) < 26 {
return "", false
}
// http proxy expired or invalid
if err.Error()[:26] == "cannot connect to proxy ip" {
re := regexp.MustCompile(`cannot connect to proxy ip \[ (.+?) \] -> .+?`)
return re.FindAllStringSubmatch(err.Error(), 1)[0][1], true
}
// socks5 proxy expired or invalid
if err.Error()[:17] == "socks connect tcp" {
re := regexp.MustCompile("socks connect tcp (.+?)->.+?")
return re.FindAllStringSubmatch(err.Error(), 1)[0][1], true
}
return "", false
}