mirror of
				https://github.com/nadoo/glider.git
				synced 2025-11-04 07:42:38 +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