;ò æybCc@sEdZdklZdklZdklZdkZdk Z dk l Z l Z dk lZlZdefd„ƒYZd klZlZyd klZWnnXyd klZWn eZnXd fd „ƒYZdefd„ƒYZd„Zd„Zd„Zd„Zd„Zd„Z e!djo e ƒndS(s$Revision: 1.19 $(smktemp(s StringType(s SimpleCookieN(sSessionsCookieFileImpl(sHTTP_MOVED_PERMANENTLYsHTTP_MOVED_TEMPORARILYs SERVER_RETURNcBstZRS(N(s__name__s __module__(((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys SERVER_RETURNs(surlparses urlunparse(s urlencode(sUrls RequestIOcBs°tZdZdd„Zed„Zd„Zd„Zd„Zdd„Z d „Z d „Z d „Z d „Z d „Zd„Zd„Zd„Zd„Zd„Zd„ZRS(s® RequestIO is a proxy ouput stream. Everything writen to it will be buffered until the headers are sent or complete. Then the contents is flused to the real out stream. iÿÿÿÿcCsdSdS(Ns((sselfsn((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pysread0scCsdSdS(Ns((sselfslength((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pysreadline1scCsgSdS(N((sself((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys readlines2scCs|idi|ƒƒdS(Ns(sselfswritesjoinslist(sselfslist((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys writelines3scCsdSdS(Ni((sself((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pysisatty5sicCsdS(N((sselfspossmode((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pysseek6scCs(d|_d|_d|_t|_dS(Nis(sselfsposs headers_sentsoutsNones header_out(sself((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys__init__8s   cCsZ| odSn|i o|i|7_n|iƒi|ƒ|it|ƒ7_dS(N(sssselfs headers_sentsouts getOutStreamswritesposslen(sselfss((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pyswrite>s  cCs#|iƒi|iƒd|_dS(Ns(sselfs getOutStreamswritesout(sself((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pysflushFscCs1|itjo|iiƒ|_n|iSdS(N(sselfs header_outsNonesimpls getHeadersOut(sself((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys getHeadersOutKscCs |iSdS(N(sselfspos(sself((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pystellPscCs|iƒ|iƒdS(N(sselfssend_http_headersflush(sself((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pyscloseQs cCs d|_dS(Ni(sselfs headers_sent(sself((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys headersSentVscCs|iƒdS(N(sselfsclose(sself((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys__del__YscCs7t|ƒtjot|ƒ}n||iƒ|/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys setHeaderOut\scCs|iƒi||ƒdS(s add a header entry. N(sselfs getHeadersOutsaddskeysvalue(sselfskeysvalue((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys addHeaderOutdscCs|iƒ|=dS(N(sselfs getHeadersOutskey(sselfskey((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pysremoveHeaderOutis(s__name__s __module__s__doc__sreadsNonesreadlines readliness writelinessisattysseeks__init__swritesflushs getHeadersOutstellscloses headersSents__del__s setHeaderOuts addHeaderOutsremoveHeaderOut(((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys RequestIO*s$                 sServiceRequestcBs”tZdZeZeZeZeZeZeZ ed„Z d„Z d„Z d„Z d„Zd„Zd„Zd„Zeed „Zd „Zed „Zd „ZhZd „Zd„Zed„Zd„Zdd„Zdd„Zd„Zd„Zd„Z d„Z!ed„Z"d„Z#d„Z$eed„Z%ed„Z&eZ'd„Z(d„Z)d „Z*d!d"„Z+d#„Z,d$„Z-d%„Z.RS(&s) Bridge class for a http service Request cCsKti|ƒ|ƒ|_|ii||ƒd|_|idƒ|_ dS(NsiÈ( s RequestIOs__init__sselfs implClasssimplssetupsreqsresponses getStatusCodesstatus(sselfs implClasssreq((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys__init__vs    cCs|SdS(N(sself(sself((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys__call__scCs|SdS(s returns proxy to pso object N(sself(sself((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pyspso‚scCs|iiƒSdS(N(sselfsimpls getOutStream(sself((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys getOutStream†scCs|iiƒSdS(N(sselfsimpls getInStream(sself((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys getInStream‰scCsdS(N((sselfsserviceHandlers reqHandler((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pyssetupŒscCs5ti|ƒ|itj o|ii|ƒndS(N(s RequestIOsclosesselfs_sessionsNonessave(sself((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pyscloseŽs cCs|ii|ƒdS(N(sselfsimpls getStatusCodescode(sselfscode((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys getStatusCode—scCsX|itjo|ii|ƒ|_n|tjo |iSn|ii||ƒSdS(s© if key is not given returns a dict of the server environment. Otherwise returns the entry for key. If no entry is found returns None or default if given. N(sselfsenvironsNonesimpls getEnvironskeysgetsdefault(sselfskeysdefault((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys getEnvironŸs   cCs||iƒ|/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys setEnviron«scKs||ojx*|iƒD]\}}|i||ƒqWt||ƒƒ|_|ii ƒo|i |iƒqqn|iSdS(sî returns the current session. The session implentation class may be passed to sessionImplClass, which if None defaults to CookieFileImpl. The method can be passed keyword arguments which will be treated as HTTP directives N( ssessionImplClasss parameterssitemssksvsselfs setEnvironsSessions_sessionsisNews setSession(sselfssessionImplClasss parameterssksv((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys getSession·s cCs|ii||ƒdS(N(sselfsimpls setSessionssession(sselfssession((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys setSessionÅscCs|iiƒSdS(N(sselfsimpls getCookieKey(sself((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys getCookieKeyÏscCsm|itjoR|i|iiƒdƒ}|o tƒ|_|ii|ƒqbtƒ|_n|iSdS(sB req.getCookies()-> dict returns a dictionary of cookies. sN(sselfscookiessNones getEnvironsimpls getCookieKeys CookiePotsload(sselfscookies((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys getCookiesÒs cCs|iƒi||ƒSdS(so returns the cookie requested by key otherwise returns default, if default is not given returns None. N(sselfs getCookiessgetskeysdefault(sselfskeysdefault((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys getCookieáscKse|iƒ}|||/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys setCookieès   s text/htmlcCsŸ|iƒidƒ oJ|iƒidƒ o/|iƒidƒ o||iƒd/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pyssend_http_headerøs icCs|ii|||ƒdS(s/ force an imediate redirect to given url. N(sselfsimplsredirectsurls permanent(sselfsurls permanent((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pysredirect scCs|id|ƒdS(sE set the HTTP return status. This normally defaults to 200. sstatusN(sselfs setHeaderOutsstatus(sselfsstatus((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys setStatusscCs!|i|ƒ|ii|ƒdS(sE set the HTTP return status. This normally defaults to 200. N(sselfs setStatussstatussimpls sendStatus(sselfsstatus((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys sendStatuss cCs|iƒi|ƒSdS(sFreq.hasInput(key) -> 1 | 0 tests if a field in a form was filled. N(sselfs getInputsshas_keyskey(sselfskey((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pyshasInput%scGsFgi}|D]-}||iƒiƒjo||ƒqq~SdS(N(sappends_[1]skeysskeysselfs getInputs(sselfskeyss_[1]skey((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys hasInputs+scCs¾|i o|ii|ƒ|_n| o |iSnt|idƒo|ii|ƒSn]|ii|ƒoE|ii|ƒ}|ot |ƒt gƒjo|Sq¶|gSngSdS(særeq.getInput(key) -> FiledStorage| List of Fields if key is given will return a list of fields values for that key. if there are no values an empty list is returned. if no key is given returns the cgi.FieldStorage object. sgetlistN( sselfsinputssimpls getInputsskeyshasattrsgetlistshas_keysgetvaluesvaluestype(sselfskeysvalue((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys getInputs0s    cCsv|i o`g|_xT|iƒiƒD]<}|i|ƒ}x$|D]}|ii||fƒqCWq'Wn|iSdS(N(sselfsinputSeqs getInputsskeysskeysvaluessvaluesappend(sselfsvaluessvalueskey((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys getInputSeqFs  "cCsV|i o@h|_x4|iƒiƒD]}|i|ƒ|i|/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys getInputDictNs   cCs9| o d}ny|i|ƒ|SWn |SnXdS(sreq.getInput(key) -> String | default returns the given form field value as a String. If there are multiple values under the same key, it will return the first in the list, unless index is given. If no value is found will return "", unless default is given. iN(sindexsselfs getInputsskeysdefault(sselfskeysdefaultsindex((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pysgetInputUs cCsb|i|ƒoJ|iƒ|}|io,t|i_t |i_ t |i_ |SqZn|SdS(sÍreq.getFile(fieldname)-> Field returns an uploaded file. The filed has the usual cgi.Field members plus filename - the given file name file - the actual file uploaded tempname - is None until keep() is called. the methods: keep() - The file object is a temporay file that will be deleted when the cgi terminates. keep asigns the file a a temp file name. save(name) - This method can be used to save the tempfile under the given name. N( sselfshasInputskeys getInputssfilesfilenamesNones __class__stempnameskeepssavesdefault(sselfskeysdefaultsfile((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pysgetFilees      cCs8|itjotd|iƒƒ|_n|iSdS(Ns#http://%(HTTP_HOST)s%(REQUEST_URI)s(sselfs_urlsNonesUrls getEnviron(sself((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pysgetUrl~scCsât o d‚nd|iƒ}tt|ƒƒ}|iddƒ}|d}|o|i |ƒ\}}n|i dƒ}|djo||}|| }n |}d}||d<|id|ƒ|id |ƒ|SdS( Ns&under mod_python urlparse has problemss#http://%(HTTP_HOST)s%(REQUEST_URI)ss PATH_INFOsis/iÿÿÿÿii(sUrlsselfs getEnvironsurlslistsurlparsespartss info_pathspathssplitsdummysrfindsindxsscriptsinsert(sselfsdummysscriptsindxs info_pathsurlspartsspath((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pysuriParts…s$     c Ks,h} d}xVdddddddfD]9}|i|ƒo||||<||=n|d 7}q(W|od |d \} } | i| ƒo| | i| ƒqÐ| g| | /home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys¬ssdoseqis%s%s%siis%s%si(squerysiskeyskwsshas_keyspartsscleansqsstypessplitsquerySeqsmapsksvsappendsupdatesitemssvaluessvalues urlencodestuples urlunparse( sselfspartsscleanskwssqsskeysisquerySeqsvaluesvaluessvsquerysk((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pysbuildUri›sL         icKs/t|iƒƒ}|i|||�}|SdS(N(slistsselfsuriPartsspartssbuildUriscleanskwssurl(sselfscleanskwssurlsparts((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys serviceUriÇscCs(t|iƒƒ}dt|d ƒSdS(Ns %s://%s%s/i(slistsselfsuriPartsspartsstuple(sselfsparts((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pysbaseUriÌscCs|iƒ|SdS(N(sselfsbaseUrispage(sselfspage((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pyspageUriÐscGsltt|ƒ}dtiƒdi|ƒf}ytii |ƒWn#dk }|i d|iƒnXdS(Ns %s: %ss sfile( smapsstrsargsstimesctimesjoinspostssyssstderrswrites tracebacks print_excsself(sselfsargss tracebackspost((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pyslogÔs (/s__name__s __module__s__doc__sNonesinputssinputSeqs inputDictscookiessenvirons_sessions__init__s__call__spsos getOutStreams getInStreamssetupscloses getStatusCodes getEnvirons setEnvironsCookieFileImpls getSessions setSessionssessions getCookieKeys getCookiess getCookies setCookiessend_http_headersredirects setStatuss sendStatusshasInputs hasInputss getInputss getInputSeqs getInputDictsgetInputsgetFiles_urlsgetUrlsuriPartssbuildUris serviceUrisbaseUrispageUrislog(((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pysServiceRequestmsV                         ,   cCss|i odtƒ|_|iidƒt|idƒ}|i|iiƒƒ|i ƒt|iƒ|_ndS(s8 req.getFile(key).keep() -> file This method is added to file form fields. Files that are uploaded are stored as nameless temporary files. This method allows you to store the file, so it can be processed at a later stage. Calling it replaces the nameless temp file with the new named temp file. iswbN( s fileFieldstempnamesmktempsfilesseeksopensfpswritesreadsclose(s fileFieldsfp((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pyskeepàs   cCsS|i o(|iƒ|iiƒ|iiƒndk}|i|i|ƒdS(sÙ req.getFile(key).saveAs(somename) -> None This method is added to file form fields. Files that are uploaded are stored as nameless temporary files. This method alows you to store the file with a given name. N( s fileFieldstempnameskeepsfilesflushsclosesossrenamesnewName(s fileFieldsnewNamesos((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pyssaveòs    cCsp| o tƒ}n|iƒiƒytdcd7/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pyspsoTests cCsTtƒ}dk}||_dGdGH|iƒiƒ|iƒidƒdGdGHdS(Nis hello worlds 2. hello worldis third time(sServiceRequestsreqssyssstdoutspsossend_http_headerswrite(ssyssreq((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys simpleTests    cCs0dk}tƒ|_}dG|iƒdGHdS(Nshellosworld(ssyssServiceRequestsstdoutsreqssend_http_header(ssyssreq((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pysredtest1!s   cCs tƒ}dG|iƒdGHdS(Nshellosworld(sServiceRequestsreqssend_http_header(sreq((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pysredtest2)s  s__main__("s __version__stempfilesmktempstypess StringTypesCookies SimpleCookies CookiePotstimessysssessionsSessionsCookieFileImpls resultcodessHTTP_MOVED_PERMANENTLYsHTTP_MOVED_TEMPORARILYs Exceptions SERVER_RETURNsurlparses urlunparsesurllibs urlencodesurlsUrlsNones RequestIOsServiceRequestskeepssavespsoTests simpleTestsredtest1sredtest2s__name__(s urlencodesCookieFileImplsredtest2s CookiePots urlunparsesmktemps StringTypesHTTP_MOVED_PERMANENTLYs simpleTestssavesredtest1sUrlsServiceRequests SERVER_RETURNsHTTP_MOVED_TEMPORARILYssyss __version__skeepsurlparsespsoTestsSessionstimes RequestIO((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys?s8    Cÿt