ÿØÿàJFIFÿþ ÿÛC       ÿÛC ÿÀÿÄÿÄ"#QrÿÄÿÄ&1!A"2qQaáÿÚ ?Øy,æ/3JæÝ¹È߲؋5êXw²±ÉyˆR”¾I0ó2—PI¾IÌÚiMö¯–þrìN&"KgX:Šíµ•nTJnLK„…@!‰-ý ùúmë;ºgµŒ&ó±hw’¯Õ@”Ü— 9ñ-ë.²1<yà‚¹ïQÐU„ہ?.’¦èûbß±©Ö«Âw*VŒ) `$‰bØÔŸ’ëXÖ-ËTÜíGÚ3ð«g Ÿ§¯—Jx„–’U/ÂÅv_s(Hÿ@TñJÑãõçn­‚!ÈgfbÓc­:él[ðQe 9ÀPLbÃãCµm[5¿ç'ªjglå‡Ûí_§Úõl-;"PkÞÞÁQâ¼_Ñ^¢SŸx?"¸¦ùY騐ÒOÈ q’`~~ÚtËU¹CڒêV  I1Áß_ÿÙ aNc@sdZddlZddlZddlZddlmZddlmZdZd e fdYZ dddZ de fdYZ dZ dddZdS(s An application that proxies WSGI requests to a remote server. TODO: * Send ``Via`` header? It's not clear to me this is a Via in the style of a typical proxy. * Other headers or metadata? I put in X-Forwarded-For, but that's it. * Signed data of non-HTTP keys? This would be for things like REMOTE_USER. * Something to indicate what the original URL was? The original host, scheme, and base path. * Rewriting ``Location`` headers? mod_proxy does this. * Rewriting body? (Probably not on this one -- that can be done with a different middleware that wraps this middleware) * Example:: use = egg:Paste#proxy address = http://server3:8680/exist/rest/db/orgs/sch/config/ allowed_request_methods = GET iN(thttpexceptions(tasliststransfer-encodingt connections keep-alivesproxy-authenticatesproxy-authorizationttettrailerstupgradetProxycBs eZdddZdZRS(cCs||_tj||_|jdj|_|jd|_|jd|_g|D]}|rX|j^qX|_g|D]}|r|j^q|_ dS(Niii( taddressturlparseturlsplittparsedtlowertschemethosttpathtallowed_request_methodstsuppress_http_headers(tselfRRRtx((s</opt/alt/python27/lib/python2.7/site-packages/paste/proxy.pyt__init__6s (cCs|jr8|dj|jkr8tjd||S|jdkrStj}n7|jdkrntj}ntd|j |jf||j }i}xs|j D]e\}}|j dr|djj dd }|d ks||jkrqn|||(t __class__RJthextidRORP(R((s</opt/alt/python27/lib/python2.7/site-packages/paste/proxy.pyt__repr__s cCs|d}|jdkr"|}n |j}|dkrCtj}n(|dkr[tj}ntd|d|krtdn|d}|jdkr|}n |j}||}i} xR|jD]D\} } | jdr| dj j d d } | | | |d|d7}n|j|d|| | |j}t|j}d|j|jf}||||jd} | dk r|j t | } n |j } |j| gS(Nswsgi.url_schemeRRsUnknown scheme %rt HTTP_HOSTs*WSGI environ must contain an HTTP_HOST keyRiRRR RtHTTP_X_FORWARDED_FORsx-forwarded-forRs content-typeRs wsgi.inputiRit SCRIPT_NAMERR!R"Rs%s %sscontent-length(ROR:RPR$R%R&R'R(R)R R*R+R/R,R-R.R0R1R3R4R5R6R7R8R9R;(RR<R=R t conn_schemeR>R t conn_hostR?R@RARBRDRCRRGRHR7((s</opt/alt/python27/lib/python2.7/site-packages/paste/proxy.pyRIsn                          N(RJRKt__doc__R:RRTRI(((s</opt/alt/python27/lib/python2.7/site-packages/paste/proxy.pyRNs   cCsg}x|jD]}|s"qn|djr|sKtd|n|j\}}|d|j}|j||fqny|jdd\}}Wntd|nX|j}|jtkr|j||fqqW|S(sB Turn a Message object into a list of WSGI-style headers. is%First header starts with a space (%r)t t:isInvalid header: %r( R@tisspaceR'tpoptstriptappendtsplitR tfiltered_headers(tmessageRHt full_headert last_headert last_valueRBtheader((s</opt/alt/python27/lib/python2.7/site-packages/paste/proxy.pyR5s( RcCstd|d|S(s Create a proxy that connects to a specific host, but does absolutely no other filtering, including the Host header. RORP(RN(RLRORP((s</opt/alt/python27/lib/python2.7/site-packages/paste/proxy.pytmake_transparent_proxys (stransfer-encodingRs keep-alivesproxy-authenticatesproxy-authorizationRRR(RZR$RR0tpasteRtpaste.util.convertersRRbtobjectRRMRNR5R:Rh(((s</opt/alt/python27/lib/python2.7/site-packages/paste/proxy.pyts&   Q \