# Buggy code
def is_closed(self, stream_id: int) -> bool:
    """Check if a non-idle stream is closed"""
    stream = self.h2_conn.streams.get(stream_id, None)
    if stream is not None:
        return stream.closed
    else:
        return True


# Traceback (AttributeError)
127.0.0.1:49187: mitmproxy has crashed!
Traceback (most recent call last):
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/server.py", line 276, in server_event
for command in layer_commands:
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/layer.py", line 114, in handle_event
yield from self.__process(command_generator)
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/layer.py", line 142, in __process
command = next(command_generator)
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/layer.py", line 186, in handle_event
yield from self._handle(event)
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/layer.py", line 114, in handle_event
yield from self.__process(command_generator)
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/layer.py", line 142, in __process
command = next(command_generator)
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/layers/http/__init__.py", line 570, in _handle_event
yield from self.event_to_child(stream, event)
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/layers/http/__init__.py", line 586, in event_to_child
for command in child.handle_event(event):
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/layer.py", line 114, in handle_event
yield from self.__process(command_generator)
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/layer.py", line 142, in __process
command = next(command_generator)
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/layers/http/__init__.py", line 488, in passthrough
for command in self.child_layer.handle_event(event):
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/layer.py", line 114, in handle_event
yield from self.__process(command_generator)
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/layer.py", line 142, in __process
command = next(command_generator)
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/tunnel.py", line 85, in _handle_event
yield from self.event_to_child(event)
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/tunnel.py", line 104, in event_to_child
for command in self.child_layer.handle_event(event):
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/layer.py", line 114, in handle_event
yield from self.__process(command_generator)
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/layer.py", line 142, in __process
command = next(command_generator)
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/tunnel.py", line 85, in _handle_event
yield from self.event_to_child(event)
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/tunnel.py", line 104, in event_to_child
for command in self.child_layer.handle_event(event):
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/layer.py", line 114, in handle_event
yield from self.__process(command_generator)
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/layer.py", line 142, in __process
command = next(command_generator)
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/layers/http/__init__.py", line 570, in _handle_event
yield from self.event_to_child(stream, event)
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/layers/http/__init__.py", line 601, in event_to_child
yield from self.event_to_child(conn, command.event)
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/layers/http/__init__.py", line 586, in event_to_child
for command in child.handle_event(event):
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/layer.py", line 114, in handle_event
yield from self.__process(command_generator)
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/layer.py", line 123, in __process
command = command_generator.send(send)
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/layers/http/_http2.py", line 266, in _handle_event
yield from super()._handle_event(event)
File "/mnt/c/Users/user/git/mitmproxy/mitmproxy/proxy/layers/http/_http2.py", line 91, in _handle_event
if stream.state_machine.state is not h2.stream.StreamState.CLOSED:
AttributeError: 'NoneType' object has no attribute 'state_machine'

# Fixed code
def is_closed(self, stream_id: int) -> bool:
    """Check if a non-idle stream is closed"""
    stream = self.h2_conn.streams.get(stream_id, None)
    if (
        stream is not None
        and stream.state_machine.state is not h2.stream.StreamState.CLOSED
    ):
        return False
    else:
        return True