diff --git a/src/fetcher.py b/src/fetcher.py index 14aae3ea..4e85c58d 100755 --- a/src/fetcher.py +++ b/src/fetcher.py @@ -2,7 +2,7 @@ # python standard library modules import urlparse -import urllib +import urllib, urllib2 import os from sys import argv from sys import exit @@ -13,6 +13,12 @@ import pisiconfig class FetchError (Exception): pass + +class ProgressMeter: + def __init__ (self,): + pass + + class Fetcher: """Yet another Pisi tool for fetching files from various sources..""" def __init__(self, uri): @@ -35,7 +41,7 @@ class Fetcher: if os.access(self.filedest, os.W_OK) == False: self.err("no perm to write destination") - scheme_err = lambda: self.err("unexpected scheme (expecting file, http or ftp)") + scheme_err = lambda: self.err("unexpected scheme") actions = { 'file': self.fetchLocalFile, @@ -52,17 +58,48 @@ class Fetcher: copyfile(self.filepath, self.filedest + "/" + self.filename) def fetchRemoteFile (self): - try: - file = urllib.urlopen(self.uri) + from httplib import HTTPException - except IOError, e: - self.err(e.strerror[1]) + try: + file = urllib2.urlopen(self.uri) + headers = file.info() + + except ValueError, e: + self.err('%s' % (e, )) + except IOError, e: + self.err('%s' % (e, )) + except OSError, e: + self.err('%s' % (e, )) + except HTTPException, e: + self.err(('(%s): %s') % (e.__class__.__name__, e)) + + if not headers is None and not headers.has_key('Content-Length'): + self.err('file not found') + else: totalsize = int(headers['Content-Length']) dest = open(self.filedest + "/" + self.filename , "w") - dest.write(file.read()) + + bs = 1024*4 + size = 0 + oldpercent = -1 + #FIXME: güzel, flexible bir progress nesnesi hazırlamak lazım. + # şimdilik böyle kalsın, haftasonu hallederim.. + chunk = file.read(bs) + size = size + len(chunk) + while chunk: + dest.write(chunk) + chunk = file.read(bs) + size = size + len(chunk) + percent = (size * 100) / totalsize + if size != totalsize and oldpercent != percent: + print "%%%d" % (percent) + oldpercent = percent + + dest.close(); print "%100" def err (self, error): - raise FetchError, error + raise FetchError(error) + def usage(): print "Usage: %s URI" % argv[0] diff --git a/src/tests/fetch_file b/src/tests/fetch_file index 3e6b4ee9..357c7d5a 100755 --- a/src/tests/fetch_file +++ b/src/tests/fetch_file @@ -3,7 +3,7 @@ # mkdir /var/tmp/pisi/cache # ./fetch_file file:///etc/passwd -# ./fetch http://www.uludag.org.tr/belgeler/gelistirici/gelistirici.pdf +# ./fetch http://cekirdek.uludag.org.tr/~meren/Imagi.mp3 # ./fetch_file ftp://ftp.uludag.org.tr/pub/md5summer.exe # ls /var/tmp/pisi/cache