NWC-RPC Methods Giving Odd Results

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

NWC-RPC Methods Giving Odd Results

David Lloyd

Hi There,

TL;DR I can’t get NWC-RPC to encode .NET object such as OpenMetaverse’s UUID or System.Net.IEndpoint - anyone know how to do this?

I am trying to get the NWC-RPC .NET module to communicate with my money server. The money server registers XML RPC calls with the grid like this:

m_httpServer.AddXmlRPCHandler("CancelTransfer", handleCancelTransfer)

The handleCanceTransfer’s signature looks like this:

 public XmlRpcResponse handleCancelTransfer(XmlRpcRequest request, IPEndPoint remoteClient)

My code looks like this (and it’s a copy/paste with a few tweaks from here):

using System;
using System.Collections;
using System.Collections.Generic;
using System.Net;
using Nwc.XmlRpc;
using OpenMetaverse;
namespace Call_With_NWC
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            System.Net.ServicePointManager.CertificatePolicy = new ITrustAllCertificates();
            Hashtable ht = new Hashtable();
            ht["remoteClient"] = new IPEndPoint(IPAddress.Parse("192.168.0.1"), 80);
            ht["secureCode"] = "code";
            ht["transactionID"] = UUID.Random(); // UUID Line
            Console.WriteLine("New GUID: " + ht["transactionID"]);
            List<Hashtable> parameters = new List<Hashtable> { ht };
            XmlRpcRequest request = new XmlRpcRequest("CancelTransaction", parameters);
            Hashtable response;
            try {
//                response = (Hashtable)request.Invoke("https://192.168.0.164:8008");
                response = (Hashtable)request.Invoke("http://192.168.0.1:9000");
                Console.WriteLine("It seems to have worked...");
                foreach (var key in response.Keys)
                {
                    Console.WriteLine("Key: " + key + " => " + response[key]);
                }
            } catch (Exception ex) {
                Console.WriteLine("Got an exception:\n" + ex.ToString());
            }
        }
    }
}

The money server consistently complains that the secureCode and UUID are empty - when in fact…they are…because I wrote up a little “Dump the request” server and get:

Message of length 348 was defined but not a blessed scalar.
<?xml version="1.0" encoding="utf-8"?>
<methodCall>
<methodName>
CancelTransaction
</methodName>
<params>
<param>
<value>
<struct>
<member>
<name>
transactionID
</name>
<value/>
</member>
<member>
<name>
remoteClient
</name>
<value/>
</member>
<member>
<name>
secureCode
</name>
<value>
<string>
code
</string>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>

In fact, the NWC-XML-RPC is behaving as though it doesn’t know how to encode anything but plain strings. The transactionID should be the type OpenMetavers.UUID (which seems to be a wrapper around GUUID) and remoteClient should be an IEndPoint from System.Net.

Obviously I’m missing something but I’m not sure what.

How does one encode OpenMetaverse and other .NET objects so that the XML-RPC client on the other end is able to decode them?

DSL

_______________________________________________
Opensim-users mailing list
[hidden email]
http://opensimulator.org/cgi-bin/mailman/listinfo/opensim-users
Reply | Threaded
Open this post in threaded view
|

Re: NWC-RPC Methods Giving Odd Results

David Lloyd

The error given by the Money Server is:

Money # 04:57:46 - [MONEY RPC]: handleCancelTransfer: Exception occurred when transaction 94786877-9ed6-4d36-98d7-9a88f7b52acf: System.NullReferenceException: Object reference not set to an instance of an object
  at OpenSim.Grid.MoneyServer.MoneyXmlRpcModule.handleCancelTransfer (Nwc.XmlRpc.XmlRpcRequest request, System.Net.IPEndPoint remoteClient) [0x00000] in <filename unknown>:0

This is because it’s attempting to dereference a string (if I do UUID.Random().ToString()) or an empty value.

DSL


On 29 Nov 2014, at 9:30 am, David Lloyd <[hidden email]> wrote:


Hi There,

TL;DR I can’t get NWC-RPC to encode .NET object such as OpenMetaverse’s UUID or System.Net.IEndpoint - anyone know how to do this?

I am trying to get the NWC-RPC .NET module to communicate with my money server. The money server registers XML RPC calls with the grid like this:

m_httpServer.AddXmlRPCHandler("CancelTransfer", handleCancelTransfer)

The handleCanceTransfer’s signature looks like this:

 public XmlRpcResponse handleCancelTransfer(XmlRpcRequest request, IPEndPoint remoteClient)

My code looks like this (and it’s a copy/paste with a few tweaks from here):

using System;
using System.Collections;
using System.Collections.Generic;
using System.Net;
using Nwc.XmlRpc;
using OpenMetaverse;
namespace Call_With_NWC
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            System.Net.ServicePointManager.CertificatePolicy = new ITrustAllCertificates();
            Hashtable ht = new Hashtable();
            ht["remoteClient"] = new IPEndPoint(IPAddress.Parse("192.168.0.1"), 80);
            ht["secureCode"] = "code";
            ht["transactionID"] = UUID.Random(); // UUID Line
            Console.WriteLine("New GUID: " + ht["transactionID"]);
            List<Hashtable> parameters = new List<Hashtable> { ht };
            XmlRpcRequest request = new XmlRpcRequest("CancelTransaction", parameters);
            Hashtable response;
            try {
//                response = (Hashtable)request.Invoke("https://192.168.0.164:8008");
                response = (Hashtable)request.Invoke("http://192.168.0.1:9000");
                Console.WriteLine("It seems to have worked...");
                foreach (var key in response.Keys)
                {
                    Console.WriteLine("Key: " + key + " => " + response[key]);
                }
            } catch (Exception ex) {
                Console.WriteLine("Got an exception:\n" + ex.ToString());
            }
        }
    }
}

The money server consistently complains that the secureCode and UUID are empty - when in fact…they are…because I wrote up a little “Dump the request” server and get:

Message of length 348 was defined but not a blessed scalar.
<?xml version="1.0" encoding="utf-8"?>
<methodCall>
<methodName>
CancelTransaction
</methodName>
<params>
<param>
<value>
<struct>
<member>
<name>
transactionID
</name>
<value/>
</member>
<member>
<name>
remoteClient
</name>
<value/>
</member>
<member>
<name>
secureCode
</name>
<value>
<string>
code
</string>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodCall>

In fact, the NWC-XML-RPC is behaving as though it doesn’t know how to encode anything but plain strings. The transactionID should be the type OpenMetavers.UUID (which seems to be a wrapper around GUUID) and remoteClient should be an IEndPoint from System.Net.

Obviously I’m missing something but I’m not sure what.

How does one encode OpenMetaverse and other .NET objects so that the XML-RPC client on the other end is able to decode them?

DSL
_______________________________________________
Opensim-users mailing list
[hidden email]
http://opensimulator.org/cgi-bin/mailman/listinfo/opensim-users


_______________________________________________
Opensim-users mailing list
[hidden email]
http://opensimulator.org/cgi-bin/mailman/listinfo/opensim-users
Reply | Threaded
Open this post in threaded view
|

Re: NWC-RPC Methods Giving Odd Results

justincc
I would suggest calling ToString() explicitly, e.g.

ht["transactionID"] = UUID.Random().ToString()

This is what the OpenSimulator code appears to do.

On 28/11/14 23:04, David Lloyd wrote:

>
> The error given by the Money Server is:
>
> Money # 04:57:46 - [MONEY RPC]: handleCancelTransfer: Exception occurred when transaction
> 94786877-9ed6-4d36-98d7-9a88f7b52acf: System.NullReferenceException: Object reference not set to an instance of an object
>    at OpenSim.Grid.MoneyServer.MoneyXmlRpcModule.handleCancelTransfer (Nwc.XmlRpc.XmlRpcRequest request,
> System.Net.IPEndPoint remoteClient) [0x00000] in <filename unknown>:0
>
> This is because it’s attempting to dereference a string (if I do UUID.Random().ToString()) or an empty value.
>
> DSL
>
>
>> On 29 Nov 2014, at 9:30 am, David Lloyd <[hidden email] <mailto:[hidden email]>> wrote:
>>
>>
>> Hi There,
>>
>> TL;DR I can’t get NWC-RPC to encode .NET object such as OpenMetaverse’s UUID or System.Net.IEndpoint - anyone know how
>> to do this?
>>
>> I am trying to get the NWC-RPC .NET module to communicate with my money server. The money server registers XML RPC
>> calls with the grid like this:
>>
>>     m_httpServer.AddXmlRPCHandler("CancelTransfer", handleCancelTransfer)
>>
>>
>> The handleCanceTransfer’s signature looks like this:
>>
>>  public XmlRpcResponse handleCancelTransfer(XmlRpcRequest request, IPEndPoint remoteClient)
>>
>> My code looks like this (and it’s a copy/paste with a few tweaks from here):
>>
>>     using System;
>>     using System.Collections;
>>     using System.Collections.Generic;
>>     using System.Net <http://System.Net>;
>>     using Nwc.XmlRpc;
>>     using OpenMetaverse;
>>     namespace Call_With_NWC
>>     {
>>         class MainClass
>>         {
>>             public static void Main(string[] args)
>>             {
>>                 System.Net.ServicePointManager.CertificatePolicy = new ITrustAllCertificates();
>>                 Hashtable ht = new Hashtable();
>>                 ht["remoteClient"] = new IPEndPoint(IPAddress.Parse("192.168.0.1"), 80);
>>                 ht["secureCode"] = "code";
>>                 ht["transactionID"] = UUID.Random(); // UUID Line
>>                 Console.WriteLine("New GUID: " + ht["transactionID"]);
>>                 List<Hashtable> parameters = new List<Hashtable> { ht };
>>                 XmlRpcRequest request = new XmlRpcRequest("CancelTransaction", parameters);
>>                 Hashtable response;
>>                 try {
>>     //                response = (Hashtable)request.Invoke("https://192.168.0.164:8008");
>>                     response = (Hashtable)request.Invoke("http://192.168.0.1:9000");
>>                     Console.WriteLine("It seems to have worked...");
>>                     foreach (var key in response.Keys)
>>                     {
>>                         Console.WriteLine("Key: " + key + " => " + response[key]);
>>                     }
>>                 } catch (Exception ex) {
>>                     Console.WriteLine("Got an exception:\n" + ex.ToString());
>>                 }
>>             }
>>         }
>>     }
>>
>>
>> The money server consistently complains that the secureCode and UUID are empty - when in fact…they are…because I wrote
>> up a little “Dump the request” server and get:
>>
>> Message of length 348 was defined but not a blessed scalar.
>> <?xml version="1.0" encoding="utf-8"?>
>> <methodCall>
>> <methodName>
>> CancelTransaction
>> </methodName>
>> <params>
>> <param>
>> <value>
>> <struct>
>> <member>
>> <name>
>> transactionID
>> </name>
>> <value/>
>> </member>
>> <member>
>> <name>
>> remoteClient
>> </name>
>> <value/>
>> </member>
>> <member>
>> <name>
>> secureCode
>> </name>
>> <value>
>> <string>
>> code
>> </string>
>> </value>
>> </member>
>> </struct>
>> </value>
>> </param>
>> </params>
>> </methodCall>
>>
>> In fact, the NWC-XML-RPC is behaving as though it doesn’t know how to encode anything but plain strings. The
>> transactionID should be the type OpenMetavers.UUID (which seems to be a wrapper around GUUID) and remoteClient should
>> be an IEndPoint from System.Net <http://system.net/>.
>>
>> Obviously I’m missing something but I’m not sure what.
>>
>> How does one encode OpenMetaverse and other .NET objects so that the XML-RPC client on the other end is able to decode
>> them?
>>
>> DSL
>> _______________________________________________
>> Opensim-users mailing list
>> [hidden email] <mailto:[hidden email]>
>> http://opensimulator.org/cgi-bin/mailman/listinfo/opensim-users
>
>
>
> _______________________________________________
> Opensim-users mailing list
> [hidden email]
> http://opensimulator.org/cgi-bin/mailman/listinfo/opensim-users
>


--
Justin Clark-Casey (justincc)
OSVW Consulting
http://justincc.org
http://twitter.com/justincc
_______________________________________________
Opensim-users mailing list
[hidden email]
http://opensimulator.org/cgi-bin/mailman/listinfo/opensim-users
Reply | Threaded
Open this post in threaded view
|

Re: NWC-RPC Methods Giving Odd Results

David Lloyd

Hi Justin,

> On 29 Nov 2014, at 10:14 am, Justin Clark-Casey <[hidden email]> wrote:
>
> I would suggest calling ToString() explicitly, e.g.
>
> ht["transactionID"] = UUID.Random().ToString()
>
> This is what the OpenSimulator code appears to do.
>
> On 28/11/14 23:04, David Lloyd wrote:
>>
>> The error given by the Money Server is:
>>
>> Money # 04:57:46 - [MONEY RPC]: handleCancelTransfer: Exception occurred when transaction
>> 94786877-9ed6-4d36-98d7-9a88f7b52acf: System.NullReferenceException: Object reference not set to an instance of an object
>>   at OpenSim.Grid.MoneyServer.MoneyXmlRpcModule.handleCancelTransfer (Nwc.XmlRpc.XmlRpcRequest request,
>> System.Net.IPEndPoint remoteClient) [0x00000] in <filename unknown>:0

Unfortunately, that throws the above exception.

I think I might have to delve into the source code and do something like:

IF it deserializes as an object …
  // Do stuff
ELSE attempt to parse the string as a UUID
  // Do stuff
END IF


DSL
_______________________________________________
Opensim-users mailing list
[hidden email]
http://opensimulator.org/cgi-bin/mailman/listinfo/opensim-users