cookie.py
来自「mallet是自然语言处理、机器学习领域的一个开源项目。」· Python 代码 · 共 743 行 · 第 1/2 页
PY
743 行
#!/usr/bin/env python###### Copyright 2000 by Timothy O'Malley <timo@alum.mit.edu>## All Rights Reserved## Permission to use, copy, modify, and distribute this software# and its documentation for any purpose and without fee is hereby# granted, provided that the above copyright notice appear in all# copies and that both that copyright notice and this permission# notice appear in supporting documentation, and that the name of# Timothy O'Malley not be used in advertising or publicity# pertaining to distribution of the software without specific, written# prior permission.## Timothy O'Malley DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS# SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY# AND FITNESS, IN NO EVENT SHALL Timothy O'Malley BE LIABLE FOR# ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR# PERFORMANCE OF THIS SOFTWARE.####### Id: Cookie.py,v 2.29 2000/08/23 05:28:49 timo Exp# by Timothy O'Malley <timo@alum.mit.edu>## Cookie.py is a Python module for the handling of HTTP# cookies as a Python dictionary. See RFC 2109 for more# information on cookies.## The original idea to treat Cookies as a dictionary came from# Dave Mitchell (davem@magnet.com) in 1995, when he released the# first version of nscookie.py.#####r"""Here's a sample session to show how to use this module.At the moment, this is the only documentation.The Basics----------Importing is easy.. >>> import CookieMost of the time you start by creating a cookie. Cookies come inthree flavors, each with slightly different encoding semanitcs, butmore on that later. >>> C = Cookie.SimpleCookie() >>> C = Cookie.SerialCookie() >>> C = Cookie.SmartCookie()[Note: Long-time users of Cookie.py will remember usingCookie.Cookie() to create an Cookie object. Although deprecated, itis still supported by the code. See the Backward Compatibility notesfor more information.]Once you've created your Cookie, you can add values just as if it werea dictionary. >>> C = Cookie.SmartCookie() >>> C["fig"] = "newton" >>> C["sugar"] = "wafer" >>> print C Set-Cookie: fig=newton; Set-Cookie: sugar=wafer;Notice that the printable representation of a Cookie is theappropriate format for a Set-Cookie: header. This is thedefault behavior. You can change the header and printedattributes by using the the .output() function >>> C = Cookie.SmartCookie() >>> C["rocky"] = "road" >>> C["rocky"]["path"] = "/cookie" >>> print C.output(header="Cookie:") Cookie: rocky=road; Path=/cookie; >>> print C.output(attrs=[], header="Cookie:") Cookie: rocky=road;The load() method of a Cookie extracts cookies from a string. In aCGI script, you would use this method to extract the cookies from theHTTP_COOKIE environment variable. >>> C = Cookie.SmartCookie() >>> C.load("chips=ahoy; vienna=finger") >>> print C Set-Cookie: chips=ahoy; Set-Cookie: vienna=finger;The load() method is darn-tootin smart about identifying cookieswithin a string. Escaped quotation marks, nested semicolons, and othersuch trickeries do not confuse it. >>> C = Cookie.SmartCookie() >>> C.load('keebler="E=everybody; L=\\"Loves\\"; fudge=\\012;";') >>> print C Set-Cookie: keebler="E=everybody; L=\"Loves\"; fudge=\012;";Each element of the Cookie also supports all of the RFC 2109Cookie attributes. Here's an example which sets the Pathattribute. >>> C = Cookie.SmartCookie() >>> C["oreo"] = "doublestuff" >>> C["oreo"]["path"] = "/" >>> print C Set-Cookie: oreo=doublestuff; Path=/;Each dictionary element has a 'value' attribute, which gives youback the value associated with the key. >>> C = Cookie.SmartCookie() >>> C["twix"] = "none for you" >>> C["twix"].value 'none for you'A Bit More Advanced-------------------As mentioned before, there are three different flavors of Cookieobjects, each with different encoding/decoding semantics. Thissection briefly discusses the differences.SimpleCookieThe SimpleCookie expects that all values should be standard strings.Just to be sure, SimpleCookie invokes the str() builtin to convertthe value to a string, when the values are set dictionary-style. >>> C = Cookie.SimpleCookie() >>> C["number"] = 7 >>> C["string"] = "seven" >>> C["number"].value '7' >>> C["string"].value 'seven' >>> print C Set-Cookie: number=7; Set-Cookie: string=seven;SerialCookieThe SerialCookie expects that all values should be serialized usingcPickle (or pickle, if cPickle isn't available). As a result ofserializing, SerialCookie can save almost any Python object to avalue, and recover the exact same object when the cookie has beenreturned. (SerialCookie can yield some strange-looking cookievalues, however.) >>> C = Cookie.SerialCookie() >>> C["number"] = 7 >>> C["string"] = "seven" >>> C["number"].value 7 >>> C["string"].value 'seven' >>> print C Set-Cookie: number="I7\012."; Set-Cookie: string="S'seven'\012p1\012.";Be warned, however, if SerialCookie cannot de-serialize a value (becauseit isn't a valid pickle'd object), IT WILL RAISE AN EXCEPTION.SmartCookieThe SmartCookie combines aspects of each of the other two flavors.When setting a value in a dictionary-fashion, the SmartCookie willserialize (ala cPickle) the value *if and only if* it isn't aPython string. String objects are *not* serialized. Similarly,when the load() method parses out values, it attempts to de-serializethe value. If it fails, then it fallsback to treating the valueas a string. >>> C = Cookie.SmartCookie() >>> C["number"] = 7 >>> C["string"] = "seven" >>> C["number"].value 7 >>> C["string"].value 'seven' >>> print C Set-Cookie: number="I7\012."; Set-Cookie: string=seven;Backwards Compatibility-----------------------In order to keep compatibilty with earlier versions of Cookie.py,it is still possible to use Cookie.Cookie() to create a Cookie. Infact, this simply returns a SmartCookie. >>> C = Cookie.Cookie() >>> print C.__class__.__name__ SmartCookieFinis.""" #"# ^# |----helps out font-lock## Import our required modules#import stringfrom UserDict import UserDicttry: from cPickle import dumps, loadsexcept ImportError: from pickle import dumps, loadstry: import reexcept ImportError: raise ImportError, "Cookie.py requires 're' from Python 1.5 or later"__all__ = ["CookieError","BaseCookie","SimpleCookie","SerialCookie", "SmartCookie","Cookie"]## Define an exception visible to External modules#class CookieError(Exception): pass# These quoting routines conform to the RFC2109 specification, which in# turn references the character definitions from RFC2068. They provide# a two-way quoting algorithm. Any non-text character is translated# into a 4 character sequence: a forward-slash followed by the# three-digit octal equivalent of the character. Any '\' or '"' is# quoted with a preceeding '\' slash.## These are taken from RFC2068 and RFC2109.# _LegalChars is the list of chars which don't require "'s# _Translator hash-table for fast quoting#_LegalChars = string.ascii_letters + string.digits + "!#$%&'*+-.^_`|~"_Translator = { '\000' : '\\000', '\001' : '\\001', '\002' : '\\002', '\003' : '\\003', '\004' : '\\004', '\005' : '\\005', '\006' : '\\006', '\007' : '\\007', '\010' : '\\010', '\011' : '\\011', '\012' : '\\012', '\013' : '\\013', '\014' : '\\014', '\015' : '\\015', '\016' : '\\016', '\017' : '\\017', '\020' : '\\020', '\021' : '\\021', '\022' : '\\022', '\023' : '\\023', '\024' : '\\024', '\025' : '\\025', '\026' : '\\026', '\027' : '\\027', '\030' : '\\030', '\031' : '\\031', '\032' : '\\032', '\033' : '\\033', '\034' : '\\034', '\035' : '\\035', '\036' : '\\036', '\037' : '\\037', '"' : '\\"', '\\' : '\\\\', '\177' : '\\177', '\200' : '\\200', '\201' : '\\201', '\202' : '\\202', '\203' : '\\203', '\204' : '\\204', '\205' : '\\205', '\206' : '\\206', '\207' : '\\207', '\210' : '\\210', '\211' : '\\211', '\212' : '\\212', '\213' : '\\213', '\214' : '\\214', '\215' : '\\215', '\216' : '\\216', '\217' : '\\217', '\220' : '\\220', '\221' : '\\221', '\222' : '\\222', '\223' : '\\223', '\224' : '\\224', '\225' : '\\225', '\226' : '\\226', '\227' : '\\227', '\230' : '\\230', '\231' : '\\231', '\232' : '\\232', '\233' : '\\233', '\234' : '\\234', '\235' : '\\235', '\236' : '\\236', '\237' : '\\237', '\240' : '\\240', '\241' : '\\241', '\242' : '\\242', '\243' : '\\243', '\244' : '\\244', '\245' : '\\245', '\246' : '\\246', '\247' : '\\247', '\250' : '\\250', '\251' : '\\251', '\252' : '\\252', '\253' : '\\253', '\254' : '\\254', '\255' : '\\255', '\256' : '\\256', '\257' : '\\257', '\260' : '\\260', '\261' : '\\261', '\262' : '\\262', '\263' : '\\263', '\264' : '\\264', '\265' : '\\265', '\266' : '\\266', '\267' : '\\267', '\270' : '\\270', '\271' : '\\271', '\272' : '\\272', '\273' : '\\273', '\274' : '\\274', '\275' : '\\275', '\276' : '\\276', '\277' : '\\277', '\300' : '\\300', '\301' : '\\301', '\302' : '\\302', '\303' : '\\303', '\304' : '\\304', '\305' : '\\305', '\306' : '\\306', '\307' : '\\307', '\310' : '\\310', '\311' : '\\311', '\312' : '\\312', '\313' : '\\313', '\314' : '\\314', '\315' : '\\315', '\316' : '\\316', '\317' : '\\317', '\320' : '\\320', '\321' : '\\321', '\322' : '\\322', '\323' : '\\323', '\324' : '\\324', '\325' : '\\325', '\326' : '\\326', '\327' : '\\327', '\330' : '\\330', '\331' : '\\331', '\332' : '\\332', '\333' : '\\333', '\334' : '\\334', '\335' : '\\335', '\336' : '\\336', '\337' : '\\337', '\340' : '\\340', '\341' : '\\341', '\342' : '\\342', '\343' : '\\343', '\344' : '\\344', '\345' : '\\345', '\346' : '\\346', '\347' : '\\347', '\350' : '\\350', '\351' : '\\351', '\352' : '\\352', '\353' : '\\353', '\354' : '\\354', '\355' : '\\355', '\356' : '\\356', '\357' : '\\357', '\360' : '\\360', '\361' : '\\361', '\362' : '\\362', '\363' : '\\363', '\364' : '\\364', '\365' : '\\365', '\366' : '\\366', '\367' : '\\367', '\370' : '\\370', '\371' : '\\371', '\372' : '\\372', '\373' : '\\373', '\374' : '\\374', '\375' : '\\375', '\376' : '\\376', '\377' : '\\377' }def _quote(str, LegalChars=_LegalChars, join=string.join, idmap=string._idmap, translate=string.translate): # # If the string does not need to be double-quoted, # then just return the string. Otherwise, surround # the string in doublequotes and precede quote (with a \) # special characters. # if "" == translate(str, idmap, LegalChars): return str else: return '"' + join( map(_Translator.get, str, str), "" ) + '"'# end _quote_OctalPatt = re.compile(r"\\[0-3][0-7][0-7]")_QuotePatt = re.compile(r"[\\].")def _unquote(str, join=string.join, atoi=string.atoi): # If there aren't any doublequotes, # then there can't be any special characters. See RFC 2109. if len(str) < 2: return str if str[0] != '"' or str[-1] != '"': return str # We have to assume that we must decode this string. # Down to work. # Remove the "s str = str[1:-1] # Check for special sequences. Examples: # \012 --> \n # \" --> " # i = 0 n = len(str) res = [] while 0 <= i < n: Omatch = _OctalPatt.search(str, i) Qmatch = _QuotePatt.search(str, i) if not Omatch and not Qmatch: # Neither matched res.append(str[i:]) break # else: j = k = -1 if Omatch: j = Omatch.start(0) if Qmatch: k = Qmatch.start(0) if Qmatch and ( not Omatch or k < j ): # QuotePatt matched res.append(str[i:k]) res.append(str[k+1]) i = k+2 else: # OctalPatt matched res.append(str[i:j]) res.append( chr( atoi(str[j+1:j+4], 8) ) ) i = j+4 return join(res, "")# end _unquote
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?