package yu_proxy import ( yu_strconv "gogs.qqck.cn/s/tools/strconv" "time" ) // Info 单个代理信息 type Info struct { // Host 代理地址,IP 或 域名 Host string `json:"addr"` // Port 端口号 Port int // User 认证账号密码 User string `json:"user"` // Pass 认证密码 Pass string `json:"pass"` // Type 0:http/https,1:socks5 Type byte `json:"type"` // Timeout 过期时间,单位:秒,-1 为永不过期 Timeout int64 `json:"timeout"` Domain bool // 是否由代理解析域名 } func NewInfo() (t *Info) { t = &Info{} t.SetHttp() t.SetTimeout(-1) t.SetDomain(true) return } // SetHost // // @Description: 设置代理地址,IP 或 域名 func (t *Info) SetHost(value string) *Info { if t == nil { return t } t.Host = value return t } // SetPort // // @Description: 设置代理 端口号 func (t *Info) SetPort(value int) *Info { if t == nil { return t } t.Port = value return t } // SetAuthorization // // @Description: 设置认证信息,默认:无需认证 func (t *Info) SetAuthorization(user string, pass string) *Info { if t == nil { return t } t.User, t.Pass = user, pass return t } // IsAuthorization // // @Description: 代理是否需要授权 func (t *Info) IsAuthorization() bool { if t == nil { return false } return t.User != "" && t.Pass != "" } // SetHttp // // @Description: 设置为 http 代理,默认:http func (t *Info) SetHttp() *Info { if t == nil { return t } t.Type = 0 return t } // IsHttp // // @Description: 判断是否为 http 代理 func (t *Info) IsHttp() bool { if t == nil { return false } return t.Type == 0 } // SetSocks5 // // @Description: 设置为 socks5 代理 func (t *Info) SetSocks5() *Info { if t == nil { return t } t.Type = 1 return t } // IsSocks5 // // @Description: 判断是否为 socks5 代理 func (t *Info) IsSocks5() bool { if t == nil { return false } return t.Type == 1 } // SetTimeout // // @Description: 设置代理有效截止时间,-1 为永不过期,单位:秒,默认:-1 func (t *Info) SetTimeout(timeout int64) *Info { if t == nil { return t } t.Timeout = timeout return t } // SetDomain // // @Description: 设置是否由代理解析域名,默认:true func (t *Info) SetDomain(value bool) *Info { if t == nil { return t } t.Domain = value return t } // IsTimeout // // @Description: 判断代理是否过期 func (t *Info) IsTimeout() bool { if t == nil { return true } return t.Timeout != -1 && time.Now().Unix() > t.Timeout } // IsValid // // @Description: 代理信息是否有效,如需判断代理信息是否过期请调用 IsTimeout() func (t *Info) IsValid() bool { if t == nil { return false } return t.Host != "" && t.Port != 0 } // Copy // // @Description: Copy一个新指针 func (t *Info) Copy() (info *Info) { if t == nil { return t } info = &Info{t.Host, t.Port, t.User, t.Pass, t.Type, t.Timeout, t.Domain} return } // Encode // // @Description: 编码为"ProxyType://user:pass@host:port",例如:"http://user:pass@127.0.0.1:808"、"socks5://user:pass@127.0.0.1:808" func (t *Info) Encode() string { if t == nil { return "http://0.0.0.0:65535" } j_buf := make([]byte, 0, 64) if t.IsHttp() { j_buf = append(j_buf, "http://"...) } else if t.IsSocks5() { j_buf = append(j_buf, "socks5://"...) } if t.User != "" && t.Pass != "" { j_buf = append(j_buf, t.User...) j_buf = append(j_buf, ':') j_buf = append(j_buf, t.Pass...) j_buf = append(j_buf, '@') } j_buf = append(j_buf, t.Host...) j_buf = append(j_buf, ':') j_buf = append(j_buf, yu_strconv.FormatInt(t.Port)...) return string(j_buf) }