diff options
author | Guido van Rossum <guido@python.org> | 1998-03-12 14:32:55 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1998-03-12 14:32:55 (GMT) |
commit | 6d4d1c2a259ca3452894b26acfe78d54c35c2ea5 (patch) | |
tree | 6793b32a876ff06f0795f3236d11e4e83563557f /Lib/urllib.py | |
parent | fb34c926284277e88485119c4d458c78c63dc779 (diff) | |
download | cpython-6d4d1c2a259ca3452894b26acfe78d54c35c2ea5.zip cpython-6d4d1c2a259ca3452894b26acfe78d54c35c2ea5.tar.gz cpython-6d4d1c2a259ca3452894b26acfe78d54c35c2ea5.tar.bz2 |
Added support for "data" URL, by Sjoerd Mullender.
Diffstat (limited to 'Lib/urllib.py')
-rw-r--r-- | Lib/urllib.py | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/Lib/urllib.py b/Lib/urllib.py index 79ee82b..dfed76e 100644 --- a/Lib/urllib.py +++ b/Lib/urllib.py @@ -354,6 +354,46 @@ class URLopener: except ftperrors(), msg: raise IOError, ('ftp error', msg), sys.exc_info()[2] + # Use "data" URL + def open_data(self, url, data=None): + # ignore POSTed data + # + # syntax of data URLs: + # dataurl := "data:" [ mediatype ] [ ";base64" ] "," data + # mediatype := [ type "/" subtype ] *( ";" parameter ) + # data := *urlchar + # parameter := attribute "=" value + import StringIO, mimetools, time + try: + [type, data] = string.split(url, ',', 1) + except ValueError: + raise IOError, ('data error', 'bad data URL') + if not type: + type = 'text/plain;charset=US-ASCII' + semi = string.rfind(type, ';') + if semi >= 0 and '=' not in type[semi:]: + encoding = type[semi+1:] + type = type[:semi] + else: + encoding = '' + msg = [] + msg.append('Date: %s'%time.strftime('%a, %d %b %Y %T GMT', + time.gmtime(time.time()))) + msg.append('Content-type: %s' % type) + if encoding == 'base64': + import base64 + data = base64.decodestring(data) + else: + data = unquote(data) + msg.append('Content-length: %d' % len(data)) + msg.append('') + msg.append(data) + msg = string.join(msg, '\n') + f = StringIO.StringIO(msg) + headers = mimetools.Message(f, 0) + f.fileno = None # needed for addinfourl + return addinfourl(f, headers, url) + # Derived class with handlers for errors we can handle (perhaps) class FancyURLopener(URLopener): |