Commit b5f9feee authored by ORD's avatar ORD

Merge pull request #44 from alkor/refactor-server-faults

Refactor server-side service faults
parents 97d962d2 caf7f9df
...@@ -167,8 +167,7 @@ class InternalSession(object): ...@@ -167,8 +167,7 @@ class InternalSession(object):
self.logger.info("activate session") self.logger.info("activate session")
result = ua.ActivateSessionResult() result = ua.ActivateSessionResult()
if not self.state == SessionState.Created: if not self.state == SessionState.Created:
result.Results = [ua.StatusCode(ua.StatusCodes.BadSessionIdInvalid)] raise utils.ServiceError(ua.StatusCodes.BadSessionIdInvalid)
return result
result.ServerNonce = self.nonce result.ServerNonce = self.nonce
for _ in params.ClientSoftwareCertificates: for _ in params.ClientSoftwareCertificates:
result.Results.append(ua.StatusCode()) result.Results.append(ua.StatusCode())
......
...@@ -108,7 +108,17 @@ class UAProcessor(object): ...@@ -108,7 +108,17 @@ class UAProcessor(object):
def process_message(self, algohdr, seqhdr, body): def process_message(self, algohdr, seqhdr, body):
typeid = ua.NodeId.from_binary(body) typeid = ua.NodeId.from_binary(body)
requesthdr = ua.RequestHeader.from_binary(body) requesthdr = ua.RequestHeader.from_binary(body)
try:
return self._process_message(typeid, requesthdr, algohdr, seqhdr, body)
except utils.ServiceError as e:
status = ua.StatusCode(e.code)
response = ua.ServiceFault()
response.ResponseHeader.ServiceResult = status
self.logger.info("sending service fault response: %s (%s)", status.doc, status.name)
self.send_response(requesthdr.RequestHandle, algohdr, seqhdr, response)
return True
def _process_message(self, typeid, requesthdr, algohdr, seqhdr, body):
if typeid == ua.NodeId(ua.ObjectIds.CreateSessionRequest_Encoding_DefaultBinary): if typeid == ua.NodeId(ua.ObjectIds.CreateSessionRequest_Encoding_DefaultBinary):
self.logger.info("Create session request") self.logger.info("Create session request")
params = ua.CreateSessionParameters.from_binary(body) params = ua.CreateSessionParameters.from_binary(body)
...@@ -137,13 +147,8 @@ class UAProcessor(object): ...@@ -137,13 +147,8 @@ class UAProcessor(object):
params = ua.ActivateSessionParameters.from_binary(body) params = ua.ActivateSessionParameters.from_binary(body)
if not self.session: if not self.session:
#result = ua.ActivateSessionResult() self.logger.info("request to activate non-existing session")
# result.Results.append(ua.StatusCode(ua.StatusCodes.BadSessionIdInvalid)) raise utils.ServiceError(ua.StatusCodes.BadSessionIdInvalid)
response = ua.ServiceFault()
response.ResponseHeader.ServiceResult = ua.StatusCode(ua.StatusCodes.BadSessionIdInvalid)
self.logger.info("request to activate none existing session, sending service fault response")
self.send_response(requesthdr.RequestHandle, algohdr, seqhdr, response)
return True
result = self.session.activate_session(params) result = self.session.activate_session(params)
...@@ -344,9 +349,7 @@ class UAProcessor(object): ...@@ -344,9 +349,7 @@ class UAProcessor(object):
else: else:
self.logger.warning("Uknown message received %s", typeid) self.logger.warning("Uknown message received %s", typeid)
sf = ua.ServiceFault() raise utils.ServiceError(ua.StatusCodes.BadNotImplemented)
sf.ResponseHeader.ServiceResult = ua.StatusCode(ua.StatusCodes.BadNotImplemented)
self.send_response(requesthdr.RequestHandle, algohdr, seqhdr, sf)
return True return True
......
...@@ -10,6 +10,11 @@ except ImportError: ...@@ -10,6 +10,11 @@ except ImportError:
import trollius as asyncio import trollius as asyncio
from trollius import From from trollius import From
class ServiceError(Exception):
def __init__(self, code):
super(ServiceError, self).__init__('UA service error')
self.code = code
class NotEnoughData(Exception): class NotEnoughData(Exception):
pass pass
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment