ó FRTc@sddlZddlmZddlmZddlmZdZdZdZ dZ d Z d Z d Z d Zd Zdejfd„ƒYZdS(iÿÿÿÿN(tUser(tInvalidCorsError(thandlert CorsConfigtCorstOriginstOrigintMethodstMethodtResponseHeaderstResponseHeadert MaxAgeSeccBs;eZdZd„Zd„Zd„Zd„Zd„ZRS(s0Encapsulates the CORS configuration XML documentcCszg|_g|_g|_itgt6tgt6tgt6gt 6|_ tttg|_ d|_ d|_d|_dS(Ni(tcorst collectionstelementstORIGINtORIGINStMETHODtMETHODStHEADERtHEADERSt MAXAGESECtlegal_collectionstlegal_elementst parse_leveltNonet collectiontelement(tself((s9/opt/freeware/lib/python2.7/site-packages/boto/gs/cors.pyt__init__(s         cCs/|j|kr+td||jfƒ‚ndS(s#Verify parse level for a given tag.s"Invalid tag %s at parse level %d: N(RR(Rttagtlevel((s9/opt/freeware/lib/python2.7/site-packages/boto/gs/cors.pytvalidateParseLevelGscCs)|tkr.|j|dƒ|jd7_n÷|tkr\|j|dƒ|jd7_nÉ||jkr–|j|dƒ|jd7_||_n||jkr|j|dƒ|jdkr×td|ƒ‚n||j|jkr td||jfƒ‚n||_ ntd|ƒ‚dS( s,SAX XML logic for parsing new element found.iiiisTag %s found outside collections#Tag %s not allowed in %s collectionsUnsupported tag N( t CORS_CONFIGR RtCORSRRRRRR(Rtnametattrst connection((s9/opt/freeware/lib/python2.7/site-packages/boto/gs/cors.pyt startElementMs&    cCs|tkr.|j|dƒ|jd8_nÓ|tkrx|j|dƒ|jd8_|jj|jƒg|_n‰||jkr+|j|dƒ||jkrÂt d|j|fƒ‚n|jd8_|j|sý|jj||j ƒfƒn|jj||j fƒg|_ d|_nÖ||j krñ|j|dƒ|jdkrlt d|ƒ‚n||j|jkržt d||jfƒ‚n||jkrÉt d|j|fƒ‚n|j j||j ƒfƒd|_nt d|ƒ‚dS( s,SAX XML logic for parsing new element found.iiis%Mismatched start and end tags (%s/%s)sTag %s found outside collections#Tag %s not allowed in %s collectionsUnsupported end tag N(R!R RR"R tappendR RRRtstripRRRR(RR#tvalueR%((s9/opt/freeware/lib/python2.7/site-packages/boto/gs/cors.pyt endElementfs@       cCs"dtd}xû|jD]ð}|dtd7}xÃ|D]»\}}|dk sUt‚|d|d7}t|tƒrƒ||7}n]xZ|D]R\}}|dk s¨t‚|dk sºt‚|d|d|d|d7}qŠW|d|d7}q7W|dtd7}qW|dtd7}|S(s3Convert CORS object into XML string representation.tss