64 lines
1.1 KiB
Go
64 lines
1.1 KiB
Go
package httppool
|
|
|
|
import (
|
|
"bufio"
|
|
"errors"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"rakshasa_lite/common"
|
|
"strings"
|
|
"sync"
|
|
)
|
|
|
|
type HttpPool struct {
|
|
r *bufio.Reader
|
|
f *os.File
|
|
sync.Mutex
|
|
}
|
|
|
|
func HttpPoolInit(file string) (*HttpPool, error) {
|
|
f, err := os.Open(file)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("打开http代理池文件 %s 失败", file)
|
|
}
|
|
p := &HttpPool{
|
|
r: bufio.NewReader(f),
|
|
f: f,
|
|
Mutex: sync.Mutex{},
|
|
}
|
|
if _, err = p.do_next(0); err != nil {
|
|
return nil, fmt.Errorf("无法从%s文件获取代理,错误%v", file, err)
|
|
}
|
|
return p, nil
|
|
}
|
|
func (p *HttpPool) Next() *common.Addr {
|
|
addr, _ := p.do_next(0)
|
|
return addr
|
|
}
|
|
func (p *HttpPool) do_next(n int) (*common.Addr, error) {
|
|
if n > 100 {
|
|
return nil, errors.New("重试错误次数过多")
|
|
}
|
|
p.Lock()
|
|
line, err := p.r.ReadString(10)
|
|
if err == io.EOF {
|
|
p.f.Seek(0, 0)
|
|
p.r.Reset(p.f)
|
|
p.Unlock()
|
|
return p.do_next(n + 1)
|
|
}
|
|
p.Unlock()
|
|
line = strings.TrimRight(line, "\n")
|
|
line = strings.TrimRight(line, "\r")
|
|
|
|
if len(line) == 0 {
|
|
return p.do_next(n + 1)
|
|
}
|
|
addr, err := common.ParseAddr(line)
|
|
if err != nil {
|
|
return p.do_next(n + 1)
|
|
}
|
|
return addr, nil
|
|
}
|