func (l *HttpLocation) copyRequest(req *http.Request, body netutils.MultiReader, endpoint endpoint.Endpoint) *http.Request { outReq := new(http.Request) *outReq = *req // includes shallow copies of maps, but we handle this below // Set the body to the enhanced body that can be re-read multiple times and buffered to disk outReq.Body = body endpointURL := endpoint.GetUrl() outReq.URL.Scheme = endpointURL.Scheme outReq.URL.Host = endpointURL.Host // workaround for https://github.com/golang/go/issues/10433 outReq.URL.Opaque = mergeStartingSlashes(req.RequestURI) // raw query is already included in RequestURI, so ignore it to avoid dupes outReq.URL.RawQuery = "" outReq.Proto = "HTTP/1.1" outReq.ProtoMajor = 1 outReq.ProtoMinor = 1 // Overwrite close flag so we can keep persistent connection for the backend servers outReq.Close = false outReq.Header = make(http.Header) netutils.CopyHeaders(outReq.Header, req.Header) return outReq }
func hasAttempted(req request.Request, endpoint endpoint.Endpoint) bool { for _, a := range req.GetAttempts() { if a.GetEndpoint().GetId() == endpoint.GetId() { return true } } return false }
func (r *RoundRobin) RemoveEndpoint(endpoint endpoint.Endpoint) error { r.mutex.Lock() defer r.mutex.Unlock() e, index := r.findEndpointByUrl(endpoint.GetUrl()) if e == nil { return fmt.Errorf("Endpoint not found") } r.endpoints = append(r.endpoints[:index], r.endpoints[index+1:]...) r.resetState() return nil }
// In case if endpoint is already present in the load balancer, returns error func (r *RoundRobin) AddEndpointWithOptions(endpoint endpoint.Endpoint, options EndpointOptions) error { r.mutex.Lock() defer r.mutex.Unlock() if endpoint == nil { return fmt.Errorf("Endpoint can't be nil") } if e, _ := r.findEndpointByUrl(endpoint.GetUrl()); e != nil { return fmt.Errorf("Endpoint already exists") } we, err := r.newWeightedEndpoint(endpoint, options) if err != nil { return err } r.endpoints = append(r.endpoints, we) r.resetState() return nil }