a ze8@s6dZddlZddlZddlZddlZddlZddlZddl Z ddl m Z m Z m Z mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!Gdddej"Z#Gdddej"Z$Gdd d Z%d d Z&d d Z'ddZ(Gdddej"Z)Gdddej"Z*Gdddej"Z+e,dkr2e-dS)zTests for http/cookiejar.py.N) time2isoz http2timeiso2time time2netscapeparse_ns_headersjoin_header_wordssplit_header_wordsCookie CookieJarDefaultCookiePolicy LWPCookieJarMozillaCookieJar LoadErrorlwp_cookie_strDEFAULT_HTTP_PORT escape_pathreachis_HDN domain_matchuser_domain_match request_path request_port request_hostc@s\eZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ dS) DateTimeTestscCsd}d}|t|d|t||d|t|d|d|t|d|dt}td }||fD]}||d d ||fqrdS) Nx+.parse_datez 01 Jan 2001)ir0rrz 03-Feb-20)irrrrr1z 03-Feb-98)irrrrr1rr"r/r&r&r'test_http2time9szDateTimeTests.test_http2timecCsgd}d}t|}d}|||d|||f|D]J}|t||||t||||t|||q4dS)N)zThu, 03 Feb 1994 00:00:00 GMT Thursday, 03-Feb-94 00:00:00 GMTz"Thursday, 03-Feb-1994 00:00:00 GMTz03 Feb 1994 00:00:00 GMTz03-Feb-94 00:00:00 GMTz03-Feb-1994 00:00:00 GMTz03-Feb-1994 00:00 GMTz03-Feb-1994 00:00z02-Feb-1994 24:00z 03-Feb-94z 03-Feb-1994z 03 Feb 1994z 03 Feb 1994 0:00 z 03-Feb-1994 >P-z1994-02-03 00:00:00Zz%s => '%s' (%s))rrrlowerupper)r"teststest_tresultexpectedsr&r&r'test_http2time_formatsEs z$DateTimeTests.test_http2time_formatscCs*dD] }|t|d|t|fqdS)N)GarbagezMandag 16. September 1996z 01-00-1980z 01-13-1980z 00-01-1980z 32-01-1980z01-01-1980 25:00:00z01-01-1980 00:61:0001-01-1980 00:00:62z08-Oct-3697739z 08-01-3697739z09 Feb 19942632 22:23:32 GMTz Wed, 09 Feb 1994834 22:23:32 GMTz,http2time(%s) is not None http2time(test) %s) assertIsNonerr"testr&r&r'test_http2time_garbageis   z$DateTimeTests.test_http2time_garbagecCs(tdddtddddS)Nz01 Jan 1970{}00:00:00 GMT! iz01 Jan 1970 00:00:00{}GMT!)rformatr"r&r&r'2test_http2time_redos_regression_actually_completes~sz@DateTimeTests.test_http2time_redos_regression_actually_completescCs<dd}||dd||dd||dddS)NcSstt|ddSr*)r,r-rr.r&r&r'r/sz/DateTimeTests.test_iso2time..parse_dateZ19940203T141529Z)irrz1994-02-03 07:15:29 -0700z1994-02-03 19:45:29 +0530r2r3r&r&r' test_iso2times   zDateTimeTests.test_iso2timecCs`gd}d}|D]J}|t||||t||||t|||qdS)N) z1994-02-03 00:00:00 -0000z1994-02-03 00:00:00 +0000z1994-02-03 00:00:00z 1994-02-03z1994-02-03T00:00:00Z19940203z1994-02-02 24:00:00Z19940203T000000Zz 1994-02-03 z 1994-02-03T00:00:00 r6)rrr7r8)r"r9r:r=r&r&r'test_iso2time_formatss z#DateTimeTests.test_iso2time_formatscCs"dD]}|t|d|qdS)N) r?r@r5z 1980-00-01z 1980-13-01z 1980-01-00z 1980-01-32z1980-01-01 25:00:00z1980-01-01 00:61:00rAz01-01-1980T00:00:62Z19800101T250000Zz iso2time(%r))rBrrCr&r&r'test_iso2time_garbages z#DateTimeTests.test_iso2time_garbagecCs(tdddtddddS)Nz1994-02-03{}14:15:29 -0100!rFi@Bz1994-02-03 14:15:29{}-0100!)rrGrHr&r&r'$test_iso2time_performance_regressionsz2DateTimeTests.test_iso2time_performance_regressionN) __name__ __module__ __qualname__r(r)r4r>rErIrMrNrOrPr&r&r&r'rs $rc@s<eZdZddZddZddZddZd d Zd d Zd S) HeaderTestscCs*gdg}dD]}|t|g|qdS)N)foobar)expiresld9Wversion0)z)foo=bar; expires=01 Jan 2040 22:23:32 GMTz+foo=bar; expires="01 Jan 2040 22:23:32 GMT"rrr"r<hdrr&r&r'test_parse_ns_headerss z!HeaderTests.test_parse_ns_headerscCs*ddgg}dD]}|t|g|qdS)NrU)rZ1)zfoo=bar; version="1"foo=bar; Version="1"r\r]r&r&r'test_parse_ns_headers_versions z)HeaderTests.test_parse_ns_headers_versioncCs$d}ddgg}|t|g|dS)Nz expires=01 Jan 2040 22:23:32 GMT)rXz01 Jan 2040 22:23:32 GMTrYr\)r"r^r<r&r&r'#test_parse_ns_headers_special_namess z/HeaderTests.test_parse_ns_headers_special_namescCs0tddgg}||d|tggddS)NrVNrWbazz foo; bar=bazr?)rr)r"Zjoinedr&r&r'test_join_header_wordss z"HeaderTests.test_join_header_wordscCsddggfddggfddggfddggfddggfd dggfd dd ggfd dd ggfd dggfddd ggfdgdgfddgdgdggfddd gdgdgdggfg }|D]l\}}zt|g}Wn<ddl}ddl}|}|d|d|}Yn0|||d|||fqdS)NrVrdfoo=barrU foo z foo= )rVr?z foo=z foo= ; z foo= ; bar= baz refoo=bar bar=bazz foo= bar=baz)rVzbar=bazfoo=bar;bar=baz foo bar baz)rd)rWN)rfNza, b, c)aN)bN)cNz(foo; bar=baz, spam=, foo="\,\;\"", bar= )spamr?)rVz,;")rWr?rz (error -- traceback follows) %sz: When parsing: '%s' Expected: '%s' Got: '%s' )r tracebackioStringIO print_excgetvaluer)r"r9argexpectr;rqrrfr&r&r'test_split_header_wordss:               z#HeaderTests.test_split_header_wordsc CsFgd}|D]4\}}t|g}t|}|||d||||fq dS)N) )rVrV)rhrh)rirV)zfoo=zfoo="")rjfoo=bar; bar=baz)rkrz)rlz foo; bar; baz)zfoo="\"" bar="\\"zfoo="\""; bar="\\")z foo,,,barzfoo, bar)zfoo=bar,bar=bazzfoo=bar, bar=baz)ztext/html; charset=iso-8859-1ztext/html; charset="iso-8859-1")z)foo="bar"; port="80,81"; discard, bar=bazz'foo=bar; port="80,81"; discard, bar=baz)zBasic realm="\"foo\\\\bar\""zBasic; realm="\"foo\\\\bar\""zM When parsing: '%s' Expected: '%s' Got: '%s' Input was: '%s' )rrr)r"r9rvrwinputresr&r&r'test_roundtrip s    zHeaderTests.test_roundtripN) rQrRrSr_rbrcrgryr}r&r&r&r'rTs   "rTc@s"eZdZgdfddZddZdS) FakeResponseNcCs$ddl}|d||_||_dS)zD headers: list of RFC822-style 'Key: value' strings rN )emailZmessage_from_stringjoin_headersZ_url)r"headersurlrr&r&r'__init__-szFakeResponse.__init__cCs|jSN)rrHr&r&r'info4zFakeResponse.info)rQrRrSrrr&r&r&r'r~,sr~cGst|||dS)Nz Set-Cookie2 _interact cookiejarrset_cookie_hdrsr&r&r' interact_29656srcGst|||dS)Nz Set-Cookierrr&r&r'interact_netscape9src Cs\tj|}|||dd}g}|D]}|d||fq*t||}||||S)zDPerform a single request / response cycle, returning Cookie: header.r r?z%s: %s)urllibrequestRequestadd_cookie_header get_headerappendr~extract_cookies) rrrZhdr_namereqZ cookie_hdrrr^r|r&r&r'r<s     rc@s<eZdZddZddZddZddZd d Zd d Zd S)FileCookieJarTestscCs"tjj}t|}||j|dSr)rDsupportTESTFNr rfilenamer"rror&r&r'test_constructor_with_strJsz,FileCookieJarTests.test_constructor_with_strcCs.ttjj}t|}||jt |dSr) pathlibPathrDrrr rrosfspathrr&r&r'test_constructor_with_path_likeOsz2FileCookieJarTests.test_constructor_with_path_likecCstd}||jdSr)r rBrr"ror&r&r'test_constructor_with_noneTsz-FileCookieJarTests.test_constructor_with_nonec CsGddd}tt|fD]j}|j|dJ|t |}t|d}Wdn1sZ0YWdq1sx0YqdS)Nc@s eZdZdS)z?FileCookieJarTests.test_constructor_with_other_types..AN)rQrRrSr&r&r&r'AYsrr)intfloatZsubTest assertRaises TypeErrorr )r"rtype_instanceror&r&r'!test_constructor_with_other_typesXs  z4FileCookieJarTests.test_constructor_with_other_typescCstjj}t}t|dd||jdddjdzH|j|ddt}|j |ddWzt |Wqt y|Yq0n$zt |Wnt yYn00||jdddjddS)Nhttp://www.acme.com/Zboo www.acme.com/Tignore_discard) rDrrr rr_cookiesvaluesaveloadrunlinkOSErrorrr&r&r'test_lwp_valueless_cookiebs z,FileCookieJarTests.test_lwp_valueless_cookiecCstjj}ttfD]X}|}z|jddWn2ty\}z||jt WYd}~qd}~00| dqz~t |d>}| dttfD]}|}| t |j|qWdn1s0YWzt|WntyYn0n&zt|Wnty Yn00dS)NzAfor this test to work, a file with this filename should not existrz%expected OSError for invalid filenamewzoops )rDrrr r rrZ assertIsNot __class__rZfailopenwriterrr)r"rZcookiejar_classroexcrxr&r&r'test_bad_magicqs$ $    2z!FileCookieJarTests.test_bad_magicN) rQrRrSrrrrrrr&r&r&r'rIs  rc@seZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6Zd7d8Zd9d:Zd;d<Z d=d>Z!d?d@Z"dAdBZ#dCdDZ$dES)F CookieTestscCsLt}dD]<\}}}tj|}|||}|r<||q ||q dS)N))http://foo.bar.com/zblah.comF)rzrhubarb.blah.comF)rzrhubarb.foo.bar.comF)r .foo.bar.comT)r foo.bar.comT)rz.bar.comT)rbar.comT)rcomT)http://foo.com/zrhubarb.foo.comF)r.foo.comT)rfoo.comT)rrT) http://foo/z rhubarb.fooF)rz.fooT)rrVT)rz foo.localT)r.localT)http://barfoo.comrF)rrF)r rrrZdomain_return_ok assertTrue assertFalse)r"polrdomainokrrr&r&r'test_domain_return_oks   z!CookieTests.test_domain_return_okc Cstjj}t|}t|ddt|dd|jddd}||j||j d|jddd}||j||j d|t |dt |}|j d d d z&t|}|j d d d Wt|jnt|j0|t |td d d d ||t|d ddS)Nreggsz"spam"; path=/foo/rr/foo/z"spam"zJ"spam"; path="/foo/"; domain="www.acme.com"; path_spec; discard; version=0T)Zignore_expiresrzpath_specified=%sFhttp://www.acme.com/foo/z "spam"; eggs)rDrrr rrrBrrnamerreprrZrevertrrrresub)r"rrocookieZold_strr&r&r'test_missing_values8      zCookieTests.test_missing_valuec CsdD]\}}}t||d}t|}t|ddz|jddd}Wnty`||Yq0||j|t|dd|r|jddd }||jd qdS) N))NFr)NTr0)FFN)FTr0)TFr)TTr)rfc2109_as_netscaperfc2965http://www.example.com/zni=ni; Version=1www.example.comrnifoo=bar; Version=1rVr0) r r rrKeyErrorrBrrZr)r"rrrZpolicyrorZ cookie2965r&r&r'test_rfc2109_handlings$   z!CookieTests.test_rfc2109_handlingcCst}t|ddt|ddt|ddt|ddt|ddt|ddt|dd t|dd |jd d d }||jd ||j||jt| |j || d| | d|jdd d}||jd| |j||jd||j |jdd d}| |j| |j |jdd d}|jdd d}| |j | |j |jdd d}||j||jd|jdd d }| |jdS)Nrz0spam=eggs; DoMain=.acme.com; port; blArgh="feep"zni=ni; port=80,8080http://www.acme.com:80/znini=nizfoo=bar; expires=z-spam=eggs; expires="Foo Bar 25 33:22:11 3022"z fortytwo=z=unladenswallowZholyhandgrenade .acme.comrrpZblArghZblarghrrz80,8080ZninirVZfortytwor?)r rrrrrZdomain_specifiedportrrZport_specifiedZhas_nonstandard_attrrBrXZassertIsNotNoner)r"rorrVrpr&r&r'test_ns_parsersF                zCookieTests.test_ns_parsercCsHt}t|ddt|dd|jdd}|d||d|dS)Nrz expires=eggszversion=eggs; spam=eggsrrrXrZ)r rrassertIn)r"rocookiesr&r&r'test_ns_parser_special_namesJs    z(CookieTests.test_ns_parser_special_namesc Cst}ttd}tj|dd|g}tjd}t |d}| ||}| t |d| t|dj |Wdn1s0Yt|dd|| t |dttd}t|dd|t|d}| t |d|d ||d |t|dd |t|dd || t |d t|dd|t|dd|t|d}| t |dt|dd| t |d|| t |d|d |tdddddddddddddddi} | | j ddS)Nz%Set-Cookie: FOO=BAR; path=/; expires=http://www.coyote.com/r0rrzspam="bar"; expires=%szfoo="eggs"; expires=%s spam="bar"rVzeggs="bar"; expires=%szbar="bar"; expires=%srz!eggs="bar"; expires=%s; max-age=0z bar="bar"; max-age=0; expires=%szhttp://www.rhubarb.net/z whum="fizz"rrrFzwww.python.orgTrz1444312383.018307i?uV)r rr,rDrZcheck_no_warningsrrrr~ make_cookiesrlenrXrr assertNotInclear_session_cookiesr ) r"rofuturerrr|rZnowhrr&r&r' test_expiresUsb    4      zCookieTests.test_expirescCs6tdd}t|}t|dd|d|jdt|}t|dd|d|jdt|}t|d d|d |jdt|}t|d d|d |jdt}t|dd |d|jdt}t|dd|d|jdt}t|d d|d|jdt}t|d d|d|jddS)NTrrzspam="bar"; Version="1"rrzhttp://www.acme.com/blahzeggs="bar"; Version="1"z http://www.acme.com/blah/rhubarb/blah/z!http://www.acme.com/blah/rhubarb/z/blah/rhubarb/r eggs="bar"/blahz /blah/rhubarb)r r rrrrr"rror&r&r'test_default_paths:       zCookieTests.test_default_pathcCsBt}d}d}t||||d|jd|t|||dS)Nzhttp://example.com/?spam/eggsrrz example.com)r rrrr)r"cjZurirr&r&r'test_default_path_with_querys  z(CookieTests.test_default_path_with_querycCs*gd}|D]\}}|t||q dS)N) )z /foo%2f/bar /foo%2F/bar)rr) /foo%%/barr) /fo%19o/barr)z /fo%7do/barz /fo%7Do/bar) /foo/bar&r) /foo//barr) ~/foo/barr)z /foo/barz /foo%19/bar)z /}foo/barz /%7Dfoo/bar)u /foo/barüz/foo/bar%C3%BC)u /foo/barꯍz/foo/bar%EA%AF%8D)rr)r"Zcasesrvr;r&r&r'test_escape_paths zCookieTests.test_escape_pathcCsXtjd}|t|dtjd}|t|dtjd}|t|ddS)NzThttp://www.example.com/rheum/rhaponticum;foo=bar;sing=song?apples=pears&spam=eggs#niz$/rheum/rhaponticum;foo=bar;sing=songzBhttp://www.example.com/rheum/rhaponticum?apples=pears&spam=eggs#niz/rheum/rhaponticumzhttp://www.example.comr)rrrrrr"rr&r&r'test_request_paths  zCookieTests.test_request_pathc Cst}tdd}t|}d}t||d|jddd}dD]|\}}||}tj|} t||} |r|d | d ||| || q>| d | d || | || q>dS) NT)Zstrict_ns_set_pathzhttp://bar.comzspam=eggs; Path=/foor/foorp))rT)rT)/foo/barT)rF)z /foobad/fooFz spam=eggszcookie not set for zcookie set for ) r r rrrrrrrZ set_ok_pathrr) r"rZstrict_ns_path_polroZbase_urlrpathrrrrr&r&r'test_path_prefix_matchs      z"CookieTests.test_path_prefix_matchcCsLtjjdddid}|t|dtjjdddid}|t|tdS)Nzhttp://www.acme.com:1234/Hostzwww.acme.com:4321rZ1234r)rrrrrrrr&r&r'test_request_portszCookieTests.test_request_portcCsptjjdddid}|t|dtjjdddid}|t|dtjjd dd id}|t|ddS) Nzhttp://1.1.1.1/r www.acme.com:80r z1.1.1.1rzirrelevant.comrz&http://www.acme.com:2345/resource.htmlzwww.acme.com:5432)rrrrrrr&r&r'test_request_host szCookieTests.test_request_hostcCst|td|td|td|td|td|td|td|tddS) Nrz1foo2.3bar4.5com 192.168.1.1r?.rz..foozfoo.)rrrrHr&r&r' test_is_HDNszCookieTests.test_is_HDNcCs|tdd|tdd|tdd|tdd|tdd|tdd|tdd|td d dS) Nrracme.comz acme.localr.comrr?z 192.168.0.1)rrrHr&r&r' test_reach#szCookieTests.test_reachcCs|tdd|tdd|tdd|tdd|tdd|tdd|tdd|td d |td d |td d |td d |tdd|tdd|tdd|tdd|tdd|tdd|tdd|tdd|tdd|tdd|tdd|tdd|tdd|tdd|tdd |tdd|tdd|tdd|tdd|tdd dS)Nrz.168.1.1zx.y.comzx.Y.comz.Y.comzY.comz a.b.c.comz.c.comz example.localrz blah.blahr?z.rhubarb.rhubarbrrzrhubarb.acme.comzwww.rhubarb.acme.comzy.comz.y.comrrmz.mr)rrrrrHr&r&r'test_domain_match-s>zCookieTests.test_domain_matchcCs&t}t|dd|t|ddS)Nzhttp://www.nasty.com/z)foo=bar; domain=friendly.org; Version="1"r)r rrrrr&r&r'test_wrong_domainQs zCookieTests.test_wrong_domaincCsjtdd}t|d}t|ddt|dd|t|ddD]$}t|d |d |t|dq@dS) NT)Z strict_domainrzhttp://example.co.uk/z no=problemoz!okey=dokey; Domain=.example.co.ukr)z.co.ukz.org.zaz.tx.usz.name.uszhttp://example.%s/zspam=eggs; Domain=.co.uk)r r rrr)r"ZcprZ pseudo_tldr&r&r'test_strict_domain[s    zCookieTests.test_strict_domaincCs8t}t|dd|t|d||jdddjd|t|dd|t|ddttjd }|||t|dd t|d d t|d d|t|d||jdddjd||jdddjd|t|d dt|dd|t|dt|dd|t|ddS)Nhttp://foo.net/zns=barr0foo.netrnsrWhttp://www.foo.net/)Zstrict_ns_domainr?http://foo.net/foo/zspam1=eggs; domain=foo.netzhttp://foo.net/foo/bar/zspam2=eggs; domain=.foo.netr.foo.netrZspam1rrZspam2zspam2=eggs; spam1=eggs; ns=barznini="ni"; domain=.netzhttp://foo.co.ukznasty=trick; domain=.co.uk) r rrrrrr ZDomainStrictNonDomain set_policy)r"rorr&r&r'test_two_component_domain_nsisB      z(CookieTests.test_two_component_domain_nscCs4tdd}t|}t|dd|t|d||jdddjd |t|dd |t|d d t|d d|t|d|t|d d t|dd||jdddjd|t|d|t|dd |t|ddt|dd|t|dt|dd|t|ddS)NTrrrar0rrrVrWz$Version=1; foo=barrr?zhttp://foo.net/fooz1spam=eggs; domain=foo.net; path=/foo; Version="1"zhttp://www.foo.net/foo/z&spam=eggs; domain=foo.net; Version="1"r rrprrrz($Version=1; spam=eggs; $Domain="foo.net"z#ni="ni"; domain=".net"; Version="1"zhttp://foo.co.uk/z'nasty=trick; domain=.co.uk; Version="1"r)r r rrrrrrr&r&r'!test_two_component_domain_rfc2965sJ      z-CookieTests.test_two_component_domain_rfc2965cCsttdgdgdd}tjd}dg}t|d}||||t|dtjd}t|d}||||t|d tjd }t|d }||||t|d tjd }t|d }| ||}| |d|t|d | || | d dS) Nrr)blocked_domainsZallowed_domainsrhttp://acme.com/*Set-Cookie: CUSTOMER=WILE_E_COYOTE; path=/rrr0rrr )r r rrrr~rrrr set_cookierr has_header)r"rorrr|rr&r&r'test_domain_allows0              zCookieTests.test_domain_allowcCstddgd}t|d}dg}tjd}t|d}||||t|d| dg}||||t|d | tjd }t|d }||||t|d tjd }| || | d | | d | | dg||||t|d tjd}t|d}|||}||d|t|d | ||| d | | gtjd}t|d}|||}||||t|d tjd}| || | d tjd}| ||||d||| d | dg}tjd}| ||| d tjd}| ||| d dS)NTr)rr%rr'rrrr0zhttp://www.roadrunner.net/r Cookie2rr&zhttp://badacme.com/)r r rrrr~rrrZset_blocked_domainsclearrrr)rr(rZ return_ok)r"rrorrr|prr&r&r'test_domain_blocksj                               zCookieTests.test_domain_blockcCsdD]}dD]}t}|r.tdd}t}d}ntdd}t}d}||d}|||d ||f|||d ||f||jd d d jd||jd d djdq qdS)N)TF)rFr?Frr?Tz ; Version=1rz foo1=bar%s%szfoo2=bar%s; secure%srrZfoo1z#non-secure cookie registered secureZfoo2z#secure cookie registered non-secure) r r rrr"rrZsecurer)r"r whitespacerorrZvsrr&r&r' test_secure's,   zCookieTests.test_securecCst}t|d}dg}tjd}t|d}||||t|dtjd}| || | dtjd}| || | dtjd}| || | dtjd}| || | ddS) Nr(Set-Cookie: session=narf; secure; path=/https://www.acme.com/r0r rzwss://www.acme.com/zws://www.acme.com/) r r rrrr~rrrrrr)rr"rrorrr|r&r&r'test_secure_block>s&            zCookieTests.test_secure_blockcCstdgd}t|d}dg}tjd}t|d}||||t|dtjd}| || | dtjd}| || | dtjd }| || | dtjd }| || | ddS) NZfoos)Zsecure_protocolsrr1r2r0r rzfoos://www.acme.com/zfoo://www.acme.com/) r r rrrr~rrrrrr)rr3r&r&r'test_custom_secure_protocolsZs&             z(CookieTests.test_custom_secure_protocolscCs6ttddd}t|ddt|d}||ddS)NTrrrzfoo=\b"a"r; Version=1z$Version=1; foo=\\b\"a\"r)r r rr)r"rorr&r&r'test_quote_cookie_valueus  z#CookieTests.test_quote_cookie_valuecCsXd}ttdd}t||dtj|}|t|d||| | ddS)Nhttp://www.acme.comTrrr0r ) r r rrrrrrrrr))r"rrorr&r&r'test_missing_final_slash{s   z$CookieTests.test_missing_final_slashcCstdd}t|}d}t||dt||}|d|dt|}d}t||dt||}|d|d t|}d}t||d t||}|d |d dS) NTrrspam=eggs; Version=1ZDomainz*absent domain returned with domain presentz%spam=eggs; Version=1; Domain=.bar.comz$Domain=".bar.com"zdomain not returnedz$spam=eggs; Version=1; Domain=bar.comz$Domain="bar.com"r r rrrr"rrorrr&r&r'test_domain_mirrors$       zCookieTests.test_domain_mirrorcCsntdd}t|}d}t||dt||}|d|dt|}d}t||dt||}|d|d dS) NTrrr9rz&absent path returned with path presentzspam=eggs; Version=1; Path=/z $Path="/"zpath not returnedr:r;r&r&r'test_path_mirrors     zCookieTests.test_path_mirrorcCstdd}t|}d}t||dt||}|d|dt|}d}t||dt||}||dd t|}d}t||d t||}|d |d t|}d}t||d t||}|d|ddS)NTrrr9ZPortz&absent port returned with port presentzspam=eggs; Version=1; Portz\$Port([^=]|$)z-port with no value not returned with no valuezspam=eggs; Version=1; Port="80"z $Port="80"z5port with single value not returned with single valuez$spam=eggs; Version=1; Port="80,8080"z$Port="80,8080"z;port with multiple values not returned with multiple values)r r rrr rr;r&r&r'test_port_mirrors6         zCookieTests.test_port_mirrorcCs:ttdd}d}t||dt||}|d|ddS)NTrrzfspam=eggs; Version=1; Comment="does anybody read these?"; CommentURL="http://foo.bar.net/comment.html"Commentz:Comment or CommentURL cookie-attributes returned to server)r r rr)r"rorrr&r&r'test_no_return_comments  z"CookieTests.test_no_return_commentcCsttdd}t|ddt|ddt|ddt|ddt|d d gd }gd }gd }gd}tdD]n}d}|D]`}||t||j||||j ||||j ||||j |||d}q~qrdS)NTrzhttp://blah.spam.org/zefoo=eggs; Version=1; Comment="does anybody read these?"; CommentURL="http://foo.bar.net/comment.html"zhttp://www.acme.com/blah/zspam=bar; securezfoo=bar; secure; Version=1zfoo=bar; path=/; Version=1http://www.sol.nosbang=wallop; version=1; domain=".sol.no"; port="90,100, 80,8080"; max-age=100; Comment = "Just kidding! (\"|\\\\) ")r0r0r0rr0)ZbangrVrVrprV)z.sol.noz blah.spam.orgrrr)rrrrrr!rr0) r r rrrangeZassertIsInstancer rrZrrr )r"csZversionsnamesZdomainspathsiror&r&r'test_Cookie_iterators2    z CookieTests.test_Cookie_iteratorcCs|tdggdg|tdggdg|tdgddgg|tdggdg|td gd d gg|td ggdS) Nzfoo=bar; path=/; domain)rU)r r)rNrYz)foo=bar; expires=Foo Bar 12 33:22:11 2000)rU)rXNrYrVrdrYzfoo=bar; expireszfoo=bar; versionrU)rZNr?r\rHr&r&r'r_s*z!CookieTests.test_parse_ns_headerscCsdd}ttd}dgdgdgdgdgd |gfD]}||}|t|d q8d g}||}|jd d d}||jdS)NcSs,t}tjd}t|d}||||S)Nr)r rrrr~r)rrorrr&r&r'cookiejar_from_cookie_headerss    zICookieTests.test_bad_cookie_header..cookiejar_from_cookie_headersrz Set-Cookie: z Set-Cookie2: z-Set-Cookie2: a=foo; path=/; Version=1; domainzSet-Cookie: b=foo; max-age=oopszSet-Cookie: b=foo; version=spamzSet-Cookie:; Expires=%srz3Set-Cookie: c=foo; expires=Foo Bar 12 33:22:11 2000rrro)rr,rrrrBrX)r"rIrrrorr&r&r'test_bad_cookie_headers z"CookieTests.test_bad_cookie_headerN)%rQrRrSrrrrrrrrrrr r rrrrrrr#r$r*r.r0r4r5r6r8r<r=r>r@rHr_rJr&r&r&r'rsD/! 0 9(   $ 0,C   rc@sleZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZdS)LWPCookieTestscCstdd}g}ttdd}tjjdddid}|d |t|d }| ||tjd }| || | d d | | d d|dt|d }| ||tjd}| || d }| d|| d ||dt|d}| ||tjd }| || d }| d|| d ||d|tjd}| || d }| d|| d |||ddS)Nrr0Trrr rr zVSet-Cookie: CUSTOMER=WILE_E_COYOTE; path=/ ; expires=Wednesday, 09-Nov-%d 23:12:40 GMTrr zCUSTOMER=WILE_E_COYOTEr+ $Version="1"4Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/zhttp://www.acme.com/foo/bar PART_NUMBER=ROCKET_LAUNCHER_0001z%Set-Cookie: SHIPPING=FEDEX; path=/foor7zSHIPPING=FEDEXrzSHIPPING=FEDEX;)r, localtimer r rrrrr~rrrrrrr startswith)r" year_plus_onerrorr|rr&r&r'test_netscape_example_14sP%                          z&LWPCookieTests.test_netscape_example_1cCst}g}tjd}|dt|d}|||tjd}|||| dd|dt|d}|||tjd}||| | dddS)NrrMr rNz6Set-Cookie: PART_NUMBER=RIDING_ROCKET_0023; path=/ammozhttp://www.acme.com/ammozBPART_NUMBER=RIDING_ROCKET_0023;\s*PART_NUMBER=ROCKET_LAUNCHER_0001) r rrrrr~rrrrr r"rorrr|r&r&r'test_netscape_example_2s*            z&LWPCookieTests.test_netscape_example_2cCsttdd}t|dd}||t|dd}||dt|dd }||d ||d ||d t|d }||d|d|dS)NTrzhttp://www.acme.com/acme/loginz3Customer="WILE_E_COYOTE"; Version="1"; Path="/acme"z!http://www.acme.com/acme/pickitem=Part_Number="Rocket_Launcher_0001"; Version="1"; Path="/acme"z=^\$Version="?1"?; Customer="?WILE_E_COYOTE"?; \$Path="/acme"$z!http://www.acme.com/acme/shippingz+Shipping="FedEx"; Version="1"; Path="/acme"z^\$Version="?1"?;z7Part_Number="?Rocket_Launcher_0001"?;\s*\$Path="\/acme"z-Customer="?WILE_E_COYOTE"?;\s*\$Path="\/acme"z http://www.acme.com/acme/processz%Shipping="?FedEx"?;\s*\$Path="\/acme"Z WILE_E_COYOTE)r r rrr rr"rorr&r&r'test_ietf_example_1s*      z"LWPCookieTests.test_ietf_example_1cCsXttdd}t|dddt|d}||dt|d}|d ||d |dS) NTrz&http://www.acme.com/acme/ammo/specificrUz@Part_Number="Riding_Rocket_0023"; Version="1"; Path="/acme/ammo"z!http://www.acme.com/acme/ammo/...z(Riding_Rocket_0023.*Rocket_Launcher_0001zhttp://www.acme.com/acme/parts/ZRocket_Launcher_0001ZRiding_Rocket_0023)r r rr rrrVr&r&r'test_ietf_example_22s    z"LWPCookieTests.test_ietf_example_2cCstdd}t|d}d}t|dd}||t|dd}|t|dt|d d }|t|dt|d d }|t|d t|d d}|t|d t|dd}|t|d t|dd}|t|dt|dd}|t|dt|dd}|t|dt|dd}|t|dt|dd}|t|dtjj}zV|j |ddt |}t|d}|j |ddWzt |WntyYn0n&zt |WntyYn00||t |dS)NTrrz max-age=3600r7z!foo=bar; domain=".com"; version=1z'ping=pong; domain="acme.com"; version=1r0zhttp://www.a.acme.comz'whiz=bang; domain="acme.com"; version=1z,wow=flutter; domain=".a.acme.com"; version=1rzhttp://125.125.125.125z*zzzz=ping; domain="125.125.125"; version=1rAz6blah=rhubarb; domain=".sol.no"; path="/foo"; version=1zhttp://www.sol.no/foo/barz3bing=bong; domain=".sol.no"; path="/foo"; version=1rz5whiz=ffft; domain=".sol.no"; port="90,100"; version=1rBr!z9foo9=bar; version=1; domain=".sol.no"; port; max-age=100;zhttp://www.sol.no/.save_and_restorer+zname='foo1', value='bar'Fr!) r,rOrDrrr r rrrrrr)r"rQrorXr`r_r&rr' test_mozillas:    zLWPCookieTests.test_mozillacCst}g}tjd}|dt|d}||||dt|d}|||tjd}|||d| d|d| ddS)Nzhttp://foo.bar.acme.com/fooz4Set-Cookie: Customer=WILE_E_COYOTE; domain=.acme.comzhttp://www.acme.com/fooz4Set-Cookie: PART_NUMBER=3,4; domain=foo.bar.acme.comzPART_NUMBER=3,4r zCustomer=WILE_E_COYOTE) r rrrrr~rrrrrSr&r&r'test_netscape_miscs         z!LWPCookieTests.test_netscape_misccCshttdd}t|ddt|dd}|d|t|ddt|d}|d||t|d dS) NTrhttp://example/z#foo1=bar; PORT; Discard; Version=1;z$foo2=bar; domain=".local"; Version=1foo1=barzfoo3=bar; Version=1foo2=barr)r r rrrrrVr&r&r'test_intranet_domains_2965s    z)LWPCookieTests.test_intranet_domains_2965cCslttdd}t|ddt|dd}|t|d|d|t|d}|d||t|ddS)NFrrcrdzfoo2=bar; domain=.localrre)r r rrrrrVr&r&r'test_intranet_domains_ns&s    z'LWPCookieTests.test_intranet_domains_nscCsttdd}g}tjd}|dt|d}|||tjd}||| | dd| | ddtjd }||| | dd| | dddS) NTrzhttp://www.ants.com/z,Set-Cookie: JSESSIONID=ABCDERANDOM123; Path=r zJSESSIONID=ABCDERANDOM123r+rLzhttp://www.ants.com:8080) r r rrrrr~rrrrrSr&r&r'test_empty_path2s$          zLWPCookieTests.test_empty_pathc Cs tdd}tjd}g}|d|d||d||d|dt|d}t}|||ddddd }|D]}d |j }||d||<q| |D]}d |j }||d||<q| |d |d | |dd| |dddS)Nrr0z"http://www.perlmeister.com/scriptsz$Set-Cookie: s1=session;Path=/scriptszWSet-Cookie: p1=perm; Domain=.perlmeister.com;Path=/;expires=Fri, 02-Feb-%d 23:24:20 GMTz>Set-Cookie: p2=perm;Path=/;expires=Fri, 02-Feb-%d 23:24:20 GMTzs>d3g  B-O