123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- 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)
- }
|