QNetworkAccessManager and HTTPS
I'm getting errors making https requests with QNetworkAccessManager, but not http requests. This started happening when I upgraded from Qt 4 to Qt 5. Specifically the error is 301 QNetworkReply::ProtocolUnknownError. Thanks in advance for any help.
Did you build Qt yourself ? Do you have OpenSSL available on your system ?
What OS are you running on ? Which exact version of Qt are you using ?
Sorry, I didn't mention this before because I thought the solution would be a change in code. I'm actually running PyQt 5 provided by a 3rd party application as a means of customizing/extending its functionality. So I don't have the ability to rebuild Qt. I'm on Windows 7 and the exact version of Qt provided is 5.2.1. Am I out of luck on this one? I just needed to download thumbnails.
Wait, sorry, I've mixed two things (many OpenSSL errors lately). Isn't it just your thumbnail provider that doesn't support https ?
I suppose it is my thumbnail provider that doesn't support https. For the most part, it's just a class that inherits QNetworkAccessManager as its base class. Using the QNetworkAccessManger.get method to retrieve a thumbnail.
Does it work with http ?
Yes, it works as expected with http.
So your problem is solved :)
Then can you please update the thread title prepending [solved] so other forum users may know a solution has been found :)
Sorry, I don't understand how my problem is solved. It works with http, but I was testing it with images I don't want to download (a different unrelated website). The thumbnails I actually want to download are only available using https.
It seems we misunderstood each other.
Can you post the code you use to download the thumbnails ?
I don't have access to my work computer, so I put together a test that has the same results. You can use any image url that starts with https.
from PyQt5.QtWidgets import *
from ThumbnailManager import ThumbnailManager
app = QApplication(sys.argv)
thumbnailManager = ThumbnailManager()
urlString = r"https://developer.apple.com/design/awards/images/2014/icons/monument.jpg"
from PyQt5.QtCore import *
from PyQt5.QtNetwork import *
def downloadThumbnail(self, urlString):
url = QUrl(urlString)
request = QNetworkRequest(url)
def onFinished(self, reply):
if reply.error() != QNetworkReply.NoError:
pixmap = QPixmap()
Do stuff with pixmap
I believe you need to have OpenSSL in your PATH.
Qt uses OpenSSL for SSL-related functions, including HTTPS. However, for legal reasons, it cannot be shipped with OpenSSL libraries. Thus, users need to install OpenSSL separately.
Thanks. I'm sure this works, but I'm a complete idiot when it comes to this kind of thing. I tried one of these http://slproweb.com/products/Win32OpenSSL.html and added C:\OpenSSL-Win64\bin to my Path, but it still doesn't work.
Some things to check:
You have installed 64-bit OpenSSL, which will work with 64-bit Qt apps. Is your Qt app 64-bit?
Have you tried restarting your PC after changing your PATH?
I'm pretty sure the application is using 64-bit Qt, but just to double check, I installed both 32-bit and 64-bit OpenSSL and tried with both. I checked the Path in command prompt to make sure it was set, and I also restarted my computer.
Just to be sure, does OpenSSL have to be compiled with Qt, or can I just add the necessary dll files without a recompile?
I was looking into it some more and it looks like libcrypto and libssl are the major libraries, but I don't see them in the bin folder. Are these the necessary dlls it needs?
The official Qt packages try to load OpenSSL DLLs at runtime, so no recompilation of Qt is necessary.
I'm not familiar with how PyQt works though. Do you link your Python app with the official Qt libraries?
"This page":http://qt-project.org/doc/qt-5/ssl.html might contain a clue.
I'm pretty sure PyQt is just a layer on top of the Qt DLL files. After looking at that link, maybe the Qt version that was compiled used the -no-openssl flag. I can try asking the company about that. I appreciate all your help.
Yes, currently your best bet is to ask the provider. Good luck!