mirror of
https://github.com/nadoo/glider.git
synced 2025-02-23 17:35:40 +08:00
fixed a bug in strategy.go which may leads to infinite recursion in the condition of all remote proxy disabled.
This commit is contained in:
parent
1f13a8d1e8
commit
0d01e8a4eb
@ -5,11 +5,6 @@ glider is a forward proxy with several protocols support.
|
|||||||
|
|
||||||
go get -u github.com/nadoo/glider
|
go get -u github.com/nadoo/glider
|
||||||
|
|
||||||
## Build
|
|
||||||
|
|
||||||
cd $GOPATH/src/github.com/nadoo/glider
|
|
||||||
go build
|
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
```bash
|
```bash
|
||||||
glider v0.1 usage:
|
glider v0.1 usage:
|
||||||
|
11
dnstun.go
11
dnstun.go
@ -23,19 +23,18 @@ func DNSTunProxy(addr, raddr string, upProxy Proxy) (Proxy, error) {
|
|||||||
return s, nil
|
return s, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListenAndServe redirected requests as a server.
|
// ListenAndServe .
|
||||||
func (s *dnstun) ListenAndServe() {
|
func (s *dnstun) ListenAndServe() {
|
||||||
l, err := net.ListenPacket("udp", s.addr)
|
l, err := net.ListenPacket("udp", s.addr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logf("failed to listen on %s: %v", s.addr, err)
|
logf("failed to listen on %s: %v", s.addr, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
defer l.Close()
|
||||||
|
|
||||||
logf("listening UDP on %s", s.addr)
|
logf("listening UDP on %s", s.addr)
|
||||||
|
|
||||||
for {
|
for {
|
||||||
defer l.Close()
|
|
||||||
|
|
||||||
data := make([]byte, 512)
|
data := make([]byte, 512)
|
||||||
n, clientAddr, err := l.ReadFrom(data)
|
n, clientAddr, err := l.ReadFrom(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -60,7 +59,7 @@ func (s *dnstun) ListenAndServe() {
|
|||||||
rc.Write(length)
|
rc.Write(length)
|
||||||
rc.Write(data)
|
rc.Write(data)
|
||||||
|
|
||||||
buf, err := ioutil.ReadAll(rc)
|
resp, err := ioutil.ReadAll(rc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logf("error in ioutil.ReadAll: %s\n", err)
|
logf("error in ioutil.ReadAll: %s\n", err)
|
||||||
return
|
return
|
||||||
@ -68,8 +67,8 @@ func (s *dnstun) ListenAndServe() {
|
|||||||
|
|
||||||
// length is not needed in udp dns response. (2 bytes)
|
// length is not needed in udp dns response. (2 bytes)
|
||||||
// SEE RFC1035, section 4.2.2 TCP: The message is prefixed with a two byte length field which gives the message length, excluding the two byte length field.
|
// SEE RFC1035, section 4.2.2 TCP: The message is prefixed with a two byte length field which gives the message length, excluding the two byte length field.
|
||||||
if len(buf) > 2 {
|
if len(resp) > 2 {
|
||||||
msg := buf[2:]
|
msg := resp[2:]
|
||||||
_, err = l.WriteTo(msg, clientAddr)
|
_, err = l.WriteTo(msg, clientAddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logf("error in local write: %s\n", err)
|
logf("error in local write: %s\n", err)
|
||||||
|
1
http.go
1
http.go
@ -38,6 +38,7 @@ func (s *httpproxy) ListenAndServe() {
|
|||||||
logf("failed to listen on %s: %v", s.addr, err)
|
logf("failed to listen on %s: %v", s.addr, err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
defer l.Close()
|
||||||
|
|
||||||
logf("listening TCP on %s", s.addr)
|
logf("listening TCP on %s", s.addr)
|
||||||
|
|
||||||
|
9
proxy.go
9
proxy.go
@ -141,14 +141,15 @@ func check(p Proxy, target string, duration int) {
|
|||||||
startTime := time.Now()
|
startTime := time.Now()
|
||||||
c, err := p.Dial("tcp", target)
|
c, err := p.Dial("tcp", target)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logf("proxy-check %s -> %s, error: %s, set to disabled.", p.Addr(), config.CheckSite, err)
|
logf("proxy-check %s -> %s, set to DISABLED. error: %s", p.Addr(), config.CheckSite, err)
|
||||||
p.SetEnable(false)
|
p.SetEnable(false)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
dialTime := time.Since(startTime)
|
|
||||||
c.Close()
|
c.Close()
|
||||||
|
|
||||||
p.SetEnable(true)
|
p.SetEnable(true)
|
||||||
logf("proxy-check: %s -> %s, connect time: %d", p.Addr(), config.CheckSite, dialTime)
|
|
||||||
|
// TODO: choose the fastest proxy.
|
||||||
|
dialTime := time.Since(startTime)
|
||||||
|
logf("proxy-check: %s -> %s, connect time: %s", p.Addr(), config.CheckSite, dialTime.String())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
12
strategy.go
12
strategy.go
@ -38,9 +38,17 @@ func (p *strategyProxy) NextProxy() Proxy {
|
|||||||
return p.forwarders[0]
|
return p.forwarders[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
found := false
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
p.idx = (p.idx + 1) % n
|
p.idx = (p.idx + 1) % n
|
||||||
if !p.forwarders[p.idx].Enabled() {
|
if p.forwarders[p.idx].Enabled() {
|
||||||
return p.NextProxy()
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !found {
|
||||||
|
logf("NO AVALIABLE PROXY FOUND! please check your network or proxy server settings.")
|
||||||
}
|
}
|
||||||
|
|
||||||
return p.forwarders[p.idx]
|
return p.forwarders[p.idx]
|
||||||
|
Loading…
Reference in New Issue
Block a user