info.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. package yu_proxy
  2. import (
  3. yu_strconv "gogs.qqck.cn/s/tools/strconv"
  4. "time"
  5. )
  6. // Info 单个代理信息
  7. type Info struct {
  8. // Host 代理地址,IP 或 域名
  9. Host string `json:"addr"`
  10. // Port 端口号
  11. Port int
  12. // User 认证账号密码
  13. User string `json:"user"`
  14. // Pass 认证密码
  15. Pass string `json:"pass"`
  16. // Type 0:http/https,1:socks5
  17. Type byte `json:"type"`
  18. // Timeout 过期时间,单位:秒,-1 为永不过期
  19. Timeout int64 `json:"timeout"`
  20. Domain bool // 是否由代理解析域名
  21. }
  22. func NewInfo() (t *Info) {
  23. t = &Info{}
  24. t.SetHttp()
  25. t.SetTimeout(-1)
  26. t.SetDomain(true)
  27. return
  28. }
  29. // SetHost
  30. //
  31. // @Description: 设置代理地址,IP 或 域名
  32. func (t *Info) SetHost(value string) *Info {
  33. if t == nil {
  34. return t
  35. }
  36. t.Host = value
  37. return t
  38. }
  39. // SetPort
  40. //
  41. // @Description: 设置代理 端口号
  42. func (t *Info) SetPort(value int) *Info {
  43. if t == nil {
  44. return t
  45. }
  46. t.Port = value
  47. return t
  48. }
  49. // SetAuthorization
  50. //
  51. // @Description: 设置认证信息,默认:无需认证
  52. func (t *Info) SetAuthorization(user string, pass string) *Info {
  53. if t == nil {
  54. return t
  55. }
  56. t.User, t.Pass = user, pass
  57. return t
  58. }
  59. // IsAuthorization
  60. //
  61. // @Description: 代理是否需要授权
  62. func (t *Info) IsAuthorization() bool {
  63. if t == nil {
  64. return false
  65. }
  66. return t.User != "" && t.Pass != ""
  67. }
  68. // SetHttp
  69. //
  70. // @Description: 设置为 http 代理,默认:http
  71. func (t *Info) SetHttp() *Info {
  72. if t == nil {
  73. return t
  74. }
  75. t.Type = 0
  76. return t
  77. }
  78. // IsHttp
  79. //
  80. // @Description: 判断是否为 http 代理
  81. func (t *Info) IsHttp() bool {
  82. if t == nil {
  83. return false
  84. }
  85. return t.Type == 0
  86. }
  87. // SetSocks5
  88. //
  89. // @Description: 设置为 socks5 代理
  90. func (t *Info) SetSocks5() *Info {
  91. if t == nil {
  92. return t
  93. }
  94. t.Type = 1
  95. return t
  96. }
  97. // IsSocks5
  98. //
  99. // @Description: 判断是否为 socks5 代理
  100. func (t *Info) IsSocks5() bool {
  101. if t == nil {
  102. return false
  103. }
  104. return t.Type == 1
  105. }
  106. // SetTimeout
  107. //
  108. // @Description: 设置代理有效截止时间,-1 为永不过期,单位:秒,默认:-1
  109. func (t *Info) SetTimeout(timeout int64) *Info {
  110. if t == nil {
  111. return t
  112. }
  113. t.Timeout = timeout
  114. return t
  115. }
  116. // SetDomain
  117. //
  118. // @Description: 设置是否由代理解析域名,默认:true
  119. func (t *Info) SetDomain(value bool) *Info {
  120. if t == nil {
  121. return t
  122. }
  123. t.Domain = value
  124. return t
  125. }
  126. // IsTimeout
  127. //
  128. // @Description: 判断代理是否过期
  129. func (t *Info) IsTimeout() bool {
  130. if t == nil {
  131. return true
  132. }
  133. return t.Timeout != -1 && time.Now().Unix() > t.Timeout
  134. }
  135. // IsValid
  136. //
  137. // @Description: 代理信息是否有效,如需判断代理信息是否过期请调用 IsTimeout()
  138. func (t *Info) IsValid() bool {
  139. if t == nil {
  140. return false
  141. }
  142. return t.Host != "" && t.Port != 0
  143. }
  144. // Copy
  145. //
  146. // @Description: Copy一个新指针
  147. func (t *Info) Copy() (info *Info) {
  148. if t == nil {
  149. return t
  150. }
  151. info = &Info{t.Host, t.Port, t.User, t.Pass, t.Type, t.Timeout, t.Domain}
  152. return
  153. }
  154. // Encode
  155. //
  156. // @Description: 编码为"ProxyType://user:pass@host:port",例如:"http://user:pass@127.0.0.1:808"、"socks5://user:pass@127.0.0.1:808"
  157. func (t *Info) Encode() string {
  158. if t == nil {
  159. return "http://0.0.0.0:65535"
  160. }
  161. j_buf := make([]byte, 0, 64)
  162. if t.IsHttp() {
  163. j_buf = append(j_buf, "http://"...)
  164. } else if t.IsSocks5() {
  165. j_buf = append(j_buf, "socks5://"...)
  166. }
  167. if t.User != "" && t.Pass != "" {
  168. j_buf = append(j_buf, t.User...)
  169. j_buf = append(j_buf, ':')
  170. j_buf = append(j_buf, t.Pass...)
  171. j_buf = append(j_buf, '@')
  172. }
  173. j_buf = append(j_buf, t.Host...)
  174. j_buf = append(j_buf, ':')
  175. j_buf = append(j_buf, yu_strconv.FormatInt(t.Port)...)
  176. return string(j_buf)
  177. }