; ybCc@sEdZdklZdklZdklZdkZdk Z dk l Z l Z dk lZlZdefdYZd klZlZyd klZWnnXyd klZWn eZnXd fd YZdefdYZdZdZdZdZdZdZ 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 RequestIOcBstZdZddZedZdZdZdZddZ d Z d Z d Z d Z d ZdZdZdZdZdZdZRS(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. icCsdSdS(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|ii||it|7_dS(N(sssselfs headers_sentsouts getOutStreamswritesposslen(sselfss((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pyswrite>s  cCs#|ii|id|_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|idS(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|idS(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|ii||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$                 sServiceRequestcBstZdZeZeZeZeZeZeZ edZ dZ dZ dZ dZdZdZdZeed Zd Zed Zd ZhZd ZdZedZdZddZddZdZdZdZ dZ!edZ"dZ#dZ$eedZ%edZ&eZ'dZ(dZ)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.pyspsoscCs|iiSdS(N(sselfsimpls getOutStream(sself((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys getOutStreamscCs|iiSdS(N(sselfsimpls getInStream(sself((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys getInStreamscCsdS(N((sselfsserviceHandlers reqHandler((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pyssetupscCs5ti||itj o|ii|ndS(N(s RequestIOsclosesselfs_sessionsNonessave(sself((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pyscloses cCs|ii|dS(N(sselfsimpls getStatusCodescode(sselfscode((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys getStatusCodescCsX|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 getEnvirons   cCs||i|/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys setEnvironscKs||ojx*|iD]\}}|i||qWt|||_|ii o|i |iqqn|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 getSessions cCs|ii||dS(N(sselfsimpls setSessionssession(sselfssession((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys setSessionscCs|iiSdS(N(sselfsimpls getCookieKey(sself((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys getCookieKeyscCsm|itjoR|i|iid}|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 getCookiess cCs|ii||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 getCookiescKse|i}|||/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys setCookies   s text/htmlcCs|iid oJ|iid o/|iid o||id/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pyssend_http_headers 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|ii|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]-}||iijo||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|ido|ii|Sn]|ii|oE|ii|}|ot |t gjo|Sq|gSngSdS(sreq.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|iiD]<}|i|}x$|D]}|ii||fqCWq'Wn|iSdS(N(sselfsinputSeqs getInputsskeysskeysvaluessvaluesappend(sselfsvaluessvalueskey((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys getInputSeqFs  "cCsV|i o@h|_x4|iiD]}|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(sreq.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~scCst o dnd|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/iii(sUrlsselfs getEnvironsurlslistsurlparsespartss info_pathspathssplitsdummysrfindsindxsscriptsinsert(sselfsdummysscriptsindxs info_pathsurlspartsspath((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pysuriPartss$     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.pysssdoseqis%s%s%siis%s%si(squerysiskeyskwsshas_keyspartsscleansqsstypessplitsquerySeqsmapsksvsappendsupdatesitemssvaluessvalues urlencodestuples urlunparse( sselfspartsscleanskwssqsskeysisquerySeqsvaluesvaluessvsquerysk((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pysbuildUrisL         icKs/t|i}|i|||}|SdS(N(slistsselfsuriPartsspartssbuildUriscleanskwssurl(sselfscleanskwssurlsparts((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pys serviceUriscCs(t|i}dt|d SdS(Ns %s://%s%s/i(slistsselfsuriPartsspartsstuple(sselfsparts((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pysbaseUriscCs|i|SdS(N(sselfsbaseUrispage(sselfspage((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pyspageUriscGsltt|}dtidi|f}ytii |Wn#dk }|i d|inXdS(Ns %s: %ss sfile( smapsstrsargsstimesctimesjoinspostssyssstderrswrites tracebacks print_excsself(sselfsargss tracebackspost((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pyslogs (/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|_|iidt|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.pyskeeps   cCsS|i o(|i|ii|iindk}|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.pyssaves    cCsp| o t}n|iiytdcd7/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pyspsoTests cCsTt}dk}||_dGdGH|ii|iiddGdGHdS(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|idGHdS(Nshellosworld(ssyssServiceRequestsstdoutsreqssend_http_header(ssyssreq((s>/home/groups/p/ps/pso/htdocs/tutorial/DataModel/pso/request.pysredtest1!s   cCs t}dG|idGHdS(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    Ct