mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
178 lines
6.1 KiB
Python
178 lines
6.1 KiB
Python
# ***** BEGIN LICENSE BLOCK *****
|
|
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
#
|
|
# The contents of this file are subject to the Mozilla Public License Version
|
|
# 1.1 (the "License"); you may not use this file except in compliance with
|
|
# the License. You may obtain a copy of the License at
|
|
# http://www.mozilla.org/MPL/
|
|
#
|
|
# Software distributed under the License is distributed on an "AS IS" basis,
|
|
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
# for the specific language governing rights and limitations under the
|
|
# License.
|
|
#
|
|
# The Original Code is Mozilla Corporation Code.
|
|
#
|
|
# The Initial Developer of the Original Code is
|
|
# Clint Talbert.
|
|
# Portions created by the Initial Developer are Copyright (C) 2007
|
|
# the Initial Developer. All Rights Reserved.
|
|
#
|
|
# Contributor(s):
|
|
# Clint Talbert <ctalbert@mozilla.com>
|
|
#
|
|
# Alternatively, the contents of this file may be used under the terms of
|
|
# either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
# in which case the provisions of the GPL or the LGPL are applicable instead
|
|
# of those above. If you wish to allow use of your version of this file only
|
|
# under the terms of either the GPL or the LGPL, and not to allow others to
|
|
# use your version of this file under the terms of the MPL, indicate your
|
|
# decision by deleting the provisions above and replace them with the notice
|
|
# and other provisions required by the GPL or the LGPL. If you do not delete
|
|
# the provisions above, a recipient may use your version of this file under
|
|
# the terms of any one of the MPL, the GPL or the LGPL.
|
|
#
|
|
# ***** END LICENSE BLOCK *****
|
|
|
|
import urllib
|
|
import urlparse
|
|
import shutil
|
|
import subprocess
|
|
import traceback
|
|
from optparse import OptionParser
|
|
import os
|
|
|
|
_mozdownload_debug = False
|
|
|
|
def debug(str):
|
|
if _mozdownload_debug:
|
|
print "DEBUG DOWNLOAD.py: " + str
|
|
|
|
# Overrides some of the FancyURLopener functionality so that we can send in
|
|
# our auth info. It only tries once. If the auth info is wrong, it throws.
|
|
class mozURLopener(urllib.FancyURLopener):
|
|
def __init__(self, **kwargs):
|
|
if kwargs['user'] != "":
|
|
self.user = kwargs['user']
|
|
self.passwd = kwargs['passwd']
|
|
else:
|
|
self.user = ""
|
|
self.passwd = ""
|
|
self.triedPassword = False
|
|
|
|
urllib.FancyURLopener.__init__(self)
|
|
|
|
def prompt_user_passwd (self, host, realm):
|
|
debug("mozURLopener: Sending Password")
|
|
self.triedPassword = True
|
|
return(self.user, self.passwd)
|
|
|
|
def http_error_401(self, url, fp, errcode, errmsg, headers, data=None):
|
|
debug("mozURLOpener: GOT a 401!!!")
|
|
if not self.triedPassword:
|
|
return urllib.FancyURLopener.http_error_401(self, url, fp, errcode, errmsg, headers, data=None)
|
|
else:
|
|
# Password was incorrect, throw a 401
|
|
raise IOError, 401
|
|
return None
|
|
|
|
def http_error_404(self, url, fp, errcode, errmsg, headers, data=None):
|
|
debug("mozURLOpener: Got a 404!")
|
|
raise IOError, 404
|
|
return None
|
|
|
|
class MozDownloader:
|
|
def __init__(self, **kwargs):
|
|
assert (kwargs['url'] != "" and kwargs['url'] != None)
|
|
assert (kwargs['dest'] != "" and kwargs['dest'] != None)
|
|
self.url = kwargs['url']
|
|
self.dest = kwargs['dest']
|
|
self.error = 0
|
|
self.user = kwargs['user']
|
|
self.passwd = kwargs['password']
|
|
|
|
def download(self):
|
|
# Attempt to use urllib for this instead of wget
|
|
try:
|
|
opener = mozURLopener(user=self.user, passwd=self.passwd)
|
|
data = opener.open(self.url)
|
|
#Ensure directory exists
|
|
self.ensureDest()
|
|
destfile = open(self.dest, "wb")
|
|
destfile.write(data.read())
|
|
destfile.close()
|
|
except IOError, errcode:
|
|
if str(errcode) == "401":
|
|
print "Download Fails - Invalid username and password"
|
|
elif str(errcode) == "404":
|
|
print "Download Fails - URL does not exist: URL = " + self.url
|
|
else:
|
|
print "Download Fails, IOError, error code: " + str(errcode)
|
|
traceback.print_exc()
|
|
except:
|
|
print "Download Fails, unrecognized error."
|
|
traceback.print_exc()
|
|
|
|
def ensureDest(self):
|
|
try:
|
|
# Work around the fact that the os.path module doesn't understand ~/ paths
|
|
if self.dest[0] == "~":
|
|
self.dest = os.path.expanduser(self.dest)
|
|
headpath = os.path.split(self.dest)[0]
|
|
try:
|
|
if not os.path.exists(headpath):
|
|
os.makedirs(headpath)
|
|
except:
|
|
print "Error creating directory for download"
|
|
except:
|
|
self.error = 1
|
|
|
|
def moveToDest(self):
|
|
try:
|
|
# Grab the name of the downloaded file from the URL
|
|
parsedUrl = urlparse.urlparse(self.url)
|
|
path = parsedUrl[2]
|
|
pathElements = path.split("/")
|
|
filename = pathElements[len(pathElements) - 1]
|
|
print filename
|
|
|
|
# Create directory - we assume that the name of the file is the last
|
|
# parameter on the path
|
|
if self.dest[0] == "~":
|
|
self.dest = os.path.expanduser(self.dest)
|
|
headpath = os.path.split(self.dest)[0]
|
|
try:
|
|
if not os.path.exists(headpath):
|
|
os.makedirs(headpath)
|
|
except:
|
|
print "Error creating destination directory"
|
|
|
|
# Move it to destination location and file name
|
|
self.dest = os.path.expandvars(self.dest)
|
|
debug(self.dest)
|
|
shutil.move("./" + urllib.unquote(filename), self.dest)
|
|
except:
|
|
self.error = 1
|
|
|
|
if __name__ == "__main__":
|
|
parser = OptionParser()
|
|
parser.add_option("-d", "--Destination", dest="dest",
|
|
help="Destination file to download to",
|
|
metavar="DEST_FILE")
|
|
parser.add_option("-u", "--URL", dest="url",
|
|
help="URL to download from", metavar="URL")
|
|
parser.add_option("-n", "--userName", dest="user",
|
|
help="User name if needed (optional)",
|
|
metavar="USERNAME")
|
|
parser.add_option("-p", "--Password", dest="password",
|
|
help="Password for User name (optional)",
|
|
metavar="PASSWORD")
|
|
|
|
(options, args) = parser.parse_args()
|
|
|
|
# Run it
|
|
mozDwnld = MozDownloader(url=options.url, dest=options.dest, user=options.user,
|
|
password=options.password)
|
|
mozDwnld.download()
|