'Http message is not callable porting python2 to python3 download script

i'am trying to port to python 3 this script :

import re 

from os.path import basename
import os
from urllib.parse import urlparse,urlsplit
from urllib.request import urlopen,Request
import urllib 
def url2name(url):
    return basename(urlsplit(url)[2])

def download(url, out_path="."):
    localName = url2name(url)
    req = Request(url)
    r = urlopen(req)
    if r.info().has_key('Content-Disposition'):
        # If the response has Content-Disposition, we take file name from it
        localName = r.info()['Content-Disposition'].split('filename=')[1]
        if localName[0] == '"' or localName[0] == "'":
            localName = localName[1:-1]
    elif r.url != url: 
        # if we were redirected, the real file name we take from the final URL
        localName = url2name(r.url)

    localName = os.path.join(out_path, localName)
    f = open(localName, 'wb')
    f.write(r.read())
    f.close()

but i have a :

'HTTPMessage' object is not callable

r.info() seems to have problems

how to get the header info in python 3 ?



Solution 1:[1]

Try with this, you should use context managers:

def download(url, out_path="."):
    localName = url2name(url)
    req = Request(url)
    with urlopen(req) as f:
        content_disp = f.getheader('Content-Disposition')
        if content_disp:
            # If the response has Content-Disposition, we take file name from it
            localName = content_disp.split('filename=')[1]
            if localName[0] == '"' or localName[0] == "'":
                localName = localName[1:-1]
        elif f.url != url:
            # if we were redirected, the real file name we take from the final URL
            localName = url2name(f.url)

        localName = os.path.join(out_path, localName)

        with open(localName, 'wb') as fp:
            fp.write(f.read())

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Constantin Guidon