// Called when a message is received private void OnReceive(object sender, MessageEventArgs args) { if (_cts.IsCancellationRequested) { Log.To.ChangeTracker.I(Tag, "{0} Cancellation requested, aborting in OnReceive", this); return; } if (args.IsPing) { _client.Ping(); return; } try { if (args.RawData.Length == 0) { return; } var responseStream = new MemoryStream(); responseStream.WriteByte(args.IsText ? (byte)1 : (byte)2); responseStream.Write(args.RawData, 0, args.RawData.Length); responseStream.Seek(0, SeekOrigin.Begin); _responseLogic.ProcessResponseStream(responseStream, _cts.Token); } catch (Exception e) { Log.To.ChangeTracker.E(Tag, String.Format("{0} is not parseable", GetLogString(args)), e); } }
private Task ChangeFeedResponseHandler(Task <HttpResponseMessage> responseTask) { if (ResponseFailed(responseTask)) { return(Task.FromResult(false)); } var response = responseTask.Result; UpdateServerType(response); if (response.Content == null) { throw Misc.CreateExceptionAndLog(Log.To.ChangeTracker, response.StatusCode.GetStatusCode(), Tag, "Got empty change tracker response"); } Log.To.ChangeTracker.D(Tag, "Getting stream from change tracker response"); return(response.Content.ReadAsStreamAsync().ContinueWith((Task <Stream> t) => { try { var result = _responseLogic.ProcessResponseStream(t.Result, changesFeedRequestTokenSource.Token); Backoff.ResetBackoff(); if (result == ChangeTrackerResponseCode.ChangeHeartbeat) { Heartbeat = _responseLogic.Heartbeat; _workExecutor.StartNew(Run); } } catch (CouchbaseLiteException e) { if (e.Code == StatusCode.BadJson) { Log.To.ChangeTracker.W(Tag, "{0} Couldn't parse JSON from remote, " + "retrying in {1}ms", this, Backoff.GetSleepTime().TotalMilliseconds); Backoff.DelayAppropriateAmountOfTime().ContinueWith(t1 => { Log.To.ChangeTracker.I(Tag, "{0} retrying NOW...", this); _workExecutor.StartNew(Run); }); } } catch (Exception e) { RetryOrStopIfNecessary(e); } finally { Misc.SafeDispose(ref changesFeedRequestTokenSource); response.Dispose(); } })); }