(interval time.Duration, kiteURL *url.URL)
| 183 | var errRegisterAgain = errors.New("register again") |
| 184 | |
| 185 | func (k *Kite) sendHeartbeats(interval time.Duration, kiteURL *url.URL) { |
| 186 | heartbeatURL := k.getKontrolPath("heartbeat") |
| 187 | |
| 188 | k.Log.Debug("Starting to send heartbeat to: %s", heartbeatURL) |
| 189 | |
| 190 | u, err := url.Parse(heartbeatURL) |
| 191 | if err != nil { |
| 192 | k.Log.Fatal("HeartbeatURL is malformed: %s", err) |
| 193 | } |
| 194 | |
| 195 | q := u.Query() |
| 196 | q.Set("id", k.Id) |
| 197 | u.RawQuery = q.Encode() |
| 198 | |
| 199 | heartbeatFunc := func() error { |
| 200 | k.Log.Debug("Sending heartbeat to %s", u) |
| 201 | |
| 202 | resp, err := k.Config.Client.Get(u.String()) |
| 203 | if err != nil { |
| 204 | return err |
| 205 | } |
| 206 | defer resp.Body.Close() |
| 207 | |
| 208 | if resp.StatusCode != http.StatusOK { |
| 209 | return fmt.Errorf("unexpected status code: %d", resp.StatusCode) |
| 210 | } |
| 211 | |
| 212 | // we are just receiving small size strings such as "pong", |
| 213 | // "registeragain" so we limit the reader to read just that |
| 214 | p, err := ioutil.ReadAll(io.LimitReader(resp.Body, 16)) |
| 215 | if err != nil { |
| 216 | return err |
| 217 | } |
| 218 | |
| 219 | p = bytes.TrimSpace(p) |
| 220 | |
| 221 | k.Log.Debug("Heartbeat response received %q", p) |
| 222 | |
| 223 | switch string(p) { |
| 224 | case "pong": |
| 225 | return nil |
| 226 | case "registeragain": |
| 227 | k.Log.Info("Disconnected from Kontrol, going to register again") |
| 228 | |
| 229 | go func() { |
| 230 | k.RegisterHTTPForever(kiteURL) |
| 231 | }() |
| 232 | |
| 233 | return errRegisterAgain |
| 234 | } |
| 235 | |
| 236 | return fmt.Errorf("malformed heartbeat response: %s", p) |
| 237 | } |
| 238 | |
| 239 | k.heartbeatC <- &heartbeatReq{ |
| 240 | ping: heartbeatFunc, |
| 241 | interval: interval, |
| 242 | } |
no test coverage detected