Russian Qt Forum

Qt => Работа с сетью => Тема начата: DenKor29 от Ноябрь 23, 2014, 11:59



Название: Перехват данных post запроса
Отправлено: 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;
}





Название: Re: Перехват данных post запроса
Отправлено: Old от Ноябрь 23, 2014, 20:29
А что передается в outgoingData? Валидный ли это указатель?


Название: Re: Перехват данных post запроса
Отправлено: DenKor29 от Ноябрь 24, 2014, 08:25
А что передается в outgoingData? Валидный ли это указатель?


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

Как я понимаю QNetworkManager::post это не виртуальная функция и ёё переопределить нельзя.
Получается нужно полностью писать свой класс, а не наследовать  QNetworkManager?


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


Название: Re: Перехват данных post запроса
Отправлено: DenKor29 от Ноябрь 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

Я прав ?


Название: Re: Перехват данных post запроса
Отправлено: carrygun от Ноябрь 26, 2014, 05:24
Я прав ?

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

P.S.: я поторопился, не заметил, что вы его в QWebView передаете, там он скорее всего в обычный QNAM кастуется, и, похоже, что этот метод не прокатит.