Russian Qt Forum
Март 29, 2024, 08:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Перехват данных post запроса  (Прочитано 4456 раз)
DenKor29
Гость
« : Ноябрь 23, 2014, 11:59 »

Мне нужно перехватить данные post запроса.

Но если я пытаюсь прочитать данные из outgoingData (закоментированная строка) программа падает ...
Как правильно нужно перехвать данные из устройства QIODevice

Код:
QNetworkReply *InterceptorAccessManager::createRequest(Operation op, const QNetworkRequest &request,
                                                       QIODevice *outgoingData)
{

    QNetworkReply *real;
    QByteArray* postdata;
    QByteArray* reqtdata;

    NetworkReplyProxy *proxy;



    if (isResourceNeeded(request))
    {

        postdata = new QByteArray(); reqtdata = new QByteArray();

        //*postdata = outgoingData->peek(outgoingData->size());
        (*reqtdata)="\r\n";(*postdata)="\r\n";

        QList<QByteArray> headers = request.rawHeaderList();
        foreach(QByteArray req, headers)
        {
            QByteArray header = request.rawHeader(req);
            (*reqtdata)+=req+":"+header+"\r\n";
        }


        real = QNetworkAccessManager::createRequest(op, request, outgoingData);
        proxy = new NetworkReplyProxy(this, real,reqtdata,postdata);

        emit pendingReplyProxy(proxy);
        return proxy;
    }
    else
    {
        real =  QNetworkAccessManager::createRequest(op, request, outgoingData);
    }


    return real;
}



Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #1 : Ноябрь 23, 2014, 20:29 »

А что передается в outgoingData? Валидный ли это указатель?
Записан
DenKor29
Гость
« Ответ #2 : Ноябрь 24, 2014, 08:25 »

А что передается в outgoingData? Валидный ли это указатель?


Указатель действительно был неправильный. Как я понял для POST запросов он всегда Null.
Код поправил и программа не падает.Остался вопрос как нужно перехватывать данные post запроса.

Как я понимаю QNetworkManager::post это не виртуальная функция и ёё переопределить нельзя.
Получается нужно полностью писать свой класс, а не наследовать  QNetworkManager?
Записан
carrygun
Гость
« Ответ #3 : Ноябрь 24, 2014, 11:49 »

Ну почему же? Наследуетесь и пишете что-то в духе (псевдокод):
Код
C++ (Qt)
*QNetworkReply MyManager::post(...request, ...postdata)
{
   ... //Тут можно, например, выбросить сигнал с postdata.
   return QNetworkAccessManager::post(request, postdata);
}
 
« Последнее редактирование: Ноябрь 24, 2014, 11:53 от carrygun » Записан
DenKor29
Гость
« Ответ #4 : Ноябрь 25, 2014, 16:35 »

Ну почему же? Наследуетесь и пишете что-то в духе (псевдокод):
Код
C++ (Qt)
*QNetworkReply MyManager::post(...request, ...postdata)
{
   ... //Тут можно, например, выбросить сигнал с postdata.
   return QNetworkAccessManager::post(request, postdata);
}
 

Код:
   view = new QWebView(this);
    interceptor = new InterceptorAccessManager(this);
    view->page()->setNetworkAccessManager(interceptor);
    interceptor->setUrlMask(QRegExp("*.php", Qt::CaseInsensitive, QRegExp::Wildcard));

    view->load(url);
    connect(view, SIGNAL(loadFinished(bool)), SLOT(adjustLocation()));
    connect(view, SIGNAL(titleChanged(QString)), SLOT(adjustTitle()));
    connect(view, SIGNAL(loadProgress(int)), SLOT(setProgress(int)));
    connect(view, SIGNAL(loadFinished(bool)), SLOT(finishLoading(bool)));

    connect(interceptor, SIGNAL(pendingReplyProxy(NetworkReplyProxy*)),SLOT(processCustomReply(NetworkReplyProxy*)));

Как я понимаю если я создам виртуальный метод post , то QWebView будет работать неправильно ?
view в лучшем случае будет вызывать метод QNetworkAccessManager::post. Про мой метод он ничего не знает, так как QNetworkAccessManager::post не виртуальный.

Мой переопределеный метод будет вызываться только из моих процедур где я буду вызывать InterceptorAccessManager::post

Я прав ?
« Последнее редактирование: Ноябрь 25, 2014, 16:38 от DenKor29 » Записан
carrygun
Гость
« Ответ #5 : Ноябрь 26, 2014, 05:24 »

Я прав ?

Нет. Если вы в InterceptorAccessManager переопределите post() как я показал, то будет вызываться ваша реализация + стандартная: return QNetworkAccessManager::post(request, postdata);. За это время можно было уже проверить несколько раз.

P.S.: я поторопился, не заметил, что вы его в QWebView передаете, там он скорее всего в обычный QNAM кастуется, и, похоже, что этот метод не прокатит.
« Последнее редактирование: Ноябрь 26, 2014, 05:57 от carrygun » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.185 секунд. Запросов: 22.