/// <summary> /// Calculates the given checksum for a marshalled request /// </summary> /// <param name="algorithm">Checksum algorithm to calculate</param> /// <param name="request">Request whose content to calculate the checksum for</param> /// <returns>Calculated checksum for the given request</returns> private static string CalculateChecksumForRequest(HashAlgorithm algorithm, IRequest request) { if (request.ContentStream != null) { var seekableStream = WrapperStream.SearchWrappedStream(request.ContentStream, s => s.CanSeek); if (seekableStream != null) { var position = seekableStream.Position; var checksumBytes = algorithm.ComputeHash(seekableStream); seekableStream.Seek(position, SeekOrigin.Begin); return(Convert.ToBase64String(checksumBytes)); } else { throw new ArgumentException("Request must have a seekable content stream to calculate checksum"); } } else if (request.Content != null) { var checksumBytes = algorithm.ComputeHash(request.Content); return(Convert.ToBase64String(checksumBytes)); } else // request doesn't have content { return(string.Empty); } }
public static Stream SearchWrappedStream(Stream stream, Func <Stream, bool> condition) { WrapperStream wrapperStream = stream as WrapperStream; if (wrapperStream == null) { return(condition(stream) ? stream : null); } return(wrapperStream.SearchWrappedStream(condition)); }