def _send_stream_event(self, event: Shape) -> Future: headers = [Header.from_string(CONTENT_TYPE_HEADER, CONTENT_TYPE_APPLICATION_JSON), Header.from_string(SERVICE_MODEL_TYPE_HEADER, event._model_name())] payload = self._json_payload_from_shape(event) logger.debug("%r sending event APPLICATION_MESSAGE %s %r", self, headers, payload) return self._continuation.send_message( headers=headers, payload=payload, message_type=protocol.MessageType.APPLICATION_MESSAGE)
def _activate(self, request: Shape) -> Future: headers = [Header.from_string(CONTENT_TYPE_HEADER, CONTENT_TYPE_APPLICATION_JSON), Header.from_string(SERVICE_MODEL_TYPE_HEADER, request._model_name())] payload = self._json_payload_from_shape(request) logger.debug("%r sending request APPLICATION_MESSAGE %s %r", self, headers, payload) return self._continuation.activate( operation=self._model_name(), headers=headers, payload=payload, message_type=protocol.MessageType.APPLICATION_MESSAGE)
def _from_binding_msg_args(headers, payload, message_type, flags): """ Transform msg-received args that came from native, into msg-received args presented to python users. """ headers = [Header._from_binding_tuple(i) for i in headers] if payload is None: payload = b'' message_type = MessageType(message_type) return (headers, payload, message_type, flags)
def on_connection_setup(self, connection, error, **kwargs): # if error is set, socket connection failed if error: logger.error("%r failed to establish connection: %r", self.owner, error) synced = self.owner._synced with synced.lock: connect_future = synced.connect_future synced.connect_future = None synced.current_handler = None synced.close_reason = None synced.closed_future.set_exception(error) synced.state = _ClientState.DISCONNECTED # complete future after lock is released connect_future.set_exception(error) return # error is not set, so socket connection is established. # next step is to send CONNECT message try: logger.debug("%r connection established, sending CONNECT message", self.owner) # invoke callback outside of holding the lock if self.owner._connect_message_amender: amendment = self.owner._connect_message_amender() else: amendment = MessageAmendment() with self.owner._synced as synced: synced.current_connection = connection # check if close() was called before connection established if synced.state == _ClientState.DISCONNECTING: logger.debug("%r close() has been called, shutting down", self.owner) connection.close() else: headers = [Header.from_string( VERSION_HEADER, VERSION_STRING)] # don't allow amendment to override required headers existing_names = [header.name.lower() for header in headers] if amendment.headers: for header in amendment.headers: if header.name.lower() not in existing_names: headers.append(header) connection.send_protocol_message( headers=headers, payload=amendment.payload, message_type=protocol.MessageType.CONNECT) synced.state = _ClientState.WAITING_FOR_CONNECT_ACK except Exception as e: logger.debug("%r failure attempting to send CONNECT: %r", self.owner, e) with self.owner._synced as synced: synced.state = _ClientState.DISCONNECTING synced.current_connection = connection synced.close_reason = e connection.close()