func (h *RequestHandler) serveWebSocket(iter route.EndpointIterator) error { var err error var connection net.Conn client, _, err := h.hijack() if err != nil { return err } defer func() { client.Close() if connection != nil { connection.Close() } }() retry := 0 for { endpoint := iter.Next() if endpoint == nil { err = NoEndpointsAvailable h.HandleBadGateway(err, h.request) return err } connection, err = net.DialTimeout("tcp", endpoint.CanonicalAddr(), 5*time.Second) if err == nil { h.setupRequest(endpoint) break } iter.EndpointFailed() h.logger.Error("websocket-connection-failed", err) retry++ if retry == MaxRetries { return err } } if connection != nil { err = h.request.Write(connection) if err != nil { return err } forwardIO(client, connection) } return nil }
func loadBalance(lb route.EndpointIterator) { e := lb.Next() lb.PreRequest(e) lb.PostRequest(e) }