From 0d01e8a4eb784f2ac3431ec046776052ddda18d4 Mon Sep 17 00:00:00 2001 From: nadoo <287492+nadoo@users.noreply.github.com> Date: Sun, 16 Jul 2017 12:16:50 +0800 Subject: [PATCH] fixed a bug in strategy.go which may leads to infinite recursion in the condition of all remote proxy disabled. --- README.md | 5 ----- dnstun.go | 11 +++++------ http.go | 1 + proxy.go | 9 +++++---- strategy.go | 14 +++++++++++--- 5 files changed, 22 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 453da30..6d0a37c 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,6 @@ glider is a forward proxy with several protocols support. go get -u github.com/nadoo/glider -## Build - - cd $GOPATH/src/github.com/nadoo/glider - go build - ## Usage ```bash glider v0.1 usage: diff --git a/dnstun.go b/dnstun.go index f966878..8fa4594 100644 --- a/dnstun.go +++ b/dnstun.go @@ -23,19 +23,18 @@ func DNSTunProxy(addr, raddr string, upProxy Proxy) (Proxy, error) { return s, nil } -// ListenAndServe redirected requests as a server. +// ListenAndServe . func (s *dnstun) ListenAndServe() { l, err := net.ListenPacket("udp", s.addr) if err != nil { logf("failed to listen on %s: %v", s.addr, err) return } + defer l.Close() logf("listening UDP on %s", s.addr) for { - defer l.Close() - data := make([]byte, 512) n, clientAddr, err := l.ReadFrom(data) if err != nil { @@ -60,7 +59,7 @@ func (s *dnstun) ListenAndServe() { rc.Write(length) rc.Write(data) - buf, err := ioutil.ReadAll(rc) + resp, err := ioutil.ReadAll(rc) if err != nil { logf("error in ioutil.ReadAll: %s\n", err) return @@ -68,8 +67,8 @@ func (s *dnstun) ListenAndServe() { // 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. - if len(buf) > 2 { - msg := buf[2:] + if len(resp) > 2 { + msg := resp[2:] _, err = l.WriteTo(msg, clientAddr) if err != nil { logf("error in local write: %s\n", err) diff --git a/http.go b/http.go index d7134b0..b42766d 100644 --- a/http.go +++ b/http.go @@ -38,6 +38,7 @@ func (s *httpproxy) ListenAndServe() { logf("failed to listen on %s: %v", s.addr, err) return } + defer l.Close() logf("listening TCP on %s", s.addr) diff --git a/proxy.go b/proxy.go index ba30ca9..c9983c5 100644 --- a/proxy.go +++ b/proxy.go @@ -141,14 +141,15 @@ func check(p Proxy, target string, duration int) { startTime := time.Now() c, err := p.Dial("tcp", target) 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) continue } - dialTime := time.Since(startTime) c.Close() - 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()) } } diff --git a/strategy.go b/strategy.go index e09541e..aa8eaa7 100644 --- a/strategy.go +++ b/strategy.go @@ -38,9 +38,17 @@ func (p *strategyProxy) NextProxy() Proxy { return p.forwarders[0] } - p.idx = (p.idx + 1) % n - if !p.forwarders[p.idx].Enabled() { - return p.NextProxy() + found := false + for i := 0; i < n; i++ { + p.idx = (p.idx + 1) % n + if p.forwarders[p.idx].Enabled() { + found = true + break + } + } + + if !found { + logf("NO AVALIABLE PROXY FOUND! please check your network or proxy server settings.") } return p.forwarders[p.idx]