summaryrefslogtreecommitdiff
path: root/Lib/urllib.py
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1998-03-12 14:32:55 +0000
committerGuido van Rossum <guido@python.org>1998-03-12 14:32:55 +0000
commit6d4d1c2a259ca3452894b26acfe78d54c35c2ea5 (patch)
tree6793b32a876ff06f0795f3236d11e4e83563557f /Lib/urllib.py
parentfb34c926284277e88485119c4d458c78c63dc779 (diff)
downloadcpython-git-6d4d1c2a259ca3452894b26acfe78d54c35c2ea5.tar.gz
Added support for "data" URL, by Sjoerd Mullender.
Diffstat (limited to 'Lib/urllib.py')
-rw-r--r--Lib/urllib.py40
1 files changed, 40 insertions, 0 deletions
diff --git a/Lib/urllib.py b/Lib/urllib.py
index 79ee82be4b..dfed76eddd 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):