def fetch(self, request): '''Fulfill a request. Args: request (:class:`.ftp.request.Request`): Request. Returns: .ftp.request.Response: A Response populated with the initial data connection reply. Once the response is received, call :meth:`read_content`. Coroutine. ''' response = Response() yield From(self._prepare_fetch(request, response)) response.file_transfer_size = yield From(self._fetch_size(request)) if request.restart_value: try: yield From(self._commander.restart(request.restart_value)) response.restart_value = request.restart_value except FTPServerError: _logger.debug('Could not restart file.', exc_info=1) yield From(self._open_data_stream()) command = Command('RETR', request.file_path) yield From(self._begin_stream(command)) raise Return(response)