Exemplo n.º 1
0
   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
Exemplo n.º 2
0
    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
Exemplo n.º 3
0
    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()
Exemplo n.º 4
0
    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
Exemplo n.º 5
0
    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
Exemplo n.º 6
0
    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()