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