V Qc@sddlZddlZddlZddlZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZi dd6dd6dd6dd6dd 6dd 6dd 6dd 6dd 6dd6dd6dd6ZdZdZdZd Zd!Zd"Zd#Zd$Zd%Zd&Zd'Zd(Zd)Z d*Z!d+Z"d,Z#i ed6ed6e"d 6e"d 6ed 6e d 6e!d 6e"d6e#d6Z$d-d3d.YZ%d/d4d0YZ&d1Z'd2Z(e(dS(5iNtsgopher.micro.umn.eduiFt0t1t2t3t4t5t6t7t8t9t+tssssssss ssss ss s cCsh|st}n*t|tdkr9tj|}ntjtjtj}|j||f|S(NR(tDEF_PORTttypetstringtatoitsockettAF_INETt SOCK_STREAMtconnect(thosttportR ((s+/usr/lib64/python2.7/Demo/sockets/gopher.pyt open_socket)s cCs:t||}|j|t|jd|jdS(Nitr(RtsendtCRLFtshutdowntmakefile(tselectorRRR ((s+/usr/lib64/python2.7/Demo/sockets/gopher.pyt send_request3s cCs(t|||}g}x|j}|s6dGHPn|dtkrS|d }n|dtkrp|d }n|dkrPn|sdGHqn|d}tj|dt}t|dkrd |fGHqnt|dkrd |dfGHn|jd||j|q|j |S( Ns(Unexpected EOF from server)iit.s(Empty line from server)iiis(Bad line from server: %r)s(Extra info from server: %r)( RtreadlineRRt splitfieldstTABtlentinserttappendtclose(RRRtftlisttlinettypechartparts((s+/usr/lib64/python2.7/Demo/sockets/gopher.pytget_menu:s6       cCs g}t||||j|S(N(tget_alt_textfileR%(RRRR(((s+/usr/lib64/python2.7/Demo/sockets/gopher.pyt get_textfileXscCst|||}x|j}|s0dGHPn|dtkrM|d }n|dtkrj|d }n|dkrzPn|d dkr|d}n||q|jdS(Ns(Unexpected EOF from server)iiRis..i(RR RR&(RRRtfuncR'R)((s+/usr/lib64/python2.7/Demo/sockets/gopher.pyR-^s       cCs,t|||}|j}|j|S(N(RtreadR&(RRRR'tdata((s+/usr/lib64/python2.7/Demo/sockets/gopher.pyt get_binaryqs  cCs?t|||}x&|j|}|s.Pn||qdS(N(RR0(RRRR/t blocksizeR'R1((s+/usr/lib64/python2.7/Demo/sockets/gopher.pytget_alt_binaryxs cGst}t}t}t|}|dkrA|drA|d}n|dkrd|drd|d}n|dkr|dr|d}n|dkrtdnyt|||WnAtjk r}dG|GHtj dnt k rdGHnXdS(Niiiis too many argss Socket error:s [Goodbye]( t DEF_SELECTORtDEF_HOSTR R#t RuntimeErrort browse_menuRterrortsystexittKeyboardInterrupt(targsRRRtntmsg((s+/usr/lib64/python2.7/Demo/sockets/gopher.pytbrowsers&        cCst|||}xdGHdGt|GHdG|GdG|GHHxtt|D]u}||}|d|d}}tjt|dddG|Gtj|rt|GHqNd t|d GHqNWHxytd }Wnt k rHdSX|sdSytj |} Wntj k r,d GHqnXd| koJt|knsZd GHqnPq|| d}|d}|dd!\} } } t j|rt |} y| | | | Wqt tjfk rdGtjGdGtjGHqXqdGHqdS(Ns----- MENU -----s Selector:sHost:s Port:iiit:ssChoice [CR == up a level]: s#Choice must be a number; try again:sChoice out of range; try again:iis***sUnsupported object type(R,treprtrangeR#Rtrjustttypenamethas_keyt raw_inputtEOFErrorRt atoi_errort typebrowsertIOErrorRR9R:texc_typet exc_value(RRRR(tititemR*t descriptiontstrtchoicet i_selectorti_hostti_portt browserfunc((s+/usr/lib64/python2.7/Demo/sockets/gopher.pyR8sR "  "  cCsd}y8tjdd}t|}t||||jWntk r\}dG|GHnX|rp|jnt}|sdSt|}yt||||jdGHWntk r}dG|GHnX|jdS(Ns ${PAGER-more}twsIOError:sDone.( tNonetostpopent SaveLinesR-twritelnRLR&t open_savefile(RRRtxtpR?R'((s+/usr/lib64/python2.7/Demo/sockets/gopher.pytbrowse_textfiles&       cCsxdGHdGt|GHdG|GdG|GHHytd}Wntk rNHPnXtj|}|shPnd|krdGHqnt|t|||qdS(Ns----- SEARCH -----s Selector:sHost:s Port:sQuery [CR == up a level]: s s"Sorry, queries cannot contain tabs(RCRHRIRtstripR8R"(RRRtquery((s+/usr/lib64/python2.7/Demo/sockets/gopher.pyt browse_searchs"  cCsp|rdGt|GHnt|tdkr?t|}ntjd|d|}|rldG|GHndS(Ns Log in asRsset -x; exec telnet t s Exit status:(RCRRZtsystem(RRRtsts((s+/usr/lib64/python2.7/Demo/sockets/gopher.pyt browse_telnetscCsFt}|sdSt|}t||||jd|jdS(Niii (R^tSaveWithProgressR4twriteR&(RRRR'R_((s+/usr/lib64/python2.7/Demo/sockets/gopher.pyt browse_binarys   cCst|||dS(N(Rk(RRR((s+/usr/lib64/python2.7/Demo/sockets/gopher.pyt browse_soundsR\cBs#eZdZdZdZRS(cCs ||_dS(N(R'(tselfR'((s+/usr/lib64/python2.7/Demo/sockets/gopher.pyt__init__scCs|jj|ddS(Ns (R'Rj(RmR)((s+/usr/lib64/python2.7/Demo/sockets/gopher.pyR]scCs%|jj}|r!dG|GHndS(Ns Exit status:(R'R&(RmRg((s+/usr/lib64/python2.7/Demo/sockets/gopher.pyR&s(t__name__t __module__RnR]R&(((s+/usr/lib64/python2.7/Demo/sockets/gopher.pyR\s  RicBs#eZdZdZdZRS(cCs ||_dS(N(R'(RmR'((s+/usr/lib64/python2.7/Demo/sockets/gopher.pyRnscCs1tjjdtjj|jj|dS(Nt#(R:tstdoutRjtflushR'(RmR1((s+/usr/lib64/python2.7/Demo/sockets/gopher.pyRjs cCs&H|jj}|r"dG|GHndS(Ns Exit status:(R'R&(RmRg((s+/usr/lib64/python2.7/Demo/sockets/gopher.pyR& s(RoRpRnRjR&(((s+/usr/lib64/python2.7/Demo/sockets/gopher.pyRis  cCs2ytd}Wntk r%HdSXtj|}|s?dS|ddkrtj|d}ytj|d}Wn'tk r}t|GdG|GHdSXdGt|GdGH|S|dd krtj j |}nyt |d}Wn'tk r}t|GdG|GHdSXd Gt|GdGH|S( Ns<Save as file [CR == don't save; |pipeline or ~user/... OK]: it|iRXRAsPiping throughs...t~s Saving to( RHRIRYRRbRZR[RLRCtpatht expandusertopen(tsavefiletcmdR`R?R'((s+/usr/lib64/python2.7/Demo/sockets/gopher.pyR^'s6  cCs tjdr"dGHtjdntjdrWttjdtjdtjdntjdry-tjtjd}d}tjd}Wn4tjk rtjd}tjd}d}nXt|||n+tjdrtdtjdntdS(Nis(usage: gopher [ [selector] host [port] ]iiiR(R:targvR;R@RRRJ(RRR((s+/usr/lib64/python2.7/Demo/sockets/gopher.pyttestEs$  (     ((()RR:RZRR5R6R t T_TEXTFILEtT_MENUtT_CSOtT_ERRORtT_BINHEXtT_DOSt T_UUENCODEtT_SEARCHtT_TELNETtT_BINARYt T_REDUNDANTtT_SOUNDRFRR"RRR,R.R-R2R4R@R8RaRdRhRkRlRKR\RiR^R|(((s+/usr/lib64/python2.7/Demo/sockets/gopher.pyts\           .