1# -*- coding: utf-8 -*- 2import sys 3import six 4from six import PY3 5from six import text_type 6from six.moves import http_cookies 7 8SimpleCookie = http_cookies.SimpleCookie 9CookieError = http_cookies.CookieError 10 11 12def to_bytes(value, charset='latin1'): 13 if isinstance(value, text_type): 14 return value.encode(charset) 15 return value 16 17 18if PY3: # pragma: no cover 19 from html.entities import name2codepoint 20 from urllib.parse import urlencode 21 from urllib.parse import splittype 22 from urllib.parse import splithost 23 import urllib.parse as urlparse 24else: # pragma: no cover 25 from htmlentitydefs import name2codepoint # noqa 26 from urllib import splittype # noqa 27 from urllib import splithost # noqa 28 from urllib import urlencode # noqa 29 import urlparse # noqa 30 31 32def print_stderr(value): 33 if not PY3: 34 if isinstance(value, text_type): 35 value = value.encode('utf8') 36 six.print_(value, file=sys.stderr) 37 38try: 39 from collections import OrderedDict 40except ImportError: # pragma: no cover 41 from ordereddict import OrderedDict # noqa 42 43 44def escape_cookie_value(value): 45 """ 46 Escapes a value so that it can be safely stored in a cookie. 47 48 """ 49 return '"' + ''.join( 50 COOKIE_ESCAPE_CHAR_MAP.get(x, x) for x in value 51 ) + '"' 52 53 54# A list of illegal characters in a cookie and the escaped equivalent. 55# Taken from Python's cookie module. 56COOKIE_ESCAPE_CHAR_MAP = { 57 '\000' : '\\000', '\001' : '\\001', '\002' : '\\002', 58 '\003' : '\\003', '\004' : '\\004', '\005' : '\\005', 59 '\006' : '\\006', '\007' : '\\007', '\010' : '\\010', 60 '\011' : '\\011', '\012' : '\\012', '\013' : '\\013', 61 '\014' : '\\014', '\015' : '\\015', '\016' : '\\016', 62 '\017' : '\\017', '\020' : '\\020', '\021' : '\\021', 63 '\022' : '\\022', '\023' : '\\023', '\024' : '\\024', 64 '\025' : '\\025', '\026' : '\\026', '\027' : '\\027', 65 '\030' : '\\030', '\031' : '\\031', '\032' : '\\032', 66 '\033' : '\\033', '\034' : '\\034', '\035' : '\\035', 67 '\036' : '\\036', '\037' : '\\037', 68 69 # Because of the way browsers really handle cookies (as opposed 70 # to what the RFC says) we also encode , and ; 71 72 ',' : '\\054', ';' : '\\073', 73 74 '"' : '\\"', '\\' : '\\\\', 75 76 '\177' : '\\177', '\200' : '\\200', '\201' : '\\201', 77 '\202' : '\\202', '\203' : '\\203', '\204' : '\\204', 78 '\205' : '\\205', '\206' : '\\206', '\207' : '\\207', 79 '\210' : '\\210', '\211' : '\\211', '\212' : '\\212', 80 '\213' : '\\213', '\214' : '\\214', '\215' : '\\215', 81 '\216' : '\\216', '\217' : '\\217', '\220' : '\\220', 82 '\221' : '\\221', '\222' : '\\222', '\223' : '\\223', 83 '\224' : '\\224', '\225' : '\\225', '\226' : '\\226', 84 '\227' : '\\227', '\230' : '\\230', '\231' : '\\231', 85 '\232' : '\\232', '\233' : '\\233', '\234' : '\\234', 86 '\235' : '\\235', '\236' : '\\236', '\237' : '\\237', 87 '\240' : '\\240', '\241' : '\\241', '\242' : '\\242', 88 '\243' : '\\243', '\244' : '\\244', '\245' : '\\245', 89 '\246' : '\\246', '\247' : '\\247', '\250' : '\\250', 90 '\251' : '\\251', '\252' : '\\252', '\253' : '\\253', 91 '\254' : '\\254', '\255' : '\\255', '\256' : '\\256', 92 '\257' : '\\257', '\260' : '\\260', '\261' : '\\261', 93 '\262' : '\\262', '\263' : '\\263', '\264' : '\\264', 94 '\265' : '\\265', '\266' : '\\266', '\267' : '\\267', 95 '\270' : '\\270', '\271' : '\\271', '\272' : '\\272', 96 '\273' : '\\273', '\274' : '\\274', '\275' : '\\275', 97 '\276' : '\\276', '\277' : '\\277', '\300' : '\\300', 98 '\301' : '\\301', '\302' : '\\302', '\303' : '\\303', 99 '\304' : '\\304', '\305' : '\\305', '\306' : '\\306', 100 '\307' : '\\307', '\310' : '\\310', '\311' : '\\311', 101 '\312' : '\\312', '\313' : '\\313', '\314' : '\\314', 102 '\315' : '\\315', '\316' : '\\316', '\317' : '\\317', 103 '\320' : '\\320', '\321' : '\\321', '\322' : '\\322', 104 '\323' : '\\323', '\324' : '\\324', '\325' : '\\325', 105 '\326' : '\\326', '\327' : '\\327', '\330' : '\\330', 106 '\331' : '\\331', '\332' : '\\332', '\333' : '\\333', 107 '\334' : '\\334', '\335' : '\\335', '\336' : '\\336', 108 '\337' : '\\337', '\340' : '\\340', '\341' : '\\341', 109 '\342' : '\\342', '\343' : '\\343', '\344' : '\\344', 110 '\345' : '\\345', '\346' : '\\346', '\347' : '\\347', 111 '\350' : '\\350', '\351' : '\\351', '\352' : '\\352', 112 '\353' : '\\353', '\354' : '\\354', '\355' : '\\355', 113 '\356' : '\\356', '\357' : '\\357', '\360' : '\\360', 114 '\361' : '\\361', '\362' : '\\362', '\363' : '\\363', 115 '\364' : '\\364', '\365' : '\\365', '\366' : '\\366', 116 '\367' : '\\367', '\370' : '\\370', '\371' : '\\371', 117 '\372' : '\\372', '\373' : '\\373', '\374' : '\\374', 118 '\375' : '\\375', '\376' : '\\376', '\377' : '\\377' 119 } 120