I know this is an old question, bit I thought I would answer to help those who might still be seeing this question.
Ever since Python version 3.5.2 (release ~June 2016) the http.client.HTTPConnection.debuglevel
is entirely ignored in favor of the debuglevel
constructor argument for urllib.request.HTTPHandler
.
This is due to this change that sets the value of http.client.HTTPConnection.debuglevel
to whatever is set in urllib.request.HTTPHandler
's constructor argument debuglevel
, on this line.
A PR has been opened to fix this, but in the mean time you can either do one of two things:
You can use the constructor argument for HTTPHandler
and HTTPSHandler
(as demonstrated in this SO answer):
import urllib.request
handler = urllib.request.HTTPHandler(debuglevel=10)
opener = urllib.request.build_opener(handler)
content = opener.open('http://stackoverflow.com').read()
print(content[0:120])
You can also monkey patch the __init__
methods of HTTPHandler
and HTTPSHandler
to respect the global values like so:
https_old_init = urllib.request.HTTPSHandler.__init__
def https_new_init(self, debuglevel=None, context=None, check_hostname=None):
debuglevel = debuglevel if debuglevel is not None else http.client.HTTPSConnection.debuglevel
https_old_init(self, debuglevel, context, check_hostname)
urllib.request.HTTPSHandler.__init__ = https_new_init
http_old_init = urllib.request.HTTPHandler.__init__
def http_new_init(self, debuglevel=None):
debuglevel = debuglevel if debuglevel is not None else http.client.HTTPSConnection.debuglevel
http_old_init(self, debuglevel)
urllib.request.HTTPHandler.__init__ = http_new_init
Note: I don't recommend setting the debuglevel
in HTTPHandler
's as a method argument default value because the default values for method arguments get evaluated at function definition evaluation time, which, for HTTPHandler
's constructor, is when the module urllib.request
is imported.