|  | @ -74,6 +74,16 @@ func (r RandomSelection) Select(pool UpstreamPool, request *http.Request) *Upstr | 
			
		
	
		
		
			
				
					|  |  | 	return randomHost |  |  | 	return randomHost | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | // UnmarshalCaddyfile sets up the module from Caddyfile tokens.
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | func (r *RandomSelection) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 	for d.Next() { | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 		if d.NextArg() { | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 			return d.ArgErr() | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 		} | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 	} | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 	return nil | 
			
		
	
		
		
			
				
					|  |  |  |  |  | } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | // RandomChoiceSelection is a policy that selects
 |  |  | // RandomChoiceSelection is a policy that selects
 | 
			
		
	
		
		
			
				
					|  |  | // two or more available hosts at random, then
 |  |  | // two or more available hosts at random, then
 | 
			
		
	
		
		
			
				
					|  |  | // chooses the one with the least load.
 |  |  | // chooses the one with the least load.
 | 
			
		
	
	
		
		
			
				
					|  | @ -192,6 +202,16 @@ func (LeastConnSelection) Select(pool UpstreamPool, _ *http.Request) *Upstream { | 
			
		
	
		
		
			
				
					|  |  | 	return bestHost |  |  | 	return bestHost | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | // UnmarshalCaddyfile sets up the module from Caddyfile tokens.
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | func (r *LeastConnSelection) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 	for d.Next() { | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 		if d.NextArg() { | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 			return d.ArgErr() | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 		} | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 	} | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 	return nil | 
			
		
	
		
		
			
				
					|  |  |  |  |  | } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | // RoundRobinSelection is a policy that selects
 |  |  | // RoundRobinSelection is a policy that selects
 | 
			
		
	
		
		
			
				
					|  |  | // a host based on round-robin ordering.
 |  |  | // a host based on round-robin ordering.
 | 
			
		
	
		
		
			
				
					|  |  | type RoundRobinSelection struct { |  |  | type RoundRobinSelection struct { | 
			
		
	
	
		
		
			
				
					|  | @ -222,6 +242,16 @@ func (r *RoundRobinSelection) Select(pool UpstreamPool, _ *http.Request) *Upstre | 
			
		
	
		
		
			
				
					|  |  | 	return nil |  |  | 	return nil | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | // UnmarshalCaddyfile sets up the module from Caddyfile tokens.
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | func (r *RoundRobinSelection) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 	for d.Next() { | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 		if d.NextArg() { | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 			return d.ArgErr() | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 		} | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 	} | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 	return nil | 
			
		
	
		
		
			
				
					|  |  |  |  |  | } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | // FirstSelection is a policy that selects
 |  |  | // FirstSelection is a policy that selects
 | 
			
		
	
		
		
			
				
					|  |  | // the first available host.
 |  |  | // the first available host.
 | 
			
		
	
		
		
			
				
					|  |  | type FirstSelection struct{} |  |  | type FirstSelection struct{} | 
			
		
	
	
		
		
			
				
					|  | @ -244,6 +274,16 @@ func (FirstSelection) Select(pool UpstreamPool, _ *http.Request) *Upstream { | 
			
		
	
		
		
			
				
					|  |  | 	return nil |  |  | 	return nil | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | // UnmarshalCaddyfile sets up the module from Caddyfile tokens.
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | func (r *FirstSelection) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 	for d.Next() { | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 		if d.NextArg() { | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 			return d.ArgErr() | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 		} | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 	} | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 	return nil | 
			
		
	
		
		
			
				
					|  |  |  |  |  | } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | // IPHashSelection is a policy that selects a host
 |  |  | // IPHashSelection is a policy that selects a host
 | 
			
		
	
		
		
			
				
					|  |  | // based on hashing the remote IP of the request.
 |  |  | // based on hashing the remote IP of the request.
 | 
			
		
	
		
		
			
				
					|  |  | type IPHashSelection struct{} |  |  | type IPHashSelection struct{} | 
			
		
	
	
		
		
			
				
					|  | @ -265,6 +305,16 @@ func (IPHashSelection) Select(pool UpstreamPool, req *http.Request) *Upstream { | 
			
		
	
		
		
			
				
					|  |  | 	return hostByHashing(pool, clientIP) |  |  | 	return hostByHashing(pool, clientIP) | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | // UnmarshalCaddyfile sets up the module from Caddyfile tokens.
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | func (r *IPHashSelection) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 	for d.Next() { | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 		if d.NextArg() { | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 			return d.ArgErr() | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 		} | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 	} | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 	return nil | 
			
		
	
		
		
			
				
					|  |  |  |  |  | } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | // URIHashSelection is a policy that selects a
 |  |  | // URIHashSelection is a policy that selects a
 | 
			
		
	
		
		
			
				
					|  |  | // host by hashing the request URI.
 |  |  | // host by hashing the request URI.
 | 
			
		
	
		
		
			
				
					|  |  | type URIHashSelection struct{} |  |  | type URIHashSelection struct{} | 
			
		
	
	
		
		
			
				
					|  | @ -282,6 +332,16 @@ func (URIHashSelection) Select(pool UpstreamPool, req *http.Request) *Upstream { | 
			
		
	
		
		
			
				
					|  |  | 	return hostByHashing(pool, req.RequestURI) |  |  | 	return hostByHashing(pool, req.RequestURI) | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | // UnmarshalCaddyfile sets up the module from Caddyfile tokens.
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | func (r *URIHashSelection) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 	for d.Next() { | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 		if d.NextArg() { | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 			return d.ArgErr() | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 		} | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 	} | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 	return nil | 
			
		
	
		
		
			
				
					|  |  |  |  |  | } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | // HeaderHashSelection is a policy that selects
 |  |  | // HeaderHashSelection is a policy that selects
 | 
			
		
	
		
		
			
				
					|  |  | // a host based on a given request header.
 |  |  | // a host based on a given request header.
 | 
			
		
	
		
		
			
				
					|  |  | type HeaderHashSelection struct { |  |  | type HeaderHashSelection struct { | 
			
		
	
	
		
		
			
				
					|  | @ -309,6 +369,17 @@ func (s HeaderHashSelection) Select(pool UpstreamPool, req *http.Request) *Upstr | 
			
		
	
		
		
			
				
					|  |  | 	return hostByHashing(pool, val) |  |  | 	return hostByHashing(pool, val) | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | // UnmarshalCaddyfile sets up the module from Caddyfile tokens.
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | func (r *HeaderHashSelection) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 	for d.Next() { | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 		if !d.NextArg() { | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 			return d.ArgErr() | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 		} | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 		r.Field = d.Val() | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 	} | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 	return nil | 
			
		
	
		
		
			
				
					|  |  |  |  |  | } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | // leastRequests returns the host with the
 |  |  | // leastRequests returns the host with the
 | 
			
		
	
		
		
			
				
					|  |  | // least number of active requests to it.
 |  |  | // least number of active requests to it.
 | 
			
		
	
		
		
			
				
					|  |  | // If more than one host has the same
 |  |  | // If more than one host has the same
 | 
			
		
	
	
		
		
			
				
					|  | 
 |