private object ReadResponse(WebRequest client, bool binaryResponse)
        {
            var webResponse  = (HttpWebResponse)GetResponse(client);
            var resultStream = new MemoryStream();

            StreamHelper.CopyTo(webResponse.GetResponseStream(), resultStream);
            try
            {
                _requestHandlers.ForEach(p => p.ProcessResponse(webResponse, resultStream));

                resultStream.Position = 0;
                if (binaryResponse)
                {
                    return(resultStream);
                }

                using (var responseReader = new StreamReader(resultStream))
                {
                    string responseData = responseReader.ReadToEnd();
                    resultStream.Dispose();
                    return(responseData);
                }
            }
            catch (Exception)
            {
                resultStream.Dispose();
                throw;
            }
        }
        private WebRequest PrepareRequest(string path, string method, Dictionary <string, object> formParams,
                                          Dictionary <string, string> headerParams, string body, string contentType)
        {
            var request = WebRequest.Create(path);

            request.Method = method;

            byte[] formData = null;
            if (formParams.Count > 0)
            {
                var formDataBoundary = Guid.NewGuid().ToString();
                request.ContentType = "multipart/form-data; boundary=" + formDataBoundary;
                formData            = GetMultipartFormData(formParams, formDataBoundary);

                request.ContentLength = formData.Length;
            }
            else
            {
                request.ContentType = contentType;
            }

            foreach (KeyValuePair <string, string> headerParamsItem in headerParams)
            {
                request.Headers.Add(headerParamsItem.Key, headerParamsItem.Value);
            }

            foreach (KeyValuePair <string, string> defaultHeaderMapItem in _defaultHeaderMap)
            {
                if (!headerParams.ContainsKey(defaultHeaderMapItem.Key))
                {
                    request.Headers.Add(defaultHeaderMapItem.Key, defaultHeaderMapItem.Value);
                }
            }

            MemoryStream streamToSend = null;

            try
            {
                switch (method)
                {
                case "GET":
                    break;

                case "POST":
                case "PUT":
                case "DELETE":
                    streamToSend = new MemoryStream();

                    if (formData != null)
                    {
                        streamToSend.Write(formData, 0, formData.Length);
                    }

                    if (body != null)
                    {
                        var requestWriter = new StreamWriter(streamToSend);
                        requestWriter.Write(body);
                        requestWriter.Flush();
                    }

                    break;

                default:
                    throw new ApiException(500, "unknown method type " + method);
                }

                _requestHandlers.ForEach(p => p.BeforeSend(request, streamToSend));

                if (streamToSend != null)
                {
                    using (Stream requestStream = request.GetRequestStream())
                    {
                        StreamHelper.CopyTo(streamToSend, requestStream);
                    }
                }
            }
            finally
            {
                streamToSend?.Dispose();
            }

            return(request);
        }