m ,Ec@sdkZdklZdeifdYZdeifdYZdeifdYZhdd <d d <d d <ddR8R:R6((Rt_processInputsVs  $   cCs|i|iidS(N(RtfailIfR>t taintedformtkeys(RR>((Rt_noTaintedValuesisc Cspdkl} l} l}l}dkl}dkl}d} t ||o$|i d|jd|d} nt ||odx|iiD]L\}}|i|}|o d} n|i|}|o d} qqWnt|| | fjo5xi|D]&} |i| }|o d} qqWn8t|||fjo|i d|jd|n| S( N(sListTypes TupleTypes StringTypes UnicodeType(srecord(s TaintedStringitRCRDR:RRBtotherthas_keytform(RR>R:((RR@s cCsxJ|iiD]9\}}|i|i|p |i|d|qWxd|iiD]S\}}|ii |oq]n|i |i|p |i|d|q]WdS(Ns.Tainted form holds item %s that is not tainteds)Normal form holds item %s that is tainted( R>RCRPR:R;Rtassert_RSRYRXRB(RR>R;R:((Rt#_onlyTaintedformHoldsTaintedStringss " "c Cszxs|iiD]b}|i|ii|d||i|i||i|d||i||i|fqWdS(NsFound tainted %s not in forms?Key %s not correctly reproduced in tainted; expected %r, got %r( R>RCRDR:RRZRYRXt assertEquals(RR>R:((Rt_taintedKeysAlsoInForms  cCsd ddddddf}|i|}t|ii}|i|i |dd d dddg|i |dd|i |d dd g|i |dd|i |d d |i ||i |dS(NR%tbartspamteggstnumbert1s spacey keyR;R:s spacey valtmultit2(sfooR^(R_R`(RaRb(s spacey keysval(skeys spacey val(RcRb(RcRd( R9RRAR>tlistRYRDtformkeystsortR\RER[(RR9R>Rf((RttestNoMarshallings " c Cskdkl}d"d#d$d%d&d'd(d)d*f }|i|}t|ii}|i |i |dddddddddg |i |dddg|i |dd|i |d|d |i |dd|i |dd |i |dd|i |dddg|i |dd!|i |dd |i ||i |dS(+N(sDateTimesnum:intt42s fract:floats4.2s bign:longt45s words:strings Some wordss2tokens:tokenssone twos aday:dates 2002/07/23saccountedfor:requiredtyessmultiline:linessone twosmorewords:textsone two t2tokenst accountedfortadaytbigntfractt morewordst multilinetnumtwordstonettwol-f4.2000000000000002i*(snum:intRi(s fract:floats4.2(s bign:longRj(s words:strings Some words(s2tokens:tokenssone two(s aday:dates 2002/07/23(saccountedfor:requiredsyes(smultiline:linessone two(smorewords:textsone two ( tDateTimeR9RRAR>ReRYRDRfRgR\RER[(RR9RfR>Rw((RttestSimpleMarshallings" ! + cCsdddddf}|i|}t|ii}|i|i |d d d d dg|i |d d|i |d d|i |dddg|i |d ddg|i |d d|i ||i |dS(Nsustring:ustring:utf8stest®sutext:utext:utf8stest® test® sutokens:utokens:utf8s test® test®sulines:ulines:utf8s test® test®snouconverter:string:utf8t nouconvertertulinestustringtutexttutokensutest®utest® test® stest(sustring:ustring:utf8stest®(sutext:utext:utf8stest® test® (sutokens:utokens:utf8s test® test®(sulines:ulines:utf8s test® test®(snouconverter:string:utf8stest®( R9RRAR>ReRYRDRfRgR\RER[(RR9R>Rf((RttestUnicodeConversionss  c Csddddddddd d!d"d#f }|i|}t|ii}|i|i |ddddddg|i |ddg|i |dd$|i |dddg|i |dd%|i |di d|i |di d |i t |dd|i |ddi d|i |ddi d |i |ddi d |i |ddi d|i ||i|dS(&Ns oneitem:listRus alist:listRvsoneitemtuple:tuples atuple:tuplesonerec.foo:recordR%sonerec.bar:recordR^ssetrec.foo:recordsssetrec.bar:recordsR_R`talisttatupletoneitemt oneitemtupletonerectsetreciii(s oneitem:listsone(s alist:listsone(s alist:liststwo(soneitemtuple:tuplesone(s atuple:tuplesone(s atuple:tuplestwo(sonerec.foo:recordsfoo(sonerec.bar:recordsbar(ssetrec.foo:recordssfoo(ssetrec.bar:recordssbar(ssetrec.foo:recordssspam(ssetrec.bar:recordsseggs(sone(sonestwo(R9RRAR>ReRYRDRfRgR\R%R^tlenRER[(RR9RfR>((RttestSimpleContainerss$* " c Csdddddd d!d"f}|i|}t|ii}|i|i |dddg|i |ddddg|i |dd#|i |dddgddgg|i ||i |dS($Nsilist:int:listRbRdsilist:list:intt3sftuple:float:tuples1.0s1.1sftuple:tuple:floats1.2stlist:tokens:listsone twostlist:list:tokenss3 4tftupletilistttlistiiif1.0f1.1000000000000001f1.2RuRvt4(silist:int:listRb(silist:int:listRd(silist:list:intR(sftuple:float:tuples1.0(sftuple:float:tuples1.1(sftuple:tuple:floats1.2(stlist:tokens:listsone two(stlist:list:tokenss3 4(f1.0f1.1000000000000001f1.2( R9RRAR>ReRYRDRfRgR\RER[(RR9R>Rf((RttestMarshallIntoSequencess & cCsddddddddddddd d!f}|i|}t|ii}|i|i |d dg|i |d i d|i |d i ddg|i |d i d|i t |dd|i |ddi d |i |ddi d xPtdD]B}|i |d|iddg|i |d|id"qW|i||i|dS(#Nsonerec.name:recordR%sonerec.tokens:tokens:recordsone twosonerec.ints:int:recordRbRdssetrec.name:recordstfirstssetrec.ilist:list:int:recordsssetrec.ituple:tuple:int:recordstsecondRRRuRviii(sonerec.name:recordsfoo(sonerec.tokens:tokens:recordsone two(sonerec.ints:int:recordRb(sonerec.ints:int:recordRd(ssetrec.name:recordsR(ssetrec.ilist:list:int:recordsRb(ssetrec.ilist:list:int:recordsRd(ssetrec.ituple:tuple:int:recordsRb(ssetrec.ituple:tuple:int:recordsRd(ssetrec.name:recordsR(ssetrec.ilist:list:int:recordsRb(ssetrec.ilist:list:int:recordsRd(ssetrec.ituple:tuple:int:recordsRb(ssetrec.ituple:tuple:int:recordsRd(ii(R9RRAR>ReRYRDRfRgR\tnamettokenstintsRtrangetiRtitupleRER[(RR9RfRR>((RttestRecordsWithSequences*s"0  ! cCsdd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0f}|i|}t|ii}|i|i |dddddg|i |ddddddg|i |ddddddg|i |dd|i |di d |i |di d|i t |dd|i |ddi d |i |ddi d|i |ddi d |i |ddi d|i ||i|dS(1Nsfoo:default:intt5salist:int:defaultRRs alist:intRbRdsexplicitlist:int:list:defaultsexplicitlist:int:listsbar.spam:record:defaultR`sbar.foo:record:defaultR%sbar.foo:recordtbazssetrec.spam:records:defaultssetrec.foo:records:defaultssetrec.foo:recordsthamRR^t explicitlistRiiiiii(sfoo:default:intR(salist:int:defaultR(salist:int:defaultR(salist:int:defaultR(s alist:intRb(s alist:intRd(sexplicitlist:int:list:defaultR(sexplicitlist:int:list:defaultR(sexplicitlist:int:list:defaultR(sexplicitlist:int:listRb(sexplicitlist:int:listRd(sbar.spam:record:defaultseggs(sbar.foo:record:defaultsfoo(sbar.foo:recordR(ssetrec.spam:records:defaultseggs(ssetrec.foo:records:defaultsfoo(ssetrec.foo:recordsR(ssetrec.foo:recordsR(R9RRAR>ReRYRDRfRgR\R_R%RRER[(RR9RfR>((Rt testDefaultsQs"< ## cCsdddddddddddd d!f }|i|}t|ii}|i|i |d ddddg|i ||i |dS("NR%R^R_R`RaRbttaintedss RRs spacey keyR;R:s spacey valt tinitmultis<1>Rdt tdefermultis<2>t tallmulti(sfoosbar(sspamseggs(snumberRb(Rs(s svalue(s spacey keysval(skeys spacey val(Rs<1>(RRd(RRb(Rs<2>(Rs<1>(Rs<2>( R9RRAR>ReRCRDttaintedformkeysRgR\R]R[(RR9R>R((RttestNoMarshallingWithTaintss-   c Csddddd d!d"d#d$f }|i|}t|ii}|i|i |dddddddddg |i ||i |dS(%Ns :intRis:floats4.2s :longRjs twords:strings Some st2tokens:tokenss one s :dates 2002/07/23staccountedfor:requiredsstmultiline:liness stmorewords:texts sssstt2tokenst taccountedfort tmorewordst tmultilinettwords(s :ints42(s:floats4.2(s :longs45(s twords:strings Some (st2tokens:tokenss one (s :dates 2002/07/23(staccountedfor:requireds(stmultiline:liness (stmorewords:texts ( R9RRAR>ReRCRDRRgR\R]R[(RR9R>R((RttestSimpleMarshallingWithTaintss! + c Csdddddddf}|i|}t|ii}|i|i |dddddddg|i ||i |dS(Nstustring:ustring:utf8sstutext:utext:utf8s stinitutokens:utokens:utf8s test®stinitulines:ulines:utf8s test®stdeferutokens:utokens:utf8stest® stdeferulines:ulines:utf8stest® stnouconverter:string:utf8t tdeferulinest tdeferutokenst tinitulinest tinitutokenst tnouconverterttustringttutext(stustring:ustring:utf8s(stutext:utext:utf8s (stinitutokens:utokens:utf8s test®(stinitulines:ulines:utf8s test®(stdeferutokens:utokens:utf8stest® (stdeferulines:ulines:utf8stest® (stnouconverter:string:utf8s( R9RRAR>ReRCRDRRgR\R]R[(RR9R>R((RttestUnicodeWithTaintss  % c Csdkl}l}dkl}ddfddfddfddfd dfd d fd dfd dfd dfd dfd d fddfddfddfddfddfddfddfddfddfddfddfddfddfddfddfddfddfd dfddfd d!ff}|i|}t |i i }|i |i|d"d#d$d%d&d'd(d)d*d+d,d-d.g |i||i|dS(/N(sListTypes TupleType(srecords toneitem:listss:listRustinitalist:listRvstdeferalist:listsstoneitemtuple:tuplestinitatuple:tuplestdeferatuple:tuplestinitonerec.foo:recordsstinitonerec.bar:recordR^stdeferonerec.foo:recordR%stdeferonerec.bar:recordsstinitinitsetrec.foo:recordsstinitinitsetrec.bar:recordsR_R`stinitdefersetrec.foo:recordsstinitdefersetrec.bar:recordsstdeferinitsetrec.foo:recordsstdeferinitsetrec.bar:recordssstdeferdefersetrec.foo:recordsstdeferdefersetrec.bar:recordsss t tdeferalistt tdeferatuplettdeferdefersetrecttdeferinitsetrect tdeferonerect tinitalistt tinitatuplettinitdefersetrecttinitinitsetrect tinitonerecttoneitemt toneitemtuple(RGRHRIRR&R9RRAR>ReRCRDRRgR\R]R[(RR9R>R&RRHRI((RttestSimpleContainersWithTaintss " 7 c!Csddfddfddfddfdd fd d fd d fdd fdd fdd fd d fd d fd dfdd fddfdd fdd fd d fdd fdd fdd fdd fddfdd fdd fdd fdd fdd fdd fddfdd fdd ff }|i|}t|ii}|i|i |dddddg|i ||i |dS(Ns tinitonerec.tokens:tokens:records twos!tdeferonerec.tokens:tokens:records one stinitsetrec.name:recordsRstinitsetrec.ilist:list:recordss<1>Rds$tinitsetrec.ituple:tuple:int:recordsRbRstdeferfirstsetrec.name:recordss$tdeferfirstsetrec.ilist:list:recordss<2>s*tdeferfirstsetrec.ituple:tuple:int:recordsstdefersecondsetrec.name:recordss%tdefersecondsetrec.ilist:list:recordss+tdefersecondsetrec.ituple:tuple:int:recordsttdeferfirstsetrecRttdefersecondsetrecRt tinitsetrec( R9RRAR>ReRCRDRRgR\R]R[(RR9R>R((Rt"testRecordsWithSequencesAndTainteds'%  c!Csddfddfddfddfddfdd fd d fd d fd dfd dfd d fddfdd fddfddfddfddfddfddfddfddfddfddfddfdd fd!dfd"dfd#dfd#d fd$dfd%dfd%d ff }|i|}t|ii}|i|i |d&dd'd(d)d d*g|i ||i |dS(+Ns tfoo:defaults<5>sdoesnnotapply:defaults<4>t doesnnotapplyRstinitlist:defaultRRt tinitlists<1>Rdstdeferlist:defaultt tdeferlistRbstinitbar.spam:record:defaultR`stinitbar.foo:record:defaultR%stinitbar.foo:recordsstdeferbar.spam:record:defaultsstdeferbar.foo:record:defaultstdeferbar.foo:recordRs!rdoesnotapply.spam:record:defaultsrdoesnotapply.spam:records tinitsetrec.spam:records:defaultstinitsetrec.foo:records:defaultstinitsetrec.foo:recordsRs!tdefersetrec.spam:records:defaults tdefersetrec.foo:records:defaultstdefersetrec.foo:recordss"srdoesnotapply.foo:records:defaultssrdoesnotapply.foo:recordst tdeferbart tdefersetrecttfoottinitbarR( R9RRAR>ReRCRDRRgR\R]R[(RR9R>R((RttestDefaultsWithTaints!s') % cCs d}|it|i|dS(Ns taintedattr.hereRFs)%s converter does not quote unsafe value!( tZPublisher.Convertersttype_convertersRwRPRUtconvertt ExceptionteRRBtargst SyntaxError(RRRRRwRU((RttestNoTaintedExceptionsZs   cCsyd}|i|}t|ii}|i|i |dg|i |dd|i ||i |dS(Ns name.:tuplesname with dot as tuplesname.(s name.:tuplesname with dot as tuple((s name.:tuplesname with dot as tuple(sname with dot as tuple( R9RRAR>ReRYRDRfRgR\RER[(RR9R>Rf((RttestNameWithDotAsTupleis  cCshdd<dd<}d|d<|i|}|i|idd|i|id d d |d<|i|}|i|idd|i|id d d |d<|i|}|i|idd|i|idd|i|id d dS(NRR3RR4sfoo=bar; baz=geet HTTP_COOKIER%R^Rtgees foo=bar; baz="gee, like, e=mc^2"sgee, like, e=mc^2sfoo=bar; hmm; baz=geethmmt(R0RR1R>R\tcookies(RR>R0((RttestCookieParsingxs   (R R R1RARERSR@R[R]RhRxR~RRRRRRRRRRRRRR(((RR/Qs0    "       ' 0    2 0 4   t CONTENT_TYPEs#multipart/form-data; boundary=12345tREQUEST_METHODtPOSTRt localhostRR4s~ --12345 Content-Disposition: form-data; name="file"; filename="file" Content-Type: application/octet-stream test --12345-- t RequestTestscBs#tZdZdZdZRS(NcCsdk}dkl}|t}ti}|i|}dk l }|||d}|i |i||i||i|i||i|dS(N(sStringIO(s HTTPRequest(tsysRtTEST_FILE_DATAtst TEST_ENVIRONtcopyR0t getrefcountt start_countRRR R>R?RtassertNotEqualtcloseR!(RRR>RRRRR0((RttestRemoveStdinReferencess       cCsdk}dkl}|t}ti}dkl}|||d}|i |i i d}|it|dg|id|i|id|id|i|i|dS(N(sStringIO(s HTTPRequesttfilestest i(RRRRRRR0RRR R>R?RYtgettfRR!Retseektnextt xreadlines(RRRRR>RRR0((RttestFileIterators        c CsMhdd<dd<dd<}dkl}dkl}|d }|i} ||| d}|i |i t t |d |i} d | d <||| d}|i |i|id d}ti}d|d