Added support for "data" URL, by Sjoerd Mullender.
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 @@
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):