'Returns an iterator over the contents of the source (via its read
func).  There is also quite a bit of cleanup to ensure garbage
collection works and the underlying socket of the source is closed.
:param req: incoming request object
:param source: The httplib.Response object this iterator should read
from.
:param node: The node the source is reading from, for logging purposes.'

def _make_app_iter(self, req, node, source):

    ct = source.getheader('Content-Type')
    if ct:
        (content_type, content_type_attrs) = parse_content_type(ct)
        is_multipart = (content_type == 'multipart/byteranges')
    else:
        is_multipart = False
    boundary = 'dontcare'
    if is_multipart:
        boundary = dict(content_type_attrs)['boundary']
    parts_iter = self._get_response_parts_iter(req, node, source)
    def add_content_type(response_part):
        response_part['content_type'] = HeaderKeyDict(response_part['headers']).get('Content-Type')
        return response_part
    return document_iters_to_http_response_body((add_content_type(pi) for pi in parts_iter), boundary, is_multipart, self.app.logger)
