Web lists-archives.com

KIO and cookies




Hello to everyone,
I'm working on making QWebEngine work correctly in Konqueror when downloading 
files (although I didn't have much time to spend on this in the last months). 

The problem is that instead of downloading the correct files, in some cases 
Konqueror download html files. This only happens from sites requiring 
authentication (I first noticed when trying to download a file from my bank's 
web page); besides, it only happens if I try to use KIO for the download, for 
example calling KIO::copy from a slot connected with 
QWebEngineProfile::downloadRequested. The file downloads correctly if Konqueror 
downloads it using the mechanism provided by QWebEngine, that is calling 
QWebEngineDownloaditem::accept.

I believe that the issue is caused by cookies, and in particular by the fact 
that QWebEngine doesn't share its cookies with KIO so that, when KIO attempts 
to download the file, it doesn't have the cookie(s) associated with the session 
opened in the browser and the web page refuses to let it download the file 
(indeed, one of the sites where this happens returned a login page instead of 
the PDF I wanted to download).

Looking at the documentation both for QWebEngine and for KIO 
regarding cookies. I found out two classes:
* on QWebEngine's side, there's QWebEngineCookieStore, which provides signals 
emitted whenever a cookie is added or removed and which, according to 
documentation [1], "can be used to synchronize cookies of Chromium and the 
QNetworkAccessManager"
* on KIO's side, there's KIO::Integration::AccessManager, which derives from 
QNetworkAccessManager and which should work along QWebEngineCookieStore.

The example in the documentation for KIO::Integration::AccessManager refers to 
QWebView and says to call QWebPage::setNetworkAccessManager to have the 
QWebView and KIO to use the same access manager. Unfortunately, QWebEngine 
can't be integrated with a QNetworkAccessManager: not only QWebEnginePage 
doesn't have a setNetworkAccessManager method, but the documentation for 
QWebEngine explicitly says that it doesn't use QNetworkAccess. Because of 
this, I thought to do things the other way round: I created a 
KIO::Integration::AccessManager and, used slots connected with 
QWebEngineCookieStore signals, to add cookies to it.

Unfortunately, this doesn't fix the issue. I believe this is because I haven't 
told KIO to use the new access manager. The problem is that I can see any way 
to do it. Does anyone have suggestions on how to do this?

Thanks

Stefano

[1] http://doc.qt.io/qt-5/qwebenginecookiestore.html#details