示例#1
0
 def test_dump_fault(self):
     f = xmlrpclib.Fault(42, 'Test Fault')
     s = xmlrpclib.dumps((f, ))
     (newf, ), m = xmlrpclib.loads(s)
     self.assertEqual(newf, {'faultCode': 42, 'faultString': 'Test Fault'})
     self.assertEqual(m, None)
     s = xmlrpclib.Marshaller().dumps(f)
     self.assertRaises(xmlrpclib.Fault, xmlrpclib.loads, s)
示例#2
0
    def test_dump_double(self):
        xmlrpclib.dumps((float(2**34), ))
        xmlrpclib.dumps((float(xmlrpclib.MAXINT), float(xmlrpclib.MININT)))
        xmlrpclib.dumps(
            (float(xmlrpclib.MAXINT + 42), float(xmlrpclib.MININT - 42)))

        def dummy_write(s):
            pass

        m = xmlrpclib.Marshaller()
        m.dump_double(xmlrpclib.MAXINT, dummy_write)
        m.dump_double(xmlrpclib.MININT, dummy_write)
        m.dump_double(xmlrpclib.MAXINT + 42, dummy_write)
        m.dump_double(xmlrpclib.MININT - 42, dummy_write)
示例#3
0
    def test_dump_big_int(self):
        if sys.maxsize > 2**31 - 1:
            self.assertRaises(OverflowError, xmlrpclib.dumps, (int(2**34), ))
        xmlrpclib.dumps((xmlrpclib.MAXINT, xmlrpclib.MININT))
        self.assertRaises(OverflowError, xmlrpclib.dumps,
                          (xmlrpclib.MAXINT + 1, ))
        self.assertRaises(OverflowError, xmlrpclib.dumps,
                          (xmlrpclib.MININT - 1, ))

        def dummy_write(s):
            pass

        m = xmlrpclib.Marshaller()
        m.dump_int(xmlrpclib.MAXINT, dummy_write)
        m.dump_int(xmlrpclib.MININT, dummy_write)
        self.assertRaises(OverflowError, m.dump_int, xmlrpclib.MAXINT + 1,
                          dummy_write)
        self.assertRaises(OverflowError, m.dump_int, xmlrpclib.MININT - 1,
                          dummy_write)
示例#4
0
def dumps(params,
          methodname=None,
          methodresponse=None,
          encoding=None,
          allow_none=False):
    """data [,options] -> marshalled data

    Convert an argument tuple or a Fault instance to an XML-RPC
    request (or response, if the methodresponse option is used).

    In addition to the data object, the following options can be given
    as keyword arguments:

        methodname: the method name for a methodCall packet

        methodresponse: true to create a methodResponse packet.
        If this option is used with a tuple, the tuple must be
        a singleton (i.e. it can contain only one element).

        encoding: the packet encoding (default is UTF-8)

    All byte strings in the data structure are assumed to use the
    packet encoding.  Unicode strings are automatically converted,
    where necessary.
    """

    assert isinstance(
        params,
        (tuple, client.Fault)), "argument must be tuple or Fault instance"
    if isinstance(params, client.Fault):
        methodresponse = 1
    elif methodresponse and isinstance(params, tuple):
        assert len(params) == 1, "response tuple must be a singleton"

    if not encoding:
        encoding = "utf-8"

    if client.FastMarshaller:
        m = client.FastMarshaller(encoding)
    else:
        m = client.Marshaller(encoding, allow_none)

    data = m.dumps(params)

    if encoding != "utf-8":
        xmlheader = "<?xml version='1.0' encoding='%s'?>\n" % str(encoding)
    else:
        xmlheader = "<?xml version='1.0'?>\n"  # utf-8 is default

    # standard XML-RPC wrappings
    if methodname:
        # a method call
        data = (xmlheader, "<!--protocolVersion=\"2.1\"-->\n"
                "<methodCall>\n"
                "<methodName>", methodname, "</methodName>\n", data,
                "</methodCall>\n")
    elif methodresponse:
        # a method response, or a fault structure
        data = (xmlheader, "<methodResponse>\n", data, "</methodResponse>\n")
    else:
        return data  # return as is
    return "".join(data)