o ckF[%ã@sfddlZddlmZddlmZddlmZdZdZdZ dZ d Z d Z d Z d Zd ZGdd„dejƒZdS)éN)ÚUser)ÚInvalidCorsError)ÚhandlerÚ CorsConfigÚCorsÚOriginsÚOriginÚMethodsÚMethodÚResponseHeadersÚResponseHeaderÚ MaxAgeSecc@s8eZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd S) rz0Encapsulates the CORS configuration XML documentcCsPg|_g|_g|_ttgttgttgt gi|_ tttg|_ d|_ d|_ d|_dS)Nr)ÚcorsÚ collectionsÚelementsÚORIGINSÚORIGINÚMETHODSÚMETHODÚHEADERSÚHEADERÚ MAXAGESECÚlegal_collectionsÚlegal_elementsÚ parse_levelÚ collectionÚelement)Úself©rú./usr/lib/python3/dist-packages/boto/gs/cors.pyÚ__init__(sü  z Cors.__init__cCs |j|krtd||jfƒ‚dS)z#Verify parse level for a given tag.z"Invalid tag %s at parse level %d: N)rr)rÚtagÚlevelrrrÚvalidateParseLevelGs ÿÿzCors.validateParseLevelcCsÞ|tkr| |d¡|jd7_dS|tkr&| |d¡|jd7_dS||jvr=| |d¡|jd7_||_dS||jvri| |d¡|jdurStd|ƒ‚||j|jvrdtd||jfƒ‚||_dStd|ƒ‚) ú,SAX XML logic for parsing new element found.réééNúTag %s found outside collectionú#Tag %s not allowed in %s collectionzUnsupported tag ) Ú CORS_CONFIGr#rÚCORSrrrrr)rÚnameÚattrsÚ connectionrrrÚ startElementMs(         ÿ  zCors.startElementcCsv|tkr| |d¡|jd8_dS|tkr0| |d¡|jd8_|j |j¡g|_dS||jvrq| |d¡||jkrIt d|j|fƒ‚|jd8_|j|s`|j ||  ¡f¡n |j ||j f¡g|_ d|_dS||j vrµ| |d¡|jdur‡t d|ƒ‚||j|jvr˜t d||jfƒ‚||j kr¦t d|j |fƒ‚|j  ||  ¡f¡d|_ dSt d|ƒ‚) r$r%r&r'z%Mismatched start and end tags (%s/%s)Nr(r)zUnsupported end tag )r*r#rr+rÚappendrrrrÚstriprrr)rr,Úvaluer.rrrÚ endElementfsF      ÿ      ÿ ÿ  zCors.endElementcCsàdtd}|jD]\}|dtd7}|D]G\}}|dusJ‚|d|d7}t|tƒr1||7}n#|D] \}}|dus=J‚|dusCJ‚|d|d|d|d7}q3|d|d7}q|dtd7}q |dtd7}|S)z3Convert CORS object into XML string representation.ú<ú>Nzs