public HgResumeApiResponse Execute(string method, HgResumeApiParameters request, byte[] contentToSend, int secondsBeforeTimeout) { ValidateParameters(method, request, contentToSend, secondsBeforeTimeout); HgResumeApiResponse response; if (_responseQueue.Count > 0) { response = _responseQueue.Dequeue(); if (response.HttpStatus == HttpStatusCode.RequestTimeout) { return(null); } } else { response = new HgResumeApiResponse { HttpStatus = HttpStatusCode.InternalServerError }; } response.ResponseTimeInMilliseconds = 200; return(response); }
public void ValidateParameters(string method, HgResumeApiParameters request, byte[] contentToSend, int secondsBeforeTimeout) { Assert.That(method, Is.Not.Empty); Assert.That(secondsBeforeTimeout, Is.GreaterThan(0)); if (method == "getRevisions") { Assert.That(request.RepoId, Is.Not.Empty); Assert.That(request.Quantity, Is.GreaterThan(0)); Assert.That(request.StartOfWindow, Is.GreaterThan(-1)); } else if (method == "pullBundleChunk") { Assert.That(request.RepoId, Is.Not.Empty); Assert.That(request.BaseHashes, Is.Not.Empty); Assert.That(request.ChunkSize, Is.GreaterThan(0)); Assert.That(request.StartOfWindow, Is.GreaterThanOrEqualTo(0)); Assert.That(request.TransId, Is.Not.Empty); } else if (method == "pushBundleChunk") { Assert.That(request.RepoId, Is.Not.Empty); Assert.That(request.BundleSize, Is.GreaterThan(0)); Assert.That(request.StartOfWindow, Is.GreaterThanOrEqualTo(0)); Assert.That(request.TransId, Is.Not.Empty); Assert.That(contentToSend.Length, Is.GreaterThan(0)); } else if (method == "finishPushBundle") { Assert.That(request.TransId, Is.Not.Empty); } else if (method == "finishPullBundle") { Assert.That(request.TransId, Is.Not.Empty); } else { throw new HgResumeException(String.Format("unknown method '{0}'", method)); } }
public HgResumeApiResponse Execute(string method, HgResumeApiParameters request, byte[] bytesToWrite, int secondsBeforeTimeout) { ValidateParameters(method, request, bytesToWrite, secondsBeforeTimeout); _executeCount++; if (method == "finishPullBundle") { if (CurrentTip != OriginalTip) { PrepareBundle(HgResumeTransport.GetHashStringsFromRevisions(_repo.BranchingHelper.GetBranches())); return(ApiResponses.Reset()); // repo changed in between pulls } return(ApiResponses.Custom(HttpStatusCode.OK)); } if (method == "getRevisions") { IEnumerable <string> revisions = _repo.GetAllRevisions().Select(rev => rev.Number.Hash + ':' + rev.Branch); return(ApiResponses.Revisions(string.Join("|", revisions.ToArray()))); } if (method == "pullBundleChunk") { if (_cancelCount == _executeCount) { _progress.CancelRequested = true; return(ApiResponses.Failed("")); } if (_failCount == _executeCount) { return(ApiResponses.Failed("")); } if (_timeoutList.Contains(_executeCount)) { return(null); } if (_serverUnavailableList.Any(i => i.ExecuteCount == _executeCount)) { return(ApiResponses.NotAvailable( _serverUnavailableList.Where(i => i.ExecuteCount == _executeCount).First().Message )); } if (Array.BinarySearch(request.BaseHashes, 0, request.BaseHashes.Length, CurrentTip) >= 0) { return(ApiResponses.PullNoChange()); } var bundleFileInfo = new FileInfo(_helper.BundlePath); if (bundleFileInfo.Exists && bundleFileInfo.Length == 0 || !bundleFileInfo.Exists) { PrepareBundle(request.BaseHashes); } //int offset = Convert.ToInt32(request["offset"]); //int chunkSize = Convert.ToInt32(request["chunkSize"]); var bundleFile = new FileInfo(_helper.BundlePath); if (request.StartOfWindow >= bundleFile.Length) { return(ApiResponses.Failed("offset greater than bundleSize")); } var chunk = _helper.GetChunk(request.StartOfWindow, request.ChunkSize); return(ApiResponses.PullOk(Convert.ToInt32(bundleFile.Length), chunk)); } return(ApiResponses.Custom(HttpStatusCode.InternalServerError)); }
public HgResumeApiResponse Execute(string method, HgResumeApiParameters request, int secondsBeforeTimeout) { return(Execute(method, request, new byte[0], secondsBeforeTimeout)); }
public HgResumeApiResponse Execute(string method, HgResumeApiParameters request, byte[] bytesToWrite, int secondsBeforeTimeout) { ValidateParameters(method, request, bytesToWrite, secondsBeforeTimeout); if (method == "getRevisions") { IEnumerable <Revision> revisions = _repo.GetAllRevisions(); if (revisions.Count() == 0) { return(ApiResponses.Revisions("0:default")); } var revisionStrings = _repo.GetAllRevisions().Select(rev => rev.Number.Hash + ':' + rev.Branch); return(ApiResponses.Revisions(string.Join("|", revisionStrings.ToArray()))); } if (method == "finishPushBundle") { return(ApiResponses.PushComplete()); } if (method == "pushBundleChunk") { _executeCount++; if (_cancelCount == _executeCount) { _progress.CancelRequested = true; return(ApiResponses.Failed("")); } if (_failCount == _executeCount) { return(ApiResponses.Failed("")); } if (_timeoutList.Contains(_executeCount)) { return(null); } if (_serverUnavailableList.Any(i => i.ExecuteCount == _executeCount)) { return(ApiResponses.NotAvailable( _serverUnavailableList.Where(i => i.ExecuteCount == _executeCount).First().Message )); } _helper = new PullStorageManager(_localStorage.Path, request.TransId); //int bundleSize = Convert.ToInt32(parameters["bundleSize"]); //int offset = Convert.ToInt32(parameters["offset"]); //int chunkSize = bytesToWrite.Length; _helper.WriteChunk(request.StartOfWindow, bytesToWrite); if (request.StartOfWindow + request.ChunkSize == request.BundleSize) { if (_repo.Unbundle(_helper.BundlePath)) { return(ApiResponses.PushComplete()); } return(ApiResponses.Reset()); } if (request.StartOfWindow + request.ChunkSize < request.BundleSize) { return(ApiResponses.PushAccepted(_helper.StartOfWindow)); } return(ApiResponses.Failed("offset + chunkSize > bundleSize !")); } return(ApiResponses.Custom(HttpStatusCode.InternalServerError)); }