public Stream DownloadPreview(string userId, string id, PreviewSize size, long?version)
        {
            var webRequest = CreatePreviewDocumentRequest(userId, id, size, version);

            webRequest.Timeout = PREVIEW_TIMEOUT;

            HttpWebResponse webResponse = null;

            try
            {
                webResponse = (HttpWebResponse)webRequest.GetResponse();
            }
            catch (WebException e) when((e.Response as HttpWebResponse)?.StatusCode == HttpStatusCode.NotFound)
            {
                throw new NotFoundException(e.Message, e);
            }
            catch (WebException e) when((e.Response as HttpWebResponse)?.StatusCode == HttpStatusCode.NotAcceptable)
            {
                throw new NotAcceptableException(e.Message, e);
            }

            if (webResponse.StatusCode != HttpStatusCode.OK)
            {
                throw new RestClientException("Cannot download preview for document '" + id + "', received status code " + webResponse.StatusCode + ".");
            }

            return(DocumentStreamUtils.WrapDownloadStream(webResponse.GetResponseStream(), streamWrapper));
        }
        public Stream DownloadDocument(string userId, string id, long?version, long?range)
        {
            HttpWebRequest  webRequest  = CreateDownloadDocumentRequest(userId, id, version, range);
            HttpWebResponse webResponse = null;

            try
            {
                webResponse = (HttpWebResponse)webRequest.GetResponse();
            }
            catch (WebException e) when((e.Response as HttpWebResponse)?.StatusCode == HttpStatusCode.RequestedRangeNotSatisfiable)
            {
                throw new RequestedRangeNotSatisfiableException("The requested range cannot be downloaded");
            }
            catch (WebException e) when((e.Response as HttpWebResponse)?.StatusCode != HttpStatusCode.OK)
            {
                ThrowRestClientException(e, e.Response as HttpWebResponse);
            }

            ValidateResponse(webResponse, userId, range);
            return(DocumentStreamUtils.WrapDownloadStream(webResponse.GetResponseStream(), streamWrapper));
        }