code: func KeepAliveHandler(roundTripper soap.RoundTripper, idleTime time.Duration, handler func(soap.RoundTripper) error) soap.RoundTripper {
  	k := &keepAlive{
  		roundTripper:  roundTripper,
  		idleTime:      idleTime,
  		notifyRequest: make(chan struct{}),
  	}
  
  	k.keepAlive = handler
  
  	return k
  }
docs: // KeepAliveHandler works as KeepAlive() does, but the handler param can decide how to handle errors.
  // For example, if connectivity to ESX/VC is down long enough for a session to expire, a handler can choose to
  // Login() on a types.NotAuthenticated error.  If handler returns non-nil, the keep alive go routine will be stopped.