# Buggy code
def ask_save_body(scope, flow):
    """
    Save either the request or the response body to disk.

    scope: re_q_uest, re_s_ponse, _b_oth, None (ask user if necessary)
    """

    request_has_content = flow.request and flow.request.raw_content
    response_has_content = flow.response and flow.response.raw_content

    if scope is None:
        ask_scope_and_callback(flow, ask_save_body)
    elif scope == "q" and request_has_content:
        ask_save_path(flow.request.get_content(strict=False), "Save request content to")
    elif scope == "s" and response_has_content:
        ask_save_path(
            flow.response.get_content(strict=False), "Save response content to"
        )
    elif scope == "b" and request_has_content and response_has_content:
        ask_save_path(
            (
                flow.request.get_content(strict=False)
                + "\n"
                + flow.response.get_content(strict=False)
            ),
            "Save request & response content to",
        )
    else:
        signals.status_message.send(message="No content.")


# Traceback (TypeError)
Traceback (most recent call last):
File "/media/sf_git/mitmproxy/mitmproxy/console/master.py", line 502, in run
self.loop.run()
File "/usr/local/lib/python3.5/dist-packages/urwid/main_loop.py", line 278, in run
self._run()
File "/usr/local/lib/python3.5/dist-packages/urwid/main_loop.py", line 376, in _run
self.event_loop.run()
File "/usr/local/lib/python3.5/dist-packages/urwid/main_loop.py", line 682, in run
self._loop()
File "/usr/local/lib/python3.5/dist-packages/urwid/main_loop.py", line 719, in _loop
self._watch_files[fd]()
File "/usr/local/lib/python3.5/dist-packages/urwid/raw_display.py", line 393, in <lambda>
event_loop, callback, self.get_available_raw_input())
File "/usr/local/lib/python3.5/dist-packages/urwid/raw_display.py", line 493, in parse_input
callback(processed, processed_codes)
File "/usr/local/lib/python3.5/dist-packages/urwid/main_loop.py", line 403, in _update
self.process_input(keys)
File "/usr/local/lib/python3.5/dist-packages/urwid/main_loop.py", line 503, in process_input
k = self._topmost_widget.keypress(self.screen_size, k)
File "/media/sf_git/mitmproxy/mitmproxy/console/window.py", line 42, in keypress
k = super(self.__class__, self).keypress(size, k)
File "/usr/local/lib/python3.5/dist-packages/urwid/container.py", line 1116, in keypress
return self.footer.keypress((maxcol,),key)
File "/media/sf_git/mitmproxy/mitmproxy/console/statusbar.py", line 134, in keypress
return self.master.ab.keypress(*args, **kwargs)
File "/media/sf_git/mitmproxy/mitmproxy/console/statusbar.py", line 87, in keypress
self.prompt_execute(k)
File "/media/sf_git/mitmproxy/mitmproxy/console/statusbar.py", line 112, in prompt_execute
msg = p(txt, *args)
File "/media/sf_git/mitmproxy/mitmproxy/console/common.py", line 296, in ask_save_body
(flow.request.get_content(strict=False) + "\n" +
TypeError: can't concat bytes to str

# Fixed code
def ask_save_body(scope, flow):
    """
    Save either the request or the response body to disk.

    scope: re_q_uest, re_s_ponse, _b_oth, None (ask user if necessary)
    """

    request_has_content = flow.request and flow.request.raw_content
    response_has_content = flow.response and flow.response.raw_content

    if scope is None:
        ask_scope_and_callback(flow, ask_save_body)
    elif scope == "q" and request_has_content:
        ask_save_path(flow.request.get_content(strict=False), "Save request content to")
    elif scope == "s" and response_has_content:
        ask_save_path(
            flow.response.get_content(strict=False), "Save response content to"
        )
    elif scope == "b" and request_has_content and response_has_content:
        ask_save_path(
            (
                flow.request.get_content(strict=False)
                + b"\n"
                + flow.response.get_content(strict=False)
            ),
            "Save request & response content to",
        )
    else:
        signals.status_message.send(message="No content.")