(self, req)
| 1620 | |
| 1621 | class DataHandler(BaseHandler): |
| 1622 | def data_open(self, req): |
| 1623 | # data URLs as specified in RFC 2397. |
| 1624 | # |
| 1625 | # ignores POSTed data |
| 1626 | # |
| 1627 | # syntax: |
| 1628 | # dataurl := "data:" [ mediatype ] [ ";base64" ] "," data |
| 1629 | # mediatype := [ type "/" subtype ] *( ";" parameter ) |
| 1630 | # data := *urlchar |
| 1631 | # parameter := attribute "=" value |
| 1632 | url = req.full_url |
| 1633 | |
| 1634 | scheme, data = url.split(":",1) |
| 1635 | mediatype, data = data.split(",",1) |
| 1636 | |
| 1637 | # Disallow control characters within mediatype. |
| 1638 | if re.search(r"[\x00-\x1F\x7F]", mediatype): |
| 1639 | raise ValueError( |
| 1640 | "Control characters not allowed in data: mediatype") |
| 1641 | |
| 1642 | # even base64 encoded data URLs might be quoted so unquote in any case: |
| 1643 | data = unquote_to_bytes(data) |
| 1644 | if mediatype.endswith(";base64"): |
| 1645 | data = base64.decodebytes(data) |
| 1646 | mediatype = mediatype[:-7] |
| 1647 | |
| 1648 | if not mediatype: |
| 1649 | mediatype = "text/plain;charset=US-ASCII" |
| 1650 | |
| 1651 | headers = email.message_from_string("Content-type: %s\nContent-length: %d\n" % |
| 1652 | (mediatype, len(data))) |
| 1653 | |
| 1654 | return addinfourl(io.BytesIO(data), headers, url) |
| 1655 | |
| 1656 | |
| 1657 | # Code moved from the old urllib module |
nothing calls this directly
no test coverage detected