Название: QNAM после неудачной попытки загрузки с ftp, следюущие запросы с ошибкой
Отправлено: Fregloin от Декабрь 27, 2013, 17:05
Привет. Есть ftp сервер, на котором есть файл-описатель, в котором хранится список пар ключ-значение, ключ - название файла xml, значение - его название на русском. Есть каталог files, в котором располагаются нужные xml. root | +-filelist.json | +files (папка) | - 1.xml - 2.xml ... - n.xml Клиент сначала с помощью get запроса получает файл filelist.json. после парсинга юзеру отображается окно, в котором он может выбрать нужный файл. Дальше идет второй запрос get уже с полным путем к файлу. Так вот, если все файлы на своих местах, все работает. Если же какой то файл отсюстствует или не найден в папке files, то QNAM возвращает ошибку : couldn't get file size. Правильно. Но, теперь когда я хочу заново получить список файлов filelist.json (который есть и никуда не девался) я получаю эту ошибку и для этого запроса. Если файл вернуть на место, все ок. Т.е. ошибка для предыдущего запроса влияет на следующий. Привожу код: //запрос filelist.json void CRemoteConfigurationManager::requestFileList() { RemoteConfigurationManagerErorr e = checkUrlParts(); if(e!=noError) { emit error(e); return; } static const QString fileListRequestTemplate("ftp://%1:%2@%3/filelist.json"); fcurrentFile.clear(); QUrl url(fileListRequestTemplate.arg(fuser).arg(fpassword).arg(fhost)); QNetworkRequest request(url); QNetworkReply * reply = fmanager.get(request); connect(reply,SIGNAL(finished()),this,SLOT(fileListReplyFinished())); connect(reply,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(processReplyError(QNetworkReply::NetworkError))); } //filelist parse void CRemoteConfigurationManager::fileListReplyFinished() { QNetworkReply * reply = qobject_cast<QNetworkReply*>(sender()); Q_ASSERT(reply); if(reply->error()==QNetworkReply::NoError) { QByteArray data = reply->readAll();
QJsonParseError jsonError; QJsonDocument doc = doc.fromJson(data,&jsonError); if(jsonError.error==QJsonParseError::NoError) { QJsonObject rootObject = doc.object(); QJsonObject filelistObject = rootObject.value("filelist").toObject(); if(!filelistObject.isEmpty()) { QJsonArray array = filelistObject.value("files").toArray(); QList<CRemoteFileItem> filelist; foreach (const QJsonValue & jsonValue, array) { QJsonObject o = jsonValue.toObject(); if(!o.isEmpty()) { CRemoteFileItem item; item.setFileName(o.value("filename").toString()); item.setDescription(o.value("description").toString()); filelist<<item; } } emit fileListReceived(filelist); } } else { emit error(fileListParseError); } } reply->deleteLater(); } //error process void CRemoteConfigurationManager::processReplyError(QNetworkReply::NetworkError) { QNetworkReply * reply = qobject_cast<QNetworkReply*>(sender()); Q_ASSERT(reply); emit replyError(reply); reply->deleteLater(); } //скачка нужного файла void CRemoteConfigurationManager::getFile(const QString &fileName) { RemoteConfigurationManagerErorr e = checkUrlParts(); if(e!=noError) { emit error(e); return; } if(fileName.isEmpty()) { emit error(fileNameIsEmpty); return; } fcurrentFile = fileName; static const QString fileRequestTemplate("ftp://%1:%2@%3/stations/%4"); QUrl url(fileRequestTemplate.arg(fuser).arg(fpassword).arg(fhost).arg(fileName)); QNetworkRequest request(url); QNetworkReply * downloadReply = fmanager.get(request); connect(downloadReply,SIGNAL(finished()),this,SLOT(fileDownloadReplyFinished())); connect(downloadReply,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(processReplyError(QNetworkReply::NetworkError))); connect(downloadReply,SIGNAL(downloadProgress(qint64,qint64)),this,SIGNAL(fileReceiveProgress(qint64,qint64))); }
Название: Re: QNAM после неудачной попытки загрузки с ftp, следюущие запросы с ошибкой
Отправлено: Fregloin от Декабрь 27, 2013, 18:02
PS. При перезапуске приложения, впервый раз filelist скачивается, после ошибки чтения несуществубщего файла картина повторяется до последующего перезапуска.
Название: Re: QNAM после неудачной попытки загрузки с ftp, следюущие запросы с ошибкой
Отправлено: Fregloin от Декабрь 27, 2013, 18:22
После гугления понял, что если происходит такая ошибка, следующие запросы будут с ошибками. Пришлось размещать QNAM в куче, при ошибке его удалять, и создавать заново - зато работает.
|