m -Ec@sdZdkZdkZdkZdkZdkZdklZdklZdkl Z dk l Z dk l Z dk lZdklZd efd YZd efd YZd ZdZdZeadadZdZdeeee dZdZe Zhei ei!dZ"dfdYZ#da$e Z%eZ&da'dZ(dZ)dZ*dZ+dS(svPython Object Publisher -- Publish Python objects on web servers $Id: Publish.py 67721 2006-04-28 14:57:35Z regebro $N(sResponse(sRequest(s allocate_lock(smapply(sRedirect(sStringIO(sbuild_http_datet WSGIResponsecBs2tZdZdZeideiidZRS(sA response object for WSGI This Response object knows nothing about ZServer, but tries to be compatible with the ZServerHTTPResponse. Most significantly, streaming is not (yet) supported.isc Cs|io|iodSq$dSn|i}|i}|id o=|id o,|i o!|idjo|idn|id o%|i o|i dt |n|i dd}|djo|i d|ng}|i} |i dd }| d |ipd |f|ido |d=n| d |i| d tti|id joK|idjo'|iido|i ddq|i ddn|idjo|idjo|i ddq]|iidpE|io'|io|i ddd|_qY|i ddq]nx|iD]\} }| i| jod| d i| df} d} | id| }xf|| joTd| | | |d|d!i| |df} |d} | id| }qWn| d| |fqjW|io||i}n|i |g|t |)di!|S(Ns0 ts content-typescontent-lengthit nocontentitstatuss200 OKs HTTP/%s %ss1.0s Server: %ssDate: %ss keep-alivet Connections Keep-Alivetcloses1.1sTransfer-Encodingtchunkedis%s%st-s%s-%s%sis%s: %ss ("tselft_wrotet _chunkingtheaderstbodythas_keyt _streamingRt setStatust setHeadertlentgettNonetcontent_lengththeadersltappendt _http_versiont_server_versiontbuild_http_datettimet_http_connectiont http_chunktitemstkeytvaltlowertuppertstarttfindtltcookiest _cookie_listtaccumulated_headerstjoin( Rt html_searchR RRRR R$RRR"R((t7/data/zmath/zope/lib/python/ZPublisher/WSGIPublisher.pyt__str__%sb    =   #   4  ( t__name__t __module__t__doc__RtretcompiletItsearchR+(((R*Rs tRetrycBs)tZdZeeedZdZRS(s"Raise this to retry a request cCs|||f|_dS(N(tttvttbRt_args(RR4R5R6((R*t__init__yscCsa|i\}}}|djo t}n|djo ||nz|||Wdd}XdS(N(RR7R4R5R6RR3(RR4R5R6((R*treraise|s  (R,R-R.RR8R9(((R*R3us cCst||}|S(N(tapplytobjecttargstresult(R;R<trequestR=((R*t call_objectscCs1|djo|ddSn|ii|dS(NRtPARENTSi(tnameR>tresponsetbadRequestError(RAR>((R*t missing_names cCs|iid|idS(Nsclass %s(R>RBtforbiddenErrortklassR,(RFR>((R*tdont_publish_classscCs |adS(N(t debug_modet_default_debug_mode(RH((R*tset_default_debug_modescCs |adS(N(trealmt_default_realm(RK((R*t set_default_authentication_realmsic Cst|\}}}}}}} } d}d}y|i|i} |i }| ddiidjo'| dd} | o t| qn||d<|o ||_n|o!|idd o ||_n|dj o |n| d}|g|d<}| o| in|i|d | }| o| i||n|||i||d |||d d }||j o|i |n| o| i!n|SWnd}|dj ot#|d d}n|dj o_d k$l%}t&i'd \}}|dt#|d|||o|dpdfn|dj o|o|d}nzy8|||t&i'dt&i'd t&i'dSWnXt*j oL|i+p8|||t&i'dt&i'd t&i'dSq nXWd| o| i,nX|i-} |i/zt0| |||SWd| i/Xq| o| i,nnXdS(NtSUBMITRtcancelt CANCEL_ACTIONit REMOTE_USERt PATH_INFOR@tvalidated_hookitbindt setMessage(scompact_tracebackis %s: %s %sR,i(2tget_module_infot module_namet bobo_beforet bobo_afterR;RKRHterr_hookRSttransactions_managerRtparentsRBR>t processInputsRt request_gettstripR ROtRedirectt after_listtpathtbeginttraversetrecordMetaDatatmapplyR<R?RDRGR=tsetBodytcommittsmtgetattrtasyncoretcompact_tracebacktsystexc_infotclRR3tsupports_retrytaborttretryt newrequestRtpublishtdebug(R>RWRaRuR?RDRGRfRoR^RsROR[RSRKR\RlR;RZRHRbRBRYRRiRXR=((R*Rts$   "          <          cCs*d}d} dg}t}t}td|d|} |di dd| _ |i dd | _ |d | _t|d || } |i d t}y"t| d ddgd|} Wntj o%}ti}| ii|ntj o}t|tot|djo |}n:ttdoti}nt|tidf}| iid|n!| ii| i} nX| o| id} t | }|i dd\}}g} |i ddD]} | t| i ddq~ }|| ||i'|f}n| i(|i(|ddj o|dn|oy9t|ddo|di)}nt*|d}Wn|dodpd}nXt| ido| ii+|nz|d|d|dWdd}Xn|S(NiitstdouttstderrtSERVER_PROTOCOLt/itCONNECTION_TYPERtSERVER_SOFTWAREs wsgi.inputswsgi.handleErrorstZope2RaRuiRniRs s s: tcodet_requestShutdown(,tmust_dieRRRatStringIORvRwRRBtenvirontsplitRRRRtRequestR>tTruet handle_errorsRtt SystemExitR5RmRnt exceptiont ImportErrort isinstancettupleRthasattrt getStatust getHeadertstrR=R R t_[1]tntstart_responsetgetvalueRR}tintR~(RRR R}RvRR=RaRRRBR>RRR RwR5((R*tpublish_module_standardsf     #   @    cCs |i|o ||Sn|ddjo|d }n|d}t}zydt|||d }t |do |i }nt dj o t }n|}d} t |do|i } nt} t|dd}t|dd} t |do |i} n$t |d o |i} n|} t|d d} t|d d}t|d d}|p t}n|| | || | ||f} | ||<||d<| SWn:ti\}}}t |}t!||f|nXWdd}|XdS(Nis.cgiR.t__bobo_realm__t__bobo_debug_mode__t__bobo_before__t__bobo_after__tbobo_applicationt web_objectstzpublisher_exception_hooktzpublisher_validated_hooktzpublisher_transactions_manager(s__doc__(#tmodulesR RWtacquireRR6tglobalstgt __import__tmoduleRRRKRLRHRRIRjRXRYRR;Rt error_hookRSR[tDefaultTransactionsManagertinfoRmRnR4R5RRtrelease(RWRRRRR[RSRKR6RR;RHRRYRR4R5RX((R*RVNsR         RcBs,tZdZdZdZdZRS(NcCstidS(N(t transactionRc(R((R*RcscCstidS(N(RRh(R((R*RhscCstidS(N(RRq(R((R*RqscCsb|i}ti}|i|d|dd}|dj o|i||dndS(NRRtAUTHENTICATED_USERtAUTHENTICATION_PATH( R>RR^RtTtnoteRt auth_usertsetUser(RR;R>R^RR((R*Res    (R,R-RcRhRqRe(((R*Rs   cCs |adS(N(tfilenamet_pfile(R((R*tinstall_profilingscCs0yt||}Wn d}nX|t_dS(N(t_pfuncRRtrRRmt_pr_(RRR((R*tpms  c Csdk}dk}tiztdj otid}n|id}|ddjot ||Sn|i }|i tt|ti}|itdjo|i|at_nti|WdtiX|djoyti}ttd}|id|t_ti i!di"dti i!di"d|i#|i$WnnX|d |d |d n|S( NRRitmanage_profiletws}See the url http://www.python.org/doc/current/lib/module-profile.html for information on interpreting profiler statistics. t cumulativeiRiii(%tprofiletpstatst_plockRR>RRt path_infoRRRtProfiletpobjtruncallRtmenvironRmRR=t create_statst_pstattStatst_ps_taddRRnterrortopenRtfiletwriteRvt strip_dirst sort_statst print_statstflushR( RRRRR=RRRR((R*tpublish_module_profileds@            cCs)tot||Snt||SdS(s< publish a Python module, with or without profiling enabled N(RRRRR(RR((R*tpublish_modules(,R.RmtosR/RRtResponseRt maybe_lockt allocate_lockRft zExceptionsR`t cStringIORtZServer.medusa.http_dateRRt ExceptionR3R?RDRGtFalseRIRRLRJRMRtRt_lRRRVRRRRRRRRR(R`R3RGRRfRRRDRMRR?RtR/RRRRRRRmRJRRRRRR.RRVRR((R*t? s>$        Z     m G B    &