From c79a9ee36d6dab1d161eac51ddfb81a7b556eaed Mon Sep 17 00:00:00 2001 From: nadoo <287492+nadoo@users.noreply.github.com> Date: Fri, 14 Jul 2017 20:52:49 +0800 Subject: [PATCH] fixed a bug in proxy check which may leads to socket error: too many open files. --- main.go | 36 ++++++++++++++---------------------- proxy.go | 4 ++-- redir.go | 2 -- strategy.go | 4 ++++ 4 files changed, 20 insertions(+), 26 deletions(-) diff --git a/main.go b/main.go index 0e7bbad..b214cfe 100644 --- a/main.go +++ b/main.go @@ -124,33 +124,25 @@ func main() { } var forwarders []Proxy - if len(flags.Forward) > 0 { + for _, chain := range flags.Forward { + var forward Proxy var err error - for _, chain := range flags.Forward { - var forward Proxy - for _, url := range strings.Split(chain, ",") { - forward, err = ProxyFromURL(url, forward) - if err != nil { - log.Fatal(err) - } - } - forwarders = append(forwarders, forward) - } - } - - for _, forward := range forwarders { - go check(forward, config.CheckSite, config.CheckDuration) - } - - if len(flags.Listen) > 0 { - for _, listen := range flags.Listen { - local, err := ProxyFromURL(listen, forwarders...) + for _, url := range strings.Split(chain, ",") { + forward, err = ProxyFromURL(url, forward) if err != nil { log.Fatal(err) } - - go local.ListenAndServe() } + forwarders = append(forwarders, forward) + } + + for _, listen := range flags.Listen { + local, err := ProxyFromURL(listen, forwarders...) + if err != nil { + log.Fatal(err) + } + + go local.ListenAndServe() } sigCh := make(chan os.Signal, 1) diff --git a/proxy.go b/proxy.go index 5c45b48..0c5c8c8 100644 --- a/proxy.go +++ b/proxy.go @@ -88,7 +88,7 @@ func ProxyFromURL(s string, forwarders ...Proxy) (Proxy, error) { } var proxy Proxy - if forwarders == nil || len(forwarders) == 0 { + if len(forwarders) == 0 { proxy = newProxy(addr, Direct) } else if len(forwarders) == 1 { proxy = newProxy(addr, forwarders[0]) @@ -144,7 +144,7 @@ func check(p Proxy, target string, duration int) { p.SetEnable(false) continue } - defer c.Close() + c.Close() p.SetEnable(true) logf("proxy %s check ok.", p.Addr()) diff --git a/redir.go b/redir.go index aad33ed..2193ef0 100644 --- a/redir.go +++ b/redir.go @@ -64,8 +64,6 @@ func (s *redir) ListenAndServe() { defer rc.Close() logf("proxy-redir %s <-> %s", c.RemoteAddr(), tgt) - // go io.Copy(rc, c) - // io.Copy(c, rc) _, _, err = relay(c, rc) if err != nil { diff --git a/strategy.go b/strategy.go index 5dc1706..c094716 100644 --- a/strategy.go +++ b/strategy.go @@ -20,6 +20,10 @@ func newStrategyProxy(addr string, forwarders []Proxy) Proxy { return newProxy(addr, forwarders[0]) } + for _, forward := range forwarders { + go check(forward, config.CheckSite, config.CheckDuration) + } + return &strategyProxy{addr: addr, forwarders: forwarders} }