[Development] [API Change] New authentication method in QNetworkAccessManager

Kurt Pattyn pattyn.kurt at gmail.com
Sun Mar 9 21:10:31 CET 2014


On 09 Mar 2014, at 19:32, Olivier Goffart <olivier at woboq.com> wrote:

> On Sunday 09 March 2014 15:10:02 Kurt Pattyn wrote:
>> Currently, QNAM stalls when authentication is required (also see:
>> https://bugreports.qt-project.org/browse/QTBUG-16251). Also, the connection
>> between the authenticationRequired signal and the slot must be a direct
>> connection. This is problematic when an application wants to show a login
>> dialogbox for instance.
>> 
>> I propose to change this implementation by using a delegate authenticator
>> instead.
> ...
>> What are your opinions on this?
> 
> 1) Your suggested change would be binary incompatible.  You would need to pick 
> another class name than QAuthenticator
> 
> 2) Your change does not seem to fix the problem at all.  You get a "blocking" 
> virtual function instead of a "blocking" signal.
> 
> 
> Here is my suggested API change:  adding  QNetworkReply::pause and 
> QNetworkReply::resumeAuthentication,  to be used as this.
> 
> 
> QObject::connect(qnam, &QNetworkManager::authenticationRequired,
>                 [](QNetworkReply * reply, QAuthenticator * authenticator) {
>  reply->pause(); // New slot: when we return this function it won't continue
>  auto dialog = new MyPasswordDialog();
>  dialog->open();
>  QObject::connect(dialog, &MyPasswordDialog::done, reply, [=]{
>    authenticator->setUser(dialog->user);
>    authenticator->setPassword(dialog->password);
>    reply->resumeAuthentication(authenticator); //new slot;
>  });
> });
> 
> 
> Alternative: adding those function to the QAuthenticator itself.

I think it does solve the problem if QNAM would be changed like this:

if (networkRequest->hasAuthenticator())
    connect(networkRequest->authenticator(), &QAuthenticator::authenticated,
            this, &QNAM::goToNextStep);
...

if (authenticationNeeded)
    if (networkRequest->hasAuthenticator())
        QMetaMethod::invoke(“authenticate" , networkRequest, ..., QueuedConnection);
    else
        //authentication failed
else
    goToNextStep();
...

Q_SLOTS:
    void goToNextStep() {
       ...
    }

The handling of incoming data would basically be split in two parts. When authentication is needed,
a queued metacall is invoked which makes it asynchronous.

> 
> -- 
> Olivier 
> 
> Woboq - Qt services and support - http://woboq.com - http://code.woboq.org
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/development/attachments/20140309/d32e57d5/attachment.html>


More information about the Development mailing list