/// <summary>
        /// This method will perform a the http request synchronously, and return the json decoded result
        /// </summary>
        /// <param name="request"></param>
        /// <returns>Dictionary<string,object></returns>
        public Dictionary <string, object> processRequest(Request request)
        {
            HttpWebRequest conn = (HttpWebRequest)WebRequest.CreateHttp(request.buildUrl(this.apiEndPoint));

            conn.Headers["Authorization"] = "Basic " + this.getAuthString();
            conn.ContentType = "application/json; charset=utf-8";

            conn.Method = request.method();
            if (request.method().Equals(RequestType.POST.ToString()) ||
                request.method().Equals(RequestType.PUT.ToString()))
            {
                string requestBody = request.body();
                byte[] requestData = Encoding.UTF8.GetBytes(requestBody);

                var    resultRequest = conn.BeginGetRequestStream(null, null);
                Stream postStream    = conn.EndGetRequestStream(resultRequest);
                postStream.Write(requestData, 0, requestData.Length);
                postStream.Dispose();
            }

            try
            {
                var         responseRequest = conn.BeginGetResponse(null, null);
                WebResponse responseObject  = conn.EndGetResponse(responseRequest);

                StreamReader sr = new StreamReader(responseObject.GetResponseStream());
                return(PaysafeApiClient.parseResponse(sr.ReadToEnd()));
            }
            catch (System.Net.WebException ex)
            {
                HttpWebResponse response = (HttpWebResponse)ex.Response;
                StreamReader    sr       = new StreamReader(response.GetResponseStream());
                string          body     = sr.ReadToEnd();

                string exceptionType = null;
                switch (response.StatusCode)
                {
                case HttpStatusCode.BadRequest:     // 400
                    exceptionType = "InvalidRequestException";
                    break;

                case HttpStatusCode.Unauthorized:     // 401
                    exceptionType = "InvalidCredentialsException";
                    break;

                case HttpStatusCode.PaymentRequired:     //402
                    exceptionType = "RequestDeclinedException";
                    break;

                case HttpStatusCode.Forbidden:     //403
                    exceptionType = "PermissionException";
                    break;

                case HttpStatusCode.NotFound:     //404
                    exceptionType = "EntityNotFoundException";
                    break;

                case HttpStatusCode.Conflict:     //409
                    exceptionType = "RequestConflictException";
                    break;

                case HttpStatusCode.NotAcceptable:           //406
                case HttpStatusCode.UnsupportedMediaType:    //415
                case HttpStatusCode.InternalServerError:     //500
                case HttpStatusCode.NotImplemented:          //501
                case HttpStatusCode.BadGateway:              //502
                case HttpStatusCode.ServiceUnavailable:      //503
                case HttpStatusCode.GatewayTimeout:          //504
                case HttpStatusCode.HttpVersionNotSupported: //505
                    exceptionType = "APIException";
                    break;
                }
                if (exceptionType != null)
                {
                    String message = ex.Message;
                    Dictionary <string, dynamic> rawResponse = PaysafeApiClient.parseResponse(body);
                    if (rawResponse.ContainsKey("error"))
                    {
                        message = rawResponse["error"]["message"];
                    }

                    Object[]         args             = { message, ex.InnerException };
                    PaysafeException PaysafeException = Activator.CreateInstance
                                                            (Type.GetType("Paysafe.Common." + exceptionType), args) as PaysafeException;
                    PaysafeException.rawResponse(rawResponse);
                    if (rawResponse.ContainsKey("error"))
                    {
                        PaysafeException.code(int.Parse(rawResponse["error"]["code"]));
                    }
                    throw PaysafeException;
                }
                throw;
            }
            throw new PaysafeException("An unknown error has occurred.");
        }
        private void HandlePaysafeExceptionInternal(HttpStatusCode statusCode, string body, Exception innerException)
        {
            string exceptionType = null;

            switch (statusCode)
            {
            case HttpStatusCode.BadRequest:     // 400
                exceptionType = "InvalidRequestException";
                break;

            case HttpStatusCode.Unauthorized:     // 401
                exceptionType = "InvalidCredentialsException";
                break;

            case HttpStatusCode.PaymentRequired:     //402
                exceptionType = "RequestDeclinedException";
                break;

            case HttpStatusCode.Forbidden:     //403
                exceptionType = "PermissionException";
                break;

            case HttpStatusCode.NotFound:     //404
                exceptionType = "EntityNotFoundException";
                break;

            case HttpStatusCode.Conflict:     //409
                exceptionType = "RequestConflictException";
                break;

            case HttpStatusCode.NotAcceptable:           //406
            case HttpStatusCode.UnsupportedMediaType:    //415
            case HttpStatusCode.InternalServerError:     //500
            case HttpStatusCode.NotImplemented:          //501
            case HttpStatusCode.BadGateway:              //502
            case HttpStatusCode.ServiceUnavailable:      //503
            case HttpStatusCode.GatewayTimeout:          //504
            case HttpStatusCode.HttpVersionNotSupported: //505
                exceptionType = "ApiException";
                break;
            }
            if (exceptionType != null)
            {
                String message = body;
                Dictionary <string, dynamic> rawResponse = ParseResponse(body);
                if (rawResponse.ContainsKey("error"))
                {
                    message = rawResponse["error"]["message"];
                }

                Object[]         args             = { message, innerException };
                PaysafeException paysafeException = Activator.CreateInstance
                                                        (Type.GetType("Paysafe.Common." + exceptionType), args) as PaysafeException;
                paysafeException.RawResponse(rawResponse);
                if (rawResponse.ContainsKey("error"))
                {
                    paysafeException.Code(int.Parse(rawResponse["error"]["code"]));
                }
                throw paysafeException;
            }
        }