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