/// <summary>
        /// Retrieve the raw body as a string from the <see cref="HttpRequest" /> body stream.
        /// Validates that <paramref name="request" /> and <paramref name="encoding" /> is not null.
        /// </summary>
        /// <param name="request">Request instance to apply to.</param>
        /// <param name="encoding">Optional - Encoding, defaults to UTF8.</param>
        /// <returns>Task&lt;System.String&gt;.</returns>
        /// <exception cref="ArgumentNullException">request</exception>
        /// <remarks>Make sure to call .Dispose on Task,</remarks>
        public static async Task <string> GetRawBodyStringAsync([NotNull] this HttpRequest request, [NotNull] Encoding encoding)
        {
            request  = request.ArgumentNotNull();
            encoding = encoding.ArgumentNotNull();

            using (var reader = new StreamReader(request.Body, encoding))
            {
                return(await reader.ReadToEndAsync().ConfigureAwait(false));
            }
        }
        /// <summary>
        /// Retrieves the raw body as a byte array from the <see cref="HttpRequest" /> body stream.
        /// Validates that <paramref name="request" /> is not null.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <returns>Task&lt;System.Byte[]&gt;.</returns>
        /// <exception cref="ArgumentNullException">request</exception>
        /// <remarks>Make sure to call .Dispose on Task,</remarks>
        public static async Task <byte[]> GetRawBodyBytesAsync([NotNull] this HttpRequest request)
        {
            request = request.ArgumentNotNull();

            using (var ms = new MemoryStream(2048))
            {
                await request.Body.CopyToAsync(ms).ConfigureAwait(false);

                return(ms.ToArray());
            }
        }
        /// <summary>
        /// Tries the get <see cref="HttpRequest" /> body.
        /// Validates that <paramref name="request" /> is not null.
        /// </summary>
        /// <param name="request">The HTTPRequest object.</param>
        /// <param name="value">The return value.</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        /// <exception cref="ArgumentNullException">request</exception>
        /// <exception cref="ArgumentException">HttpRequest has no body.</exception>
        /// <exception cref="Exception">HttpRequest has no body.</exception>
        /// <remarks>Original code by Jerry Nixon</remarks>
        public static bool TryGetBody([NotNull] this HttpRequest request, out byte[] value)
        {
            request = request.ArgumentNotNull();

            if ((request.Body?.Length ?? 0) == 0)
            {
                ExceptionThrower.ThrowArgumentException("HttpRequest has no body.", nameof(request.Body));
            }

            value = GetBytes(request);

            return(value.HasItems());
        /// <summary>
        /// Tries the get <see cref="HttpRequest" /> body.
        /// Validates that <paramref name="request" /> is not null.
        /// </summary>
        /// <typeparam name="T">Generic type parameter.</typeparam>
        /// <param name="request">The HTTPRequest object.</param>
        /// <param name="value">The return value.</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        /// <exception cref="ArgumentNullException">request</exception>
        /// <remarks>Original code by Jerry Nixon</remarks>
        public static bool TryGetBody <T>([NotNull] this HttpRequest request, out T value)
        {
            request = request.ArgumentNotNull();

            if (!request.TryGetBody(out var bytes))
            {
                value = default;
                return(false);
            }

            try
            {
                value = JsonSerializer.Deserialize <T>(BitConverter.ToString(bytes));

                return(true);
            }
            catch (ArgumentNullException)
            {
                value = default;
                return(false);
            }
        }