]> granicus.if.org Git - python/commitdiff
Added support for "data" URL, by Sjoerd Mullender.
authorGuido van Rossum <guido@python.org>
Thu, 12 Mar 1998 14:32:55 +0000 (14:32 +0000)
committerGuido van Rossum <guido@python.org>
Thu, 12 Mar 1998 14:32:55 +0000 (14:32 +0000)
Lib/urllib.py

index 79ee82be4b32b1c5fc893bdfe73f1593cc68ecc9..dfed76edddf102e20037aafa33ef1b5b2ad8a895 100644 (file)
@@ -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):