public static IEnumerator delete(string url, string sessionToken, Action <bool, object> callback = null)
    {
        if (Gamedonia.INSTANCE.debug)
        {
            String debugMsg = "[Api Call] - " + url;
            Debug.Log(debugMsg);
        }

        string  path    = _baseURL + "/" + _version + url;
        string  date    = GetCurrentDate();
        Request request = new Request("delete", path);

        request.AddHeader(GD_SESSION_TOKEN, sessionToken);
        request.AddHeader(GD_APIKEY, _apiKey);
        request.AddHeader("Date", date);
        request.AddHeader(GD_SIGNATURE, Sign(_apiKey, _secret, date, "DELETE", request.uri.AbsolutePath));

        request.Send();

        while (!request.isDone)
        {
            yield return(null);
        }

        if (request.response.status == 200)
        {
            if (Gamedonia.INSTANCE.debug)
            {
                Debug.Log("[Api Response][" + url + "] - " + request.response.status + " " + request.response.Text);
            }
            callback(true, request.response.Text);
        }
        else
        {
            if (Gamedonia.INSTANCE.debug)
            {
                Debug.Log("[Api Response][" + url + "] - " + request.response.status + " " + request.response.message + " " + request.response.Text);
            }
            GDError error = JsonMapper.ToObject <GDError>(request.response.Text);
            error.httpErrorCode          = request.response.status;
            error.httpErrorMessage       = request.response.message;
            Gamedonia.INSTANCE.lastError = error;
            callback(false, request.response.message + ' ' + request.response.Text);
        }
    }
    public static IEnumerator post(string url, string content, string auth = null, string sessionToken = null, string gameid = null, Action <bool, object> callback = null)
    {
        if (Gamedonia.INSTANCE.debug)
        {
            String debugMsg = "[Api Call] - " + url;
            if (!String.IsNullOrEmpty(content))
            {
                debugMsg += " " + content;
            }
            Debug.Log(debugMsg);
        }

        string path = _baseURL + "/" + _version + url;

        Request request = new Request("POST", path);

        request.AddHeader("Content-Type", _content_type);
        request.AddHeader(GD_APIKEY, _apiKey);

        if (!string.IsNullOrEmpty(auth))
        {
            request.AddHeader(GD_AUTH, auth);
        }
        if (!string.IsNullOrEmpty(sessionToken))
        {
            request.AddHeader(GD_SESSION_TOKEN, sessionToken);
        }
        if (!string.IsNullOrEmpty(gameid))
        {
            request.AddHeader(GD_GAMEID, gameid);
        }

        if (!string.IsNullOrEmpty(content))
        {
            //Sign data to post
            string date = GetCurrentDate();
            string hmac = Sign(_apiKey, _secret, Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(content)), _content_type, date, "POST", request.uri.AbsolutePath);

            request.AddHeader(GD_SIGNATURE, hmac);
            request.AddHeader("Date", date);
            request.bytes = Encoding.UTF8.GetBytes(content);
        }

        request.Send();

        while (!request.isDone)
        {
            yield return(null);
        }


        if (request.response.status == 200)
        {
            if (Gamedonia.INSTANCE.debug)
            {
                Debug.Log("[Api Response][" + url + "] - " + request.response.status + " " + request.response.Text);
            }
            callback(true, request.response.Text);
        }
        else
        {
            if (Gamedonia.INSTANCE.debug)
            {
                Debug.Log("[Api Response][" + url + "] - " + request.response.status + " " + request.response.message + " " + request.response.Text);
            }
            GDError error = JsonMapper.ToObject <GDError>(request.response.Text);
            error.httpErrorCode          = request.response.status;
            error.httpErrorMessage       = request.response.message;
            Gamedonia.INSTANCE.lastError = error;
            callback(false, request.response.message);
        }
    }
    public static GDError buildError(Response response)
    {
        GDError error = null;
        if (!String.IsNullOrEmpty (response.Text)) {
            error = JsonMapper.ToObject<GDError>(response.Text);
            error.httpErrorCode = response.status;
            if (!String.IsNullOrEmpty(response.message)) error.httpErrorMessage = response.message;

        } else {
            error = new GDError();
            error.httpErrorCode = response.status;
        }

        return error;
    }