def render_POST(self, request): """ Request to create a new WAMP session. """ if self._debug: log.msg("WampLongPoll: creating new session ..") payload = request.content.read() try: options = json.loads(payload) except Exception as e: return self._parent._failRequest(request, "could not parse WAMP session open request body: {0}".format(e)) if type(options) != dict: return self._parent._failRequest(request, "invalid type for WAMP session open request [was {0}, expected dictionary]".format(type(options))) if not 'protocols' in options: return self._parent._failRequest(request, "missing attribute 'protocols' in WAMP session open request") ## determine the protocol to speak ## protocol = None for p in options['protocols']: version, serializerId = parseSubprotocolIdentifier(p) if version == 2 and serializerId in self._parent._serializers.keys(): serializer = self._parent._serializers[serializerId] protocol = p break if protocol is None: return self.__failRequest(request, "no common protocol to speak (I speak: {0})".format(["wamp.2.{}".format(s) for s in self._parent._serializers.keys()])) ## make up new transport ID ## if self._parent._debug_session_id: ## use fixed transport ID for debugging purposes transport = self._parent._debug_session_id else: transport = newid() ## create instance of WampLongPollResourceSession or subclass thereof .. ## self._parent._transports[transport] = self._parent.protocol(self._parent, transport, serializer) ## create response ## self._parent._setStandardHeaders(request) request.setHeader('content-type', 'application/json; charset=utf-8') result = { 'transport': transport, 'protocol': protocol } bytes = json.dumps(result) if self._debug: log.msg("WampLongPoll: new session created on transport '{0}'".format(transport)) return bytes
def render_POST(self, request): """ Request to create a new WAMP session. """ self.log.debug("WampLongPoll: creating new session ..") payload = request.content.read() try: options = json.loads(payload) except Exception as e: return self._parent._failRequest( request, "could not parse WAMP session open request body: {0}".format( e)) if type(options) != dict: return self._parent._failRequest( request, "invalid type for WAMP session open request [was {0}, expected dictionary]" .format(type(options))) if u'protocols' not in options: return self._parent._failRequest( request, "missing attribute 'protocols' in WAMP session open request") # determine the protocol to speak # protocol = None serializer = None for p in options[u'protocols']: version, serializerId = parseSubprotocolIdentifier(p) if version == 2 and serializerId in self._parent._serializers.keys( ): serializer = self._parent._serializers[serializerId] protocol = p break if protocol is None: return self.__failRequest( request, "no common protocol to speak (I speak: {0})".format([ "wamp.2.{0}".format(s) for s in self._parent._serializers.keys() ])) # make up new transport ID # if self._parent._debug_transport_id: # use fixed transport ID for debugging purposes transport = self._parent._debug_transport_id else: transport = newid() # this doesn't contain all the info (when a header key appears multiple times) # http_headers_received = request.getAllHeaders() http_headers_received = {} for key, values in request.requestHeaders.getAllRawHeaders(): if key not in http_headers_received: http_headers_received[key] = [] http_headers_received[key].extend(values) transport_details = { u'transport': transport, u'serializer': serializer, u'protocol': protocol, u'peer': request.getClientIP(), u'http_headers_received': http_headers_received, u'http_headers_sent': None } # create instance of WampLongPollResourceSession or subclass thereof .. # self._parent._transports[transport] = self._parent.protocol( self._parent, transport_details) # create response # self._parent._setStandardHeaders(request) request.setHeader(b'content-type', b'application/json; charset=utf-8') result = {u'transport': transport, u'protocol': protocol} payload = json.dumps(result) self.log.debug( "WampLongPoll: new session created on transport '{0}'".format( transport)) return payload
def render_POST(self, request): """ Request to create a new WAMP session. """ self.log.debug("WampLongPoll: creating new session ..") payload = request.content.read().decode('utf8') try: options = json.loads(payload) except Exception: f = create_failure() self.log.error( "Couldn't parse WAMP request body: {msg}", msg=failure_message(f), ) self.log.debug("{msg}", msg=failure_format_traceback(f)) return self._parent._fail_request(request, b"could not parse WAMP session open request body") if type(options) != dict: return self._parent._fail_request(request, b"invalid type for WAMP session open request") if u'protocols' not in options: return self._parent._fail_request(request, "missing attribute 'protocols' in WAMP session open request") # determine the protocol to speak # protocol = None serializer = None for p in options[u'protocols']: version, serializerId = parseSubprotocolIdentifier(p) if version == 2 and serializerId in self._parent._serializers.keys(): serializer = self._parent._serializers[serializerId] protocol = p break if protocol is None: return self._fail_request( request, b"no common protocol to speak (I speak: {0})".format( ["wamp.2.{0}".format(s) for s in self._parent._serializers.keys()]) ) # make up new transport ID # if self._parent._debug_transport_id: # use fixed transport ID for debugging purposes transport = self._parent._debug_transport_id else: transport = generate_token(1, 12) # this doesn't contain all the info (when a header key appears multiple times) # http_headers_received = request.getAllHeaders() http_headers_received = {} for key, values in request.requestHeaders.getAllRawHeaders(): if key not in http_headers_received: http_headers_received[key] = [] http_headers_received[key].extend(values) transport_details = { u'transport': transport, u'serializer': serializer, u'protocol': protocol, u'peer': request.getClientIP(), u'http_headers_received': http_headers_received, u'http_headers_sent': None } # create instance of WampLongPollResourceSession or subclass thereof .. # self._parent._transports[transport] = self._parent.protocol(self._parent, transport_details) # create response # self._parent._set_standard_headers(request) request.setHeader(b'content-type', b'application/json; charset=utf-8') result = { u'transport': transport, u'protocol': protocol } self.log.debug( "WampLongPoll: new session created on transport" " '{transport}'".format( transport=transport, ) ) payload = json.dumps(result) return payload.encode()
def render_POST(self, request): """ Request to create a new WAMP session. """ if self._debug: log.msg("WampLongPoll: creating new session ..") payload = request.content.read() try: options = json.loads(payload) except Exception as e: return self._parent._failRequest( request, "could not parse WAMP session open request body: {0}".format( e)) if type(options) != dict: return self._parent._failRequest( request, "invalid type for WAMP session open request [was {0}, expected dictionary]" .format(type(options))) if not 'protocols' in options: return self._parent._failRequest( request, "missing attribute 'protocols' in WAMP session open request") ## determine the protocol to speak ## protocol = None serializer = None for p in options['protocols']: version, serializerId = parseSubprotocolIdentifier(p) if version == 2 and serializerId in self._parent._serializers.keys( ): serializer = self._parent._serializers[serializerId] protocol = p break if protocol is None: return self.__failRequest( request, "no common protocol to speak (I speak: {0})".format([ "wamp.2.{0}".format(s) for s in self._parent._serializers.keys() ])) ## make up new transport ID ## if self._parent._debug_transport_id: ## use fixed transport ID for debugging purposes transport = self._parent._debug_transport_id else: transport = newid() ## create instance of WampLongPollResourceSession or subclass thereof .. ## self._parent._transports[transport] = self._parent.protocol( self._parent, transport, serializer) ## create response ## self._parent._setStandardHeaders(request) request.setHeader('content-type', 'application/json; charset=utf-8') result = {'transport': transport, 'protocol': protocol} payload = json.dumps(result) if self._debug: log.msg( "WampLongPoll: new session created on transport '{0}'".format( transport)) return payload
def render_POST(self, request): """ Request to create a new WAMP session. """ if self._debug: log.msg("WampLongPoll: creating new session ..") payload = request.content.read() try: options = json.loads(payload) except Exception as e: return self._parent._failRequest(request, "could not parse WAMP session open request body: {0}".format(e)) if type(options) != dict: return self._parent._failRequest( request, "invalid type for WAMP session open request [was {0}, expected dictionary]".format(type(options)), ) if "protocols" not in options: return self._parent._failRequest(request, "missing attribute 'protocols' in WAMP session open request") # determine the protocol to speak # protocol = None serializer = None for p in options["protocols"]: version, serializerId = parseSubprotocolIdentifier(p) if version == 2 and serializerId in self._parent._serializers.keys(): serializer = self._parent._serializers[serializerId] protocol = p break if protocol is None: return self.__failRequest( request, "no common protocol to speak (I speak: {0})".format( ["wamp.2.{0}".format(s) for s in self._parent._serializers.keys()] ), ) # make up new transport ID # if self._parent._debug_transport_id: # use fixed transport ID for debugging purposes transport = self._parent._debug_transport_id else: transport = newid() # this doesn't contain all the info (when a header key appears multiple times) # http_headers_received = request.getAllHeaders() http_headers_received = {} for key, values in request.requestHeaders.getAllRawHeaders(): if key not in http_headers_received: http_headers_received[key] = [] http_headers_received[key].extend(values) transport_details = { "transport": transport, "serializer": serializer, "protocol": protocol, "peer": request.getClientIP(), "http_headers_received": http_headers_received, "http_headers_sent": None, } # create instance of WampLongPollResourceSession or subclass thereof .. # self._parent._transports[transport] = self._parent.protocol(self._parent, transport_details) # create response # self._parent._setStandardHeaders(request) request.setHeader("content-type", "application/json; charset=utf-8") result = {"transport": transport, "protocol": protocol} payload = json.dumps(result) if self._debug: log.msg("WampLongPoll: new session created on transport '{0}'".format(transport)) return payload
def render_POST(self, request): """ Request to create a new WAMP session. """ self.log.debug("WampLongPoll: creating new session ..") payload = request.content.read().decode('utf8') try: options = json.loads(payload) except Exception: f = create_failure() self.log.error( "Couldn't parse WAMP request body: {msg}", msg=failure_message(f), ) self.log.debug("{msg}", msg=failure_format_traceback(f)) return self._parent._fail_request( request, b"could not parse WAMP session open request body") if not isinstance(options, dict): return self._parent._fail_request( request, b"invalid type for WAMP session open request") if 'protocols' not in options: return self._parent._fail_request( request, "missing attribute 'protocols' in WAMP session open request") # determine the protocol to speak # protocol = None serializer = None for p in options['protocols']: version, serializerId = parseSubprotocolIdentifier(p) if version == 2 and serializerId in self._parent._serializers.keys( ): serializer = self._parent._serializers[serializerId] protocol = p break if protocol is None: return self._fail_request( request, b"no common protocol to speak (I speak: {0})".format([ "wamp.2.{0}".format(s) for s in self._parent._serializers.keys() ])) # make up new transport ID # if self._parent._debug_transport_id: # use fixed transport ID for debugging purposes transport = self._parent._debug_transport_id else: transport = generate_token(1, 12) # this doesn't contain all the info (when a header key appears multiple times) # http_headers_received = request.getAllHeaders() http_headers_received = {} for key, values in request.requestHeaders.getAllRawHeaders(): if key not in http_headers_received: http_headers_received[key] = [] http_headers_received[key].extend(values) transport_details = { 'transport': transport, 'serializer': serializer, 'protocol': protocol, 'peer': request.getClientIP(), 'http_headers_received': http_headers_received, 'http_headers_sent': None } # create instance of WampLongPollResourceSession or subclass thereof .. # self._parent._transports[transport] = self._parent.protocol( self._parent, transport_details) # create response # self._parent._set_standard_headers(request) request.setHeader(b'content-type', b'application/json; charset=utf-8') result = {'transport': transport, 'protocol': protocol} self.log.debug("WampLongPoll: new session created on transport" " '{transport}'".format(transport=transport, )) payload = json.dumps(result) return payload.encode()