public async Task <TResult> StartRequest <TPayload, TResult>(
            Endpoint endpoint,
            string method,
            string path,
            TPayload payload)
            where TPayload : class
            where TResult : class
        {
            var key = endpoint.KeySelector(Credentials);

            // creates initial request
            // TODO: Dispose request.
            var request = Roundtripper.CreateRequest(method, endpoint.ApiPrefix + path);

            request.Headers.Accept.Clear();
            request.Headers.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));
            request.Headers.Add("Authorization", key.EncodeForOAuthorizationHeader());
            request.Headers.Add("User-Agent", userAgent);
            if (!string.IsNullOrEmpty(APIVersion))
            {
                request.Headers.Add("Flowaccount-Version", APIVersion);
            }
            try
            {
                if (payload != null)
                {
                    request.Content = Serializer.ExtractJsonValue <TPayload>(payload);
                }

                ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
                var response = await Roundtripper.Roundtrip(request);

                var stream = await response.Content.ReadAsStreamAsync();

                if (!response.IsSuccessStatusCode)
                {
                    var error = Serializer.JsonDeserialize <ErrorResult>(stream);
                    error.HttpStatusCode = response.StatusCode;
                    throw new FlowAPIError(error, null);
                }
                //var apiResponse = Serializer.JsonDeserialize<TResult>(stream);
                var apiResponse = Serializer.JsonDeserialize <APIResponse <TResult> >(stream);
                var result      = apiResponse.Data;
                var model       = result as BaseModel;
                if (model != null)
                {
                    model.Request = this;
                }
                return(result);
                //return null;
            }
            catch (HttpRequestException e)
            {
                throw new FlowAPIException("Error while making HTTP request", e);
            }
        }
        public async Task <TResult> StartRequest <TPayload, TResult>(
            Endpoint endpoint,
            string method,
            string path,
            TPayload payload)
            where TPayload : class
            where TResult : class
        {
            var key = endpoint.KeySelector(Credentials);

            // creates initial request
            // TODO: Dispose request.
            var request = Roundtripper.CreateRequest(method, endpoint.ApiPrefix + path);

            request.Headers.Add("Authorization", key.EncodeForAuthorizationHeader());
            request.Headers.Add("User-Agent", userAgent);
            if (!string.IsNullOrEmpty(APIVersion))
            {
                request.Headers.Add("Flowaccount-Version", APIVersion);
            }

            if (payload != null)
            {
                request.Content = Serializer.ExtractFormValues(payload);
            }

            // roundtrips the request
            try
            {
                var response = await Roundtripper.Roundtrip(request);

                var stream = await response.Content.ReadAsStreamAsync();

                if (!response.IsSuccessStatusCode)
                {
                    var error = Serializer.JsonDeserialize <ErrorResult>(stream);
                    error.HttpStatusCode = response.StatusCode;
                    throw new FlowAPIError(error, null);
                }

                var result = Serializer.JsonDeserialize <TResult>(stream);
                var model  = result as BaseModel;
                if (model != null)
                {
                    model.Request = this;
                }
                return(result);
            }
            catch (HttpRequestException e)
            {
                throw new FlowAPIException("Error while making HTTP request", e);
            }
        }
        /// <summary>
        /// 1. Places <paramref name="item"/> in a ContainerClass{T} container1
        /// 2. Serializes container1
        /// 3. Deserializes the containerJson to container2 and does FieldAssert.Equal(container1, container2);
        /// 4. Serializes container2
        /// 5. Checks JsonAssert.Equal(containerJson1, containerJson2, JsonAssertOptions.Verbatim);
        /// </summary>
        /// <typeparam name="T">The type of <paramref name="item"/></typeparam>
        /// <param name="item">The instance to roundtrip</param>
        /// <returns>The serialized and deserialized instance (container2.Other)</returns>
        public static T Roundtrip <T>(T item)
        {
            Roundtripper.Simple(item, nameof(item), ToJson, FromJson <T>);
            var roundtripped = Roundtripper.InContainer(
                item,
                nameof(item),
                ToJson,
                FromJson <ContainerClass <T> >,
                (e, a) => JsonAssert.Equal(e, a, JsonAssertOptions.Verbatim));

            FieldAssert.Equal(item, roundtripped);

            return(roundtripped);
        }
        /// <summary>
        /// 1. Places <paramref name="item"/> in a ContainerClass{T} container1
        /// 2. Serializes container1
        /// 3. Deserializes the containerJson to container2 and does FieldAssert.Equal(container1, container2);
        /// 4. Serializes container2
        /// 5. Checks JsonAssert.Equal(containerJson1, containerJson2, JsonAssertOptions.Verbatim);
        /// </summary>
        /// <typeparam name="T">The type of <paramref name="item"/></typeparam>
        /// <param name="item">The instance to roundtrip</param>
        /// <param name="settings">The settings to use when serializing and deserializing.</param>
        /// <returns>The serialized and deserialized instance (container2.Other)</returns>
        public static T Roundtrip <T>(T item, JsonSerializerSettings settings)
        {
            Roundtripper.Simple(item, nameof(item), x => ToJson(x, settings), x => FromJson <T>(x, settings));
            var roundtripped = Roundtripper.InContainer(
                item,
                nameof(item),
                x => ToJson(x, settings),
                x => FromJson <ContainerClass <T> >(x, settings),
                (e, a) => JsonAssert.Equal(e, a, JsonAssertOptions.Verbatim));

            FieldAssert.Equal(item, roundtripped);

            return(roundtripped);
        }
Exemple #5
0
        public async Task <TResult> Request <TPayload, TResult>(
            Endpoint endpoint,
            string method,
            string path,
            TPayload payload)
            where TPayload : class
            where TResult : class
        {
            var apiPrefix = Environment.ResolveEndpoint(endpoint);
            var key       = Environment.SelectKey(endpoint, Credentials);

            // creates initial request
            // TODO: Dispose request.
            var request = Roundtripper.CreateRequest(method, apiPrefix + path);

            request.Headers.Add("Authorization", key.EncodeForAuthorizationHeader());
            request.Headers.Add("User-Agent", userAgent);

            if (!string.IsNullOrEmpty(APIVersion))
            {
                request.Headers.Add("Omise-Version", APIVersion);
            }
            if (payload != null)
            {
                using (var ms = new MemoryStream())
                {
                    Serializer.JsonSerialize(ms, payload);

                    var buffer  = ms.ToArray();
                    var content = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
                    request.Content = new StringContent(content, Encoding.UTF8, "application/json");
                }
            }

            // roundtrips the request
            try
            {
                var response = await Roundtripper.Roundtrip(request);

                var stream = await response.Content.ReadAsStreamAsync();

                if (!response.IsSuccessStatusCode)
                {
                    var error = Serializer.JsonDeserialize <ErrorResult>(stream);
                    error.HttpStatusCode = response.StatusCode;
                    throw new OmiseError(error, null);
                }

                var result = Serializer.JsonDeserialize <TResult>(stream);
                var model  = result as ModelBase;
                if (model != null)
                {
                    model.Requester = this;
                }

                return(result);
            }
            catch (HttpRequestException e)
            {
                throw new OmiseException("Error while making HTTP request", e);
            }
        }