ParseRequestBody() public method

public ParseRequestBody ( string post_body ) : bool
post_body string
return bool
        public Hashtable HandleBitcoinConfirmationPing(Hashtable request_hash)
        {
            m_log.Error("[FreeMoney] Got request for confirmation");
            //string base_url = "http://beech/TODO";
            string base_url = m_scenes[0].RegionInfo.ExternalHostName + ":" + m_scenes[0].RegionInfo.HttpPort;
            /*
            TODO: Recreate the ability to handle multiple services.
            if (!get_params.ContainsKey("service")) {
                //print_simple_and_exit("Error: Service name not set.");
                return false;
            }
            */

            Hashtable error_response = new Hashtable();
            error_response.Add("int_response_code", 400);

            //Dictionary<string, object> postvals = ServerUtils.ParseQueryString ((string)request["body"]);
            string post_data = (string)request_hash["body"];
            m_log.Error("[FreeMoney] Confirmation body:"+post_data);

            BitcoinNotificationService service = new BitcoinNotificationService(m_btcconfig);

            if (!service.ParseRequestBody(post_data)) {
                m_log.Error("[FreeMoney] Could not parse post params");
                return error_response;
            }

            if (!service.IsValid()) {
                return error_response;
            }

            string address = service.BtcAddress();
            int num_confirmations_received = service.NumConfirmationsReceived();

            BitcoinTransaction btc_trans = new BitcoinTransaction(m_connectionString, m_btcconfig, base_url);

            if (!btc_trans.PopulateByBtcAddress(address)) {
                m_log.Error("[FreeMoney] Could not find btc_trans");
                return error_response;
            }

            // Always mark the latest number of confirmations, assuming it's more than we had last time.
            if (!btc_trans.MarkConfirmed(num_confirmations_received)) {
                m_log.Error("[FreeMoney] Could not mark confirmed in database");
                //print_simple_and_exit("Could not mark btc_trans confirmed despite receiving ".htmlentities($num_confirmations_received)." confirmations.");
                return error_response;
            }

            // If it's less than we need, there should be nothing more to do.
            //if (num_confirmations_received < btc_trans.num_confirmations_required)
            if (!btc_trans.IsEnoughConfirmations(num_confirmations_received)) {
                m_log.Info("[FreeMoney] Got "+ num_confirmations_received.ToString()+" confirmations for address " + address + ", but that is not enough to complete the transaction.");
                return error_response;
                //print_simple_and_exit("Not enough confirmations, ignoring.", 200);
            }

            // If we've already notified the client about this btc_trans, no need to do anything else.
            if (btc_trans.IsConfirmationSent()) {
                //print_simple_and_exit("Already confirmed, nothing more to do.", 200);
            }

            UUID txnID = new UUID (btc_trans.GetTransactionID());
            if (!m_transactionsInProgress.ContainsKey (txnID)) {
                Hashtable ereply = new Hashtable ();

                ereply["int_response_code"] = 404;
                // 200 OK
                ereply["str_response_string"] = "Invalid Transaction";
                ereply["content_type"] = "text/html";

                return ereply;
            }

            FreeMoneyTransaction txn = m_transactionsInProgress[txnID];

            if (!btc_trans.MarkNotified()) {
                //print_simple_and_exit("Notified sim, but unable to record the fact that we did.");
                m_log.Error("[FreeMoney] Could not mark notified");
                return error_response;
            }

            Util.FireAndForget (delegate { TransferSuccess (txn); });

            Hashtable ok_response = new Hashtable();
            ok_response.Add("int_response_code", 200);
            ok_response.Add("str_response_string", "OK, thanks for letting us know.");
            ok_response.Add("content_type", "text/html");

            return ok_response;
        }