'Process a request on a file.
Return value is either a file object, or None (indicating an error).
In either case, the headers are sent.'

@gen.coroutine
def _get_file(self, path, n):

    ctype = self._guess_type(path)
    self.set_header('Last-Modified', self.date_time_string(n.mtime))
    self.set_header('Content-Type', ctype)
    size = n.size()
    self.set_header('Content-Length', str(size))
    assert (len(n.hash) == 20)
    self.set_header('Etag', n.hash.encode('hex'))
    if (self.request.method != 'HEAD'):
        f = n.open()
        try:
            it = chunkyreader(f)
            for blob in chunkyreader(f):
                self.write(blob)
        finally:
            f.close()
    raise gen.Return()
