(self, event: events.Event)
| 147 | |
| 148 | @expect(events.DataReceived, events.ConnectionClosed) |
| 149 | def state_query(self, event: events.Event) -> layer.CommandGenerator[None]: |
| 150 | assert isinstance(event, events.ConnectionEvent) |
| 151 | from_client = event.connection is self.context.client |
| 152 | |
| 153 | if isinstance(event, events.DataReceived): |
| 154 | msgs: List[dns.DNSMessage] = [] |
| 155 | try: |
| 156 | msgs = self.unpack_message(event.data, from_client) |
| 157 | except struct.error as e: |
| 158 | yield commands.Log(f"{event.connection} sent an invalid message: {e}") |
| 159 | yield commands.CloseConnection(event.connection) |
| 160 | self._handle_event = self.state_done |
| 161 | else: |
| 162 | for msg in msgs: |
| 163 | try: |
| 164 | flow = self.flows[msg.id] |
| 165 | except KeyError: |
| 166 | flow = dns.DNSFlow( |
| 167 | self.context.client, self.context.server, live=True |
| 168 | ) |
| 169 | self.flows[msg.id] = flow |
| 170 | if from_client: |
| 171 | yield from self.handle_request(flow, msg) |
| 172 | else: |
| 173 | yield from self.handle_response(flow, msg) |
| 174 | |
| 175 | elif isinstance(event, events.ConnectionClosed): |
| 176 | other_conn = self.context.server if from_client else self.context.client |
| 177 | if other_conn.connected: |
| 178 | yield commands.CloseConnection(other_conn) |
| 179 | self._handle_event = self.state_done |
| 180 | for flow in self.flows.values(): |
| 181 | flow.live = False |
| 182 | |
| 183 | else: |
| 184 | raise AssertionError(f"Unexpected event: {event}") |
| 185 | |
| 186 | @expect(events.DataReceived, events.ConnectionClosed) |
| 187 | def state_done(self, _) -> layer.CommandGenerator[None]: |
nothing calls this directly
no test coverage detected