Example #1
0
        private static TResponse SetBody <TResponse>(ApiCallDetails details, RequestData requestData, Stream responseStream, string mimeType)
            where TResponse : class, IElasticsearchResponse, new()
        {
            byte[] bytes = null;
            var    disableDirectStreaming = requestData.PostData?.DisableDirectStreaming ?? requestData.ConnectionSettings.DisableDirectStreaming;

            if (disableDirectStreaming || NeedsToEagerReadStream <TResponse>())
            {
                var inMemoryStream = requestData.MemoryStreamFactory.Create();
                responseStream.CopyTo(inMemoryStream, BufferSize);
                bytes = SwapStreams(ref responseStream, ref inMemoryStream);
                details.ResponseBodyInBytes = bytes;
            }

            using (responseStream)
            {
                if (SetSpecialTypes <TResponse>(bytes, out var r))
                {
                    return(r);
                }

                if (details.HttpStatusCode.HasValue && requestData.SkipDeserializationForStatusCodes.Contains(details.HttpStatusCode.Value))
                {
                    return(null);
                }

                if (requestData.CustomConverter != null)
                {
                    return(requestData.CustomConverter(details, responseStream) as TResponse);
                }
                return(mimeType == null || !mimeType.StartsWith(requestData.RequestMimeType, StringComparison.Ordinal)
                                                ? null
                                                : requestData.ConnectionSettings.RequestResponseSerializer.Deserialize <TResponse>(responseStream));
            }
        }
        private static async Task <TResponse> SetBodyAsync <TResponse>(
            ApiCallDetails details, RequestData requestData, Stream responseStream, string mimeType, CancellationToken cancellationToken)
            where TResponse : class, IElasticsearchResponse, new()
        {
            byte[] bytes = null;
            var    disableDirectStreaming = requestData.PostData?.DisableDirectStreaming ?? requestData.ConnectionSettings.DisableDirectStreaming;

            if (disableDirectStreaming || NeedsToEagerReadStream <TResponse>())
            {
                var inMemoryStream = requestData.MemoryStreamFactory.Create();
                await responseStream.CopyToAsync(inMemoryStream, BufferSize, cancellationToken).ConfigureAwait(false);

                bytes = SwapStreams(ref responseStream, ref inMemoryStream);
                details.ResponseBodyInBytes = bytes;
            }

            var needsDispose = typeof(TResponse) != typeof(ElasticsearchResponse <Stream>);

            using (needsDispose ? responseStream : EmptyDisposable)
            {
                if (SetSpecialTypes <TResponse>(responseStream, bytes, out var r))
                {
                    return(r);
                }

                if (details.HttpStatusCode.HasValue && requestData.SkipDeserializationForStatusCodes.Contains(details.HttpStatusCode.Value))
                {
                    return(null);
                }

                if (requestData.CustomConverter != null)
                {
                    return(requestData.CustomConverter(details, responseStream) as TResponse);
                }
                return(mimeType == null || !mimeType.StartsWith(requestData.RequestMimeType, StringComparison.Ordinal)
                                                ? null
                                                : await requestData.ConnectionSettings.RequestResponseSerializer
                       .DeserializeAsync <TResponse>(responseStream, cancellationToken)
                       .ConfigureAwait(false));
            }
        }