code: func (k *Kite) RegisterHTTP(kiteURL *url.URL) (*registerResult, error) {
  	registerURL := k.getKontrolPath("register")
  
  	args := protocol.RegisterArgs{
  		URL:  kiteURL.String(),
  		Kite: k.Kite(),
  		Auth: &protocol.Auth{
  			Type: "kiteKey",
  			Key:  k.KiteKey(),
  		},
  	}
  
  	data, err := json.Marshal(&args)
  	if err != nil {
  		return nil, err
  	}
  
  	resp, err := k.Config.Client.Post(registerURL, "application/json", bytes.NewReader(data))
  	if err != nil {
  		return nil, err
  	}
  	defer resp.Body.Close()
  
  	var rr protocol.RegisterResult
  	if err := json.NewDecoder(resp.Body).Decode(&rr); err != nil {
  		return nil, err
  	}
  
  	if rr.Error != "" {
  		return nil, errors.New(rr.Error)
  	}
  
  	if rr.HeartbeatInterval == 0 {
  		return nil, errors.New("heartbeat interval cannot be zero")
  	}
  
  	parsed, err := url.Parse(rr.URL)
  	if err != nil {
  		k.Log.Error("Cannot parse registered URL: %s", err.Error())
  	}
  
  	heartbeat := time.Duration(rr.HeartbeatInterval) * time.Second
  
  	k.Log.Info("Registered (via HTTP) with URL: '%s' and HeartBeat interval: '%s'",
  		rr.URL, heartbeat)
  
  	go k.sendHeartbeats(heartbeat, kiteURL)
  
  	k.callOnRegisterHandlers(&rr)
  
  	return &registerResult{parsed}, nil
  }
docs: // RegisterHTTP registers current Kite to Kontrol. After registration other Kites
  // can find it via GetKites() or WatchKites() method. It registers again if
  // connection to kontrol is lost.