Skip to content

Commit e7de42b

Browse files
Added some exception handling for XML data that has too large of an INT in it. #2201
1 parent deaa4eb commit e7de42b

File tree

3 files changed

+68
-19
lines changed

3 files changed

+68
-19
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,49 @@
11
getInvoiceTopLevelItems = [
22
{
3-
'categoryCode': 'sov_sec_ip_addresses_priv',
4-
'createDate': '2018-04-04T23:15:20-06:00',
5-
'description': '64 Portable Private IP Addresses',
6-
'id': 724951323,
7-
'oneTimeAfterTaxAmount': '0',
8-
'recurringAfterTaxAmount': '0',
9-
'hostName': 'bleg',
10-
'domainName': 'beh.com',
11-
'category': {'name': 'Private (only) Secondary VLAN IP Addresses'},
12-
'children': [
3+
"categoryCode": "sov_sec_ip_addresses_priv",
4+
"createDate": "2018-04-04T23:15:20-06:00",
5+
"description": "64 Portable Private IP Addresses",
6+
"id": 724951323,
7+
"oneTimeAfterTaxAmount": "0",
8+
"recurringAfterTaxAmount": "0",
9+
"hostName": "bleg",
10+
"domainName": "beh.com",
11+
"category": {"name": "Private (only) Secondary VLAN IP Addresses"},
12+
"children": [
1313
{
14-
'id': 12345,
15-
'category': {'name': 'Fake Child Category'},
16-
'description': 'Blah',
17-
'oneTimeAfterTaxAmount': 55.50,
18-
'recurringAfterTaxAmount': 0.10
14+
"id": 12345,
15+
"category": {"name": "Fake Child Category"},
16+
"description": "Blah",
17+
"oneTimeAfterTaxAmount": 55.50,
18+
"recurringAfterTaxAmount": 0.10
1919
}
2020
],
21-
'location': {'name': 'fra02'}
21+
"location": {"name": "fra02"}
22+
},
23+
{
24+
"categoryCode": "reserved_capacity",
25+
"createDate": "2024-07-03T22:08:36-07:00",
26+
"description": "B1.1x2 (1 Year Term) (721hrs * .025)",
27+
"id": 1111222,
28+
"oneTimeAfterTaxAmount": "0",
29+
"recurringAfterTaxAmount": "18.03",
30+
"category": {"name": "Reserved Capacity"},
31+
"children": [
32+
{
33+
"description": "1 x 2.0 GHz or higher Core",
34+
"id": 29819,
35+
"oneTimeAfterTaxAmount": "0",
36+
"recurringAfterTaxAmount": "10.00",
37+
"category": {"name": "Computing Instance"}
38+
},
39+
{
40+
"description": "2 GB",
41+
"id": 123456,
42+
"oneTimeAfterTaxAmount": "0",
43+
"recurringAfterTaxAmount": "2.33",
44+
"category": {"name": "RAM"}
45+
}
46+
],
47+
"location": {"name": "dal10"}
2248
}
2349
]

SoftLayer/testing/xmlrpc.py

+24-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,20 @@
33
~~~~~~~~~~~~~~~~~~~~~~~~
44
XMP-RPC server which can use a transport to proxy requests for testing.
55
6+
If you want to spin up a test XML server to make fake API calls with, try this:
7+
8+
quick-server.py
9+
---
10+
import SoftLayer
11+
from SoftLayer.testing import xmlrpc
12+
13+
my_xport = SoftLayer.FixtureTransport()
14+
my_server = xmlrpc.create_test_server(my_xport, "localhost", port=4321)
15+
print(f"Server running on http://{my_server.server_name}:{my_server.server_port}")
16+
---
17+
$> python quick-server.py
18+
$> curl -X POST -d "<?xml version='1.0' encoding='iso-8859-1'?><methodCall><methodName>getInvoiceTopLevelItems</methodName><params><param><value><struct><member><name>headers</name><value><struct><member><name>SoftLayer_Billing_InvoiceInitParameters</name><value><struct><member><name>id</name><value><string>1234</string></value></member></struct></value></member></struct></value></member></struct></value></param></params></methodCall>" http://127.0.0.1:4321/SoftLayer_Billing_Invoice
19+
620
:license: MIT, see LICENSE for more details.
721
"""
822
import http.server
@@ -60,6 +74,7 @@ def do_POST(self):
6074
self.send_response(200)
6175
self.send_header("Content-type", "application/xml; charset=UTF-8")
6276
self.end_headers()
77+
6378
try:
6479
self.wfile.write(response_body.encode('utf-8'))
6580
except UnicodeDecodeError:
@@ -78,9 +93,16 @@ def do_POST(self):
7893
response = xmlrpc.client.Fault(ex.faultCode, str(ex.reason))
7994
response_body = xmlrpc.client.dumps(response, allow_none=True, methodresponse=True)
8095
self.wfile.write(response_body.encode('utf-8'))
81-
except Exception:
96+
except OverflowError as ex:
97+
self.send_response(555)
98+
self.send_header("Content-type", "application/xml; charset=UTF-8")
99+
self.end_headers()
100+
response_body = '''<error>OverflowError in XML response.</error>'''
101+
self.wfile.write(response_body.encode('utf-8'))
102+
logging.exception(f"Error while handling request: {str(ex)}")
103+
except Exception as ex:
82104
self.send_response(500)
83-
logging.exception("Error while handling request")
105+
logging.exception(f"Error while handling request: {str(ex)}")
84106

85107
def log_message(self, fmt, *args):
86108
"""Override log_message."""

SoftLayer/transports/xmlrpc.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,8 @@ def __call__(self, request):
121121
_ex = error_mapping.get(ex.faultCode, exceptions.SoftLayerAPIError)
122122
raise _ex(ex.faultCode, ex.faultString) from ex
123123
except requests.HTTPError as ex:
124-
raise exceptions.TransportError(ex.response.status_code, str(ex))
124+
err_message = f"{str(ex)} :: {ex.response.content}"
125+
raise exceptions.TransportError(ex.response.status_code, err_message)
125126
except requests.RequestException as ex:
126127
raise exceptions.TransportError(0, str(ex))
127128

0 commit comments

Comments
 (0)