forked from andreikop/python-ws-discovery
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmessage.py
More file actions
58 lines (48 loc) · 1.97 KB
/
message.py
File metadata and controls
58 lines (48 loc) · 1.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
"""Functions to serialize and deserialize messages between SOAP envelope & string representations"""
import io, sys
from .namespaces import NS_ADDRESSING, NS_SOAPENV
from .actions import *
from xml.dom import minidom
import logging
logger = logging.getLogger(__name__)
def createSOAPMessage(env):
"serialize SOAP envelopes into XML strings"
if env.getAction() == NS_ACTION_PROBE:
return createProbeMessage(env)
if env.getAction() == NS_ACTION_PROBE_MATCH:
return createProbeMatchMessage(env)
if env.getAction() == NS_ACTION_RESOLVE:
return createResolveMessage(env)
if env.getAction() == NS_ACTION_RESOLVE_MATCH:
return createResolveMatchMessage(env)
if env.getAction() == NS_ACTION_HELLO:
return createHelloMessage(env)
if env.getAction() == NS_ACTION_BYE:
return createByeMessage(env)
def parseSOAPMessage(data, ipAddr):
"deserialize XML message strings into SOAP envelope objects"
try:
dom = minidom.parseString(data)
except Exception as ex:
logger.debug('Failed to parse message from %s\n%s: %s', ipAddr, data, ex)
return None
if dom.getElementsByTagNameNS(NS_SOAPENV, "Fault"):
logger.debug('Fault received from %s: %s', ipAddr, data)
return None
actions = dom.getElementsByTagNameNS(NS_ADDRESSING, "Action")
if len(actions) == 0:
logger.warning('No action received from %s: %s', ipAddr, data)
return None
soapAction = actions[0].firstChild.data.strip()
if soapAction == NS_ACTION_PROBE:
return parseProbeMessage(dom)
elif soapAction == NS_ACTION_PROBE_MATCH:
return parseProbeMatchMessage(dom)
elif soapAction == NS_ACTION_RESOLVE:
return parseResolveMessage(dom)
elif soapAction == NS_ACTION_RESOLVE_MATCH:
return parseResolveMatchMessage(dom)
elif soapAction == NS_ACTION_BYE:
return parseByeMessage(dom)
elif soapAction == NS_ACTION_HELLO:
return parseHelloMessage(dom)