protected IEnumerator RequestCoroutine(string url, byte[] postData, Dictionary <string, string> headers, Action <Firebase, DataSnapshot> OnSuccess, Action <Firebase, FirebaseError> OnFailed)
        {
            using (WWW www = (headers != null) ? new WWW(url, postData, headers) : (postData != null) ? new WWW(url, postData) : new WWW(url))
            {
                // Wait until load done
                yield return(www);

                if (!string.IsNullOrEmpty(www.error))
                {
                    HttpStatusCode status     = 0;
                    string         errMessage = "";

                    // Parse status code
                    if (www.responseHeaders.ContainsKey("STATUS"))
                    {
                        string   str        = www.responseHeaders["STATUS"] as string;
                        string[] components = str.Split(' ');
                        int      code       = 0;
                        if (components.Length >= 3 && int.TryParse(components[1], out code))
                        {
                            status = (HttpStatusCode)code;
                        }
                    }

                    if (www.error.Contains("crossdomain.xml") || www.error.Contains("Couldn't resolve"))
                    {
                        errMessage = "No internet connection or crossdomain.xml policy problem";
                    }
                    else
                    {
                        // Parse error message

                        try
                        {
                            if (!string.IsNullOrEmpty(www.text))
                            {
                                Dictionary <string, object> obj = Json.Deserialize(www.text) as Dictionary <string, object>;

                                if (obj != null && obj.ContainsKey("error"))
                                {
                                    errMessage = obj["error"] as string;
                                }
                            }
                        }
                        catch
                        {
                        }
                    }



                    if (OnFailed != null)
                    {
                        if (string.IsNullOrEmpty(errMessage))
                        {
                            errMessage = www.error;
                        }

                        if (errMessage.Contains("Failed downloading"))
                        {
                            errMessage = "Request failed with no info of error.";
                        }

                        OnFailed(this, new FirebaseError(status, errMessage));
                    }

#if UNITY_EDITOR
                    Debug.LogWarning(www.error + " (" + (int)status + ")\nResponse Message: " + errMessage);
#endif
                }
                else
                {
                    ParserJsonToSnapshot parser = new ParserJsonToSnapshot(www.text);

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

                    DataSnapshot snapshot = parser.snapshot;
                    if (OnSuccess != null)
                    {
                        OnSuccess(this, snapshot);
                    }
                }
            }
        }
 void Run()
 {
     snapshot = new DataSnapshot(json);
     isDone   = true;
 }
 protected void OnSuccess(Firebase sender, DataSnapshot snapshot)
 {
     --count;
     StartNextCommand();
     ClearCallbacks(sender);
 }