<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def get_response(self):
 """ High level function for getting a response. This is what the concrete controller should call. Returns a controller specific response. """

        last_good_request = self.request
        middleware_result = None
        try:
            last_good_request, middleware_result = self.program.execute_input_middleware_stream(self.request, self)
        except GiottoException as exc:
            # save this exception so it can be re-raised from within
            # get_data_response() so that get_concrete_response() can handle it
            self.middleware_interrupt_exc = exc
            self.request = last_good_request
        else:
            self.request = middleware_result # middleware ended cleanly

        if GiottoControl in type(middleware_result).mro():
            # middleware returned a control object
            self.middleware_control = middleware_result
            self.request = last_good_request

        response = self.get_concrete_response()

        if self.persist_data:
            response = self.persist(self.persist_data, response)

        return self.program.execute_output_middleware_stream(self.request, response, self)