/** Ċ Ġ* ĠCopyright Ġ 2 0 1 6 ĠJust Way ward ĠTeam Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . k ai . w if itr ans fer Ċ Ċ import Ġandroid . util . Log Ċ import Ġjava . io .* Ċ import Ġjava . net . Inet SocketAddress Ċ import Ġjava . net . Server Socket Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . nio . channels . File Channel Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ Ċ abstract Ġclass ĠN ano HTTP D ( private Ġval Ġhostname : ĠString ?, Ġprivate Ġval Ġmy Port : ĠInt ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġmy Server Socket : ĠServer Socket ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġmy Thread : ĠThread ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġtemp FileManager Factory : ĠTemp FileManager Factory ĊĠĠĠ Ġprivate Ġvar Ġasync Runner : ĠAsync Runner ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConstructs Ġan ĠHTTP Ġserver Ġon Ġgiven Ġport . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( port : ĠInt ) Ġ: Ġthis ( null , Ġport ) Ġ{} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStarts Ġthe Ġserver ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThrows Ġan ĠIOException Ġif Ġthe Ġsocket Ġis Ġalready Ġin Ġuse ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . i (" Nano HTTP D ", Ġ" server Ġstart ") ĊĠĠĠĠĠĠĠ Ġmy Server Socket Ġ= ĠServer Socket () ĊĠĠĠĠĠĠĠ Ġmy Server Socket !!. bind ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hostname Ġ!= Ġnull ) ĠInet SocketAddress ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhostname , Ġmy Port ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġelse ĠInet SocketAddress ( my Port ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġmy Thread Ġ= ĠThread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal Accept Ġ= Ġmy Server Socket !!. accept () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Nano HTTP D ", Ġ" accept Ġrequest Ġfrom Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġfinal Accept !!. inet Address ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= Ġfinal Accept . getInputStream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoutputStream Ġ= Ġfinal Accept ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get OutputStream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp FileManager Ġ= Ġtemp FileManager Factory ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsession Ġ= ĠHTTP Session ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp FileManager , ĠinputStream , ĠoutputStream ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Runner . exec Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession . run () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( final Accept Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Accept . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ(! my Server Socket !!. is Closed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmy Thread !!. is Daemon Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġmy Thread !!. name Ġ= Ġ" Nano Http d ĠMain ĠListener " ĊĠĠĠĠĠĠĠ Ġmy Thread !!. start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSto ps Ġthe Ġserver . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . i (" Nano HTTP D ", Ġ" server Ġstop ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Server Socket !!. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Thread !!. join () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( io e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġio e . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset TempFile ManagerFactory ( ĊĠĠĠĠĠĠĠ Ġtemp FileManager Factory : ĠTemp FileManager Factory ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . temp FileManager Factory Ġ= Ġtemp FileManager Factory ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Async Runner ( async Runner : ĠAsync Runner ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . async Runner Ġ= Ġasync Runner ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOverride Ġthis Ġto Ġcustomize Ġthe Ġserver . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ( By Ġdefault , Ġthis Ġdeleg ates Ġto Ġserve File () Ġand Ġallows Ġdirectory Ġlisting .) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġuri ĠĠĠ ĠPercent - decoded ĠURI Ġwithout Ġparameters , Ġfor Ġexample ĊĠĠĠĠ Ġ* Ġ"/ index . cgi " ĊĠĠĠĠ Ġ* Ġ@ param Ġmethod Ġ" GET ", Ġ" POST " Ġetc . ĊĠĠĠĠ Ġ* Ġ@ param Ġpar ms Ġ ĠParsed , Ġpercent Ġdecoded Ġparameters Ġfrom ĠURI Ġand , Ġin Ġcase Ġof ĊĠĠĠĠ Ġ* ĠPOST , Ġdata . ĊĠĠĠĠ Ġ* Ġ@ param Ġheader ĠHeader Ġentries , Ġpercent Ġdecoded ĊĠĠĠĠ Ġ* Ġ@ return ĠHTTP Ġresponse , Ġsee Ġclass ĠResponse Ġfor Ġdetails ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġserve ( ĊĠĠĠĠĠĠĠ Ġuri : ĠString ?, Ġmethod : ĠMethod ?, ĊĠĠĠĠĠĠĠ Ġheader : ĠMap < String , ĠString > ?, Ġpar ms : ĠMap < String , ĠString ?> ?, ĊĠĠĠĠĠĠĠ Ġfiles : ĠMap < String , ĠString >? ĊĠĠĠ Ġ): ĠResponse ? ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDe codes Ġthe Ġpercent Ġencoding Ġscheme . Ġ< br ></ br > ĊĠĠĠĠ Ġ* ĠFor Ġexample : Ġ" an + example % 2 0 string " Ġ-> Ġ" an Ġexample Ġstring " ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( InterruptedException :: class ) ĊĠĠĠ Ġprotected Ġfun Ġdecode Percent ( str : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġstr . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġstr [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( c ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ'+' Ġ-> Ġsb . append (' Ġ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ'%' Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstr . substring ( i Ġ+ Ġ 1 , Ġi Ġ+ Ġ 3 ). toInt ( 1 6 ). to Char () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsb . append ( c ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . toString () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInterruptedException () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġdecode Parameters ( ĊĠĠĠĠĠĠĠ Ġpar ms : ĠMap < String ?, ĠString ?> ĊĠĠĠ Ġ): ĠMap < String , ĠMutable List < String >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . decode Parameters ( parms [ QUERY _ STRING _ PARAMETER ]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġdecode Parameters ( queryString : ĠString ?): ĠMap < String , ĠMutable List < String >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpar ms : ĠMutable Map < String , ĠMutable List < String >> Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ Ġif Ġ( queryString Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġst Ġ= ĠString Tokenizer ( queryString , Ġ"& ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( st . hasMore Tokens ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġst . nextToken () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsep Ġ= Ġe . indexOf (' =') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpropertyName Ġ= Ġif Ġ( sep Ġ>= Ġ 0 ) Ġdecode Percent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . substring ( 0 , Ġsep ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} Ġelse Ġdecode Percent ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! parms . containsKey ( propertyName )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpar ms [ propertyName ] Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Value Ġ= Ġif Ġ( sep Ġ>= Ġ 0 ) Ġdecode Percent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. substring ( sep Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( property Value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpar ms [ propertyName ] !!. add ( property Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e 1 : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe 1 . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġpar ms ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠMethod Ġ{ ĊĠĠĠĠĠĠĠ ĠGET , ĠPUT , ĠPOST , ĠDELETE ; ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġlookup ( method : ĠString ?): ĠMethod ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( m Ġin Ġvalues ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m . toString (). equals ( method , Ġignore Case Ġ= Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġm ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠAsync Runner Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġexec ( code : ĠRunnable ?) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠTemp FileManager Factory Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate (): ĠTemp FileManager ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠTemp FileManager Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠĠĠĠĠ Ġfun Ġcreate TempFile (): ĠTemp File ĊĠĠĠĠĠĠĠ Ġfun Ġclear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠTemp File Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠĠĠĠĠ Ġfun Ġopen (): ĠOutputStream ĊĊĠĠĠĠĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠĠĠĠĠ Ġfun Ġdelete () ĊĠĠĠĠĠĠĠ Ġval Ġname : ĠString ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHTTP Ġresponse . ĠReturn Ġone Ġof Ġthese Ġfrom Ġserve (). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġbook Id : ĠString ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠHTTP Ġstatus Ġcode Ġafter Ġprocessing , Ġe . g . Ġ" 2 0 0 ĠOK ", ĠHTTP _ OK ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġstatus : ĠStatus ? ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠMIME Ġtype Ġof Ġcontent , Ġe . g . Ġ" text / html " ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar ĠmimeType : ĠString ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠData Ġof Ġthe Ġresponse , Ġmay Ġbe Ġnull . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġdata : ĠInputStream ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠHeaders Ġfor Ġthe ĠHTTP Ġresponse . ĠUse Ġadd Header () Ġto Ġadd Ġlines . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġheader : ĠMutable Map < String , ĠString ?> ? Ġ= ĠHashMap () ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠDefault Ġconstructor : Ġresponse Ġ= ĠHTTP _ OK , Ġmime Ġ= ĠMIME _ HTML Ġand Ġyour ĊĠĠĠĠĠĠĠĠ Ġ* Ġsupplied Ġmessage ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconstructor ( msg : ĠString ) Ġ: Ġthis ( Status . OK , ĠMIME _ HTML , Ġmsg ) Ġ{} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġstart ĠChapter s Ġindex ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġstart Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠBasic Ġconstructor . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconstructor ( status : ĠStatus ?, ĠmimeType : ĠString , Ġdata : ĠInputStream ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . status Ġ= Ġstatus ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . mime Type Ġ= ĠmimeType ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . data Ġ= Ġdata ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠConvenience Ġmethod Ġthat Ġmakes Ġan ĠInputStream Ġout Ġof Ġgiven Ġtext . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconstructor ( status : ĠStatus ?, ĠmimeType : ĠString , Ġtxt : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . status Ġ= Ġstatus ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . mime Type Ġ= ĠmimeType ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= ĠByteArrayInputStream ( txt . toByteArray ( charset (" UTF - 8 "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ue e : ĠUnsupported EncodingException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġue e . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġconstructor ( status : ĠStatus ?, ĠmimeType : ĠString , Ġbook Id : ĠString ?, Ġstart : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . status Ġ= Ġstatus ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . mime Type Ġ= ĠmimeType ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . book Id Ġ= Ġbook Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . start Ġ= Ġstart ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAdds Ġgiven Ġline Ġto Ġthe Ġheader . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġadd Header ( name : ĠString , Ġvalue : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader ! ![ name ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSends Ġgiven Ġresponse Ġto Ġthe Ġsocket . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġsend ( output Stream : ĠOutputStream ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmime Ġ= ĠmimeType ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg mt Fr mt Ġ= ĠSimpleDateFormat ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" E , Ġd ĠM MM Ġy yyy ĠHH : mm : ss Ġ' GMT '", ĠLocale . US ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg mt Fr mt . time Zone Ġ= ĠTime Zone . getTime Zone (" GMT ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠError (" send Response (): ĠStatus Ġcan 't Ġbe Ġnull .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpw Ġ= ĠPrintWriter ( output Stream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpw . print ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" HTTP / 1 . 0 Ġ${ status !!. description } Ġ Ċ """ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mime Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpw . print (" Content - Type : Ġ$ mime \ r \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( header Ġ== Ġnull Ġ|| Ġheader !! [" Date "] Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpw . print ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠ ĠDate : Ġ${ gmt Fr mt . format ( Date ()) } ĊĠĠĠĠĊĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( header Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin Ġheader !!. keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġheader ! ![ key ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpw . print ("$ key : Ġ$ value \ r \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpw . print ("\ r \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpw . flush () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend InputData ( output Stream , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ ä¸Ĭä¼ł æĸĩä»¶ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw it Book ( pw , ĠoutputStream ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream . flush () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Ġ!= Ġnull ) Ġdata !!. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( io e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCould n 't Ġwrite ? ĠNo Ġcan Ġdo . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġio e . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġsend InputData ( output Stream : ĠOutputStream , Ġdata : ĠInputStream ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpending Ġ= Ġdata . available () Ġ// ĠThis Ġis Ġto Ġsupport ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpartial Ġsends , Ġsee ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġserve File () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠBUFFER _ SIZE Ġ= Ġ 1 6 Ġ* Ġ 1 0 2 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuff Ġ= ĠByteArray ( BUFFER _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( pending Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġread Ġ= Ġdata . read ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuff , Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pending Ġ> ĠBUFFER _ SIZE ) ĠBUFFER _ SIZE Ġelse Ġpending ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( read Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream . write ( buff , Ġ 0 , Ġread ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpending Ġ-= Ġread ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠSome ĠHTTP Ġresponse Ġstatus Ġcodes ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġenum Ġclass ĠStatus ( val Ġrequest Status : ĠInt , Ġprivate Ġval Ġdescr : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOK ( 2 0 0 , Ġ" OK "), ĠCRE ATED ( 2 0 1 , Ġ" Created "), ĠNO _ CONTENT ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 0 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" No ĠContent " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPAR TIAL _ CONTENT ( 2 0 6 , Ġ" Partial ĠContent "), ĠRED I RECT ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 0 1 , Ġ" Moved ĠPer manently " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNOT _ MODI FIED ( 3 0 4 , Ġ" Not ĠModified "), ĠBAD _ REQUEST ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 0 , Ġ" Bad ĠRequest " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠU NA UTH ORIZ ED ( 4 0 1 , Ġ" Unauthorized "), ĠFOR BID DEN ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 4 0 3 , Ġ" Forbidden " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNOT _ FOUND ( 4 0 4 , Ġ" Not ĠFound "), ĠR ANGE _ NOT _ SAT IS FI ABLE ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 4 1 6 , Ġ" Requested ĠRange ĠNot ĠS atisf iable " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠINTERNAL _ ERROR ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 5 0 0 , Ġ" Internal ĠServer ĠError " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ); ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescription : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"$ request Status Ġ$ descr " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġerror ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream : ĠOutputStream , Ġerror : ĠStatus ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse ( error , ĠMIME _ PL AINT EXT , Ġmessage ). send ( output Stream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠDefault TempFile ( temp dir : ĠString ?) Ġ: ĠTemp File Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfile : ĠFile ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġf stream : ĠOutputStream ĊĠĠĠĠĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġopen (): ĠOutputStream Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġf stream ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdelete () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġname : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġfile . absolute Path ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Ġ= ĠFile . create TempFile (" Nano HTTP D -", Ġ"", ĠFile ( temp dir )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf stream Ġ= ĠFileOutputStream ( file ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandles Ġone Ġsession , Ġi . e . Ġparses Ġthe ĠHTTP Ġrequest Ġand Ġreturns Ġthe ĊĠĠĠĠ Ġ* Ġresponse . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġinner Ġclass ĠHTTP Session ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtemp FileManager : ĠTemp FileManager , ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠinputStream : ĠInputStream ?, Ġprivate Ġval ĠoutputStream : ĠOutputStream ĊĠĠĠ Ġ) Ġ: ĠRunnable Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inputStream Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRead Ġthe Ġfirst Ġ 8 1 9 2 Ġbytes . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġfull Ġheader Ġshould Ġfit Ġin Ġhere . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠApache 's Ġdefault Ġheader Ġlimit Ġis Ġ 8 KB . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo ĠNOT Ġassume Ġthat Ġa Ġsingle Ġread Ġwill Ġget Ġthe Ġentire Ġheader ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġat Ġonce ! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbuf Ġ= ĠByteArray ( Companion . BUF SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsplit byte Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġr len Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġread Ġ= ĠinputStream !!. read ( buf , Ġ 0 , ĠComp anion . BUF SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( read Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr len Ġ+= Ġread ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsplit byte Ġ= Ġfind Header End ( buf , Ġr len ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( split byte Ġ> Ġ 0 ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Ġ= ĠinputStream . read ( buf , Ġr len , ĠComp anion . BUF SIZE Ġ- Ġr len ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa ĠBufferedReader Ġfor Ġparsing Ġthe Ġheader . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhin Ġ= ĠBufferedReader ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInputStreamReader ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠByteArrayInputStream ( buf , Ġ 0 , Ġr len ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpre : ĠMutable Map < String , ĠString > Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpar ms : ĠMutable Map < String , ĠString ?> Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheader : ĠMutable Map < String , ĠString > Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiles : ĠMutable Map < String , ĠString > Ġ= ĠHashMap () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDecode Ġthe Ġheader Ġinto Ġpar ms Ġand Ġheader Ġjava Ġproperties ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecode Header ( hin , Ġpre , Ġpar ms , Ġheader ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= ĠMethod . lookup ( pre [" method "]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( method Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream , ĠResponse . Status . BAD _ REQUEST , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" BAD ĠREQUEST : ĠSyntax Ġerror ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInterruptedException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġpre [" uri "] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsize Ġ= Ġextract Content Length ( header ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWrite Ġthe Ġpart Ġof Ġbody Ġalready Ġread Ġto ĠByteArrayOutputStream ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġf ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf Ġ= Ġtmp Bucket ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( split byte Ġ< Ġr len ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf !!. write ( buf , Ġsplit byte , Ġr len Ġ- Ġsplit byte ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhile ĠFirefox Ġsends Ġon Ġthe Ġfirst Ġread Ġall Ġthe Ġdata Ġfitting ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġour Ġbuffer , ĠChrome Ġand ĠOpera Ġsend Ġonly Ġthe Ġheaders Ġeven Ġif ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthere Ġis Ġdata Ġfor Ġthe Ġbody . ĠWe Ġdo Ġsome Ġmagic Ġhere Ġto Ġfind ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġout Ġwhether Ġwe Ġhave Ġalready Ġconsumed Ġpart Ġof Ġbody , Ġif Ġwe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhave Ġreached Ġthe Ġend Ġof Ġthe Ġdata Ġto Ġbe Ġsent Ġor Ġwe Ġshould ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġexpect Ġthe Ġfirst Ġbyte Ġof Ġthe Ġbody Ġat Ġthe Ġnext Ġread . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( split byte Ġ< Ġr len ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ-= Ġ( r len Ġ- Ġsplit byte Ġ+ Ġ 1 ). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( split byte Ġ== Ġ 0 Ġ|| Ġsize Ġ== Ġ 0 x 7 FFFFFFFF FFFFFF FL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNow Ġread Ġall Ġthe Ġbody Ġand Ġwrite Ġit Ġto Ġf ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf Ġ= ĠByteArray ( 5 1 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( r len Ġ>= Ġ 0 Ġ&& Ġsize Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr len Ġ= ĠinputStream . read ( buf , Ġ 0 , Ġ 5 1 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ-= Ġr len . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( r len Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf !!. write ( buf , Ġ 0 , Ġr len ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġraw Ġbody Ġas Ġa Ġbyte Ġ[] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf buf : ĠByteBuffer Ġ= Ġf !!. channel . map ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile Channel . Map Mode . READ _ ONLY , Ġ 0 , Ġf . length () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf . seek ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa ĠBufferedReader Ġfor Ġeasily Ġreading Ġit Ġas Ġstring . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbin : ĠInputStream Ġ= ĠFileInputStream ( f . fd ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ` in ` Ġ= ĠBufferedReader ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInputStreamReader ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġmethod Ġis ĠPOST , Ġthere Ġmay Ġbe Ġparameters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġin Ġdata Ġsection , Ġtoo , Ġread Ġit : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Method . POST Ġ== Ġmethod ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠcontentType Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcontentType Header Ġ= Ġheader [" content - type "] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġst : ĠString Tokenizer ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( contentType Header Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġst Ġ= ĠString Tokenizer ( contentType Header , Ġ", ; Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( st . hasMore Tokens ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcontentType Ġ= Ġst . nextToken () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(" multipart / form - data ". equals ( contentType , Ġignore Case Ġ= Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHandle Ġmultipart / form - data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! st !!. hasMore Tokens ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . Status . BAD _ REQUEST , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" BAD ĠREQUEST : ĠContent Ġtype Ġis Ġmultipart / form - data Ġbut Ġboundary Ġmissing . ĠUsage : ĠGET Ġ/ example / file . html " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInterruptedException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġboundary Start String Ġ= Ġ" boundary =" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġboundary Content Start Ġ= Ġ( contentType Header ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ!! . indexOf ( boundary Start String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġboundary Start String . length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġboundary Ġ= ĠcontentType Header !!. substring ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboundary Content Start , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcontentType Header . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( boundary . startsWith ("\" ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġboundary . startsWith ("\" ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboundary Ġ= Ġboundary . substring ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboundary . length Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecode Multipart Data ( boundary , Ġf buf , Ġ` in `, Ġpar ms , Ġfiles ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHandle Ġapplication / x - www - form - urlencoded ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpost Line Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp buf Ġ= ĠChar Array ( 5 1 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġread Ġ= Ġ` in `. read ( p buf ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( read Ġ>= Ġ 0 Ġ&& Ġ! post Line . endsWith ("\ r \ n ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Line Ġ+= ĠString ( p buf , Ġ 0 , Ġread ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Ġ= Ġ` in `. read ( p buf ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Line Ġ= Ġpost Line . trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecode Parms ( post Line , Ġpar ms ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Method . PUT Ġ== Ġmethod ) Ġfiles [" content "] Ġ= Ġsave Tmp File ( f buf , Ġ 0 , Ġf buf . limit ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOk , Ġnow Ġdo Ġthe Ġserve () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġserve ( uri , Ġmethod , Ġheader , Ġpar ms , Ġfiles ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( r Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . Status . INTERNAL _ ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" SERVER ĠINTERNAL ĠERROR : ĠSer ve () Ġreturned Ġa Ġnull Ġresponse ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInterruptedException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr . send ( output Stream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` in `. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠinputStream . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( io e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . Status . INTERNAL _ ERROR , Ġ" SERVER ĠINTERNAL ĠERROR : ĠIOException : Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġio e . message ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInterruptedException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ie : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThrow n Ġby Ġsend Error , Ġignore Ġand Ġexit Ġthe Ġthread . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġie . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp FileManager . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġextract Content Length ( header : ĠMap < String , ĠString >): ĠLong Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsize Ġ= Ġ 0 x 7 FFFFFFFF FFFFFF FL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Length Ġ= Ġheader [" content - length "] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( content Length Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġcontent Length . toInt (). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsize ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠDe codes Ġthe Ġsent Ġheaders Ġand Ġloads Ġthe Ġdata Ġinto ĠKey / value Ġpairs ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Throws ( InterruptedException :: class ) ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġdecode Header ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` in `: ĠBufferedReader , Ġpre : ĠMutable Map < String , ĠString >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpar ms : ĠMutable Map < String , ĠString ? >, Ġheader : ĠMutable Map < String , ĠString > ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRead Ġthe Ġrequest Ġline ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġin Line Ġ= Ġ` in `. readLine () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġst Ġ= ĠString Tokenizer ( in Line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! st . hasMore Tokens ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream , ĠResponse . Status . BAD _ REQUEST , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" BAD ĠREQUEST : ĠSyntax Ġerror . ĠUsage : ĠGET Ġ/ example / file . html " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInterruptedException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre [" method "] Ġ= Ġst . nextToken () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! st . hasMore Tokens ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream , ĠResponse . Status . BAD _ REQUEST , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" BAD ĠREQUEST : ĠMissing ĠURI . ĠUsage : ĠGET Ġ/ example / file . html " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInterruptedException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġuri Ġ= Ġst . nextToken () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDecode Ġparameters Ġfrom Ġthe ĠURI ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġq mi Ġ= Ġuri . indexOf (' ?') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= Ġif Ġ( q mi Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecode Parms ( uri . substring ( q mi Ġ+ Ġ 1 ), Ġpar ms ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecode Percent ( uri . substring ( 0 , Ġq mi )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecode Percent ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere 's Ġanother Ġtoken , Ġit 's Ġprotocol Ġversion , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfollowed Ġby ĠHTTP Ġheaders . ĠIgnore Ġversion Ġbut Ġparse Ġheaders . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNOTE : Ġthis Ġnow Ġforces Ġheader Ġnames Ġlowercase Ġsince Ġthey Ġare ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcase Ġins ensitive Ġand Ġvary Ġby Ġclient . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( st . hasMore Tokens ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġline Ġ= Ġ` in `. readLine () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( line Ġ!= Ġnull Ġ&& Ġline . trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ}. length Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġline . indexOf (': ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p Ġ>= Ġ 0 ) Ġheader [ line . substring ( 0 , Ġp ). trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toLowerCase ()] Ġ= Ġline . substring ( p Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Ġ= Ġ` in `. readLine () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre [" uri "] Ġ= Ġuri ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( io e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . Status . INTERNAL _ ERROR , Ġ" SERVER ĠINTERNAL ĠERROR : ĠIOException : Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġio e . message ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInterruptedException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠDe codes Ġthe ĠMultip art ĠBody Ġdata Ġand Ġput Ġit Ġinto ĠKey / Value Ġpairs . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Throws ( InterruptedException :: class ) ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġdecode Multipart Data ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboundary : ĠString , Ġf buf : ĠByteBuffer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ` in `: ĠBufferedReader , Ġpar ms : ĠMutable Map < String , ĠString ? >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiles : ĠMutable Map < String , ĠString > ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb positions Ġ= Ġget Boundary Positions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf buf , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboundary . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġboundary count Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmp line Ġ= Ġ` in `. readLine () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( mp line Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! mp line . contains ( boundary )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . Status . BAD _ REQUEST , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" BAD ĠREQUEST : ĠContent Ġtype Ġis Ġmultipart / form - data Ġbut Ġnext Ġchunk Ġdoes Ġnot Ġstart Ġwith Ġboundary . ĠUsage : ĠGET Ġ/ example / file . html " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInterruptedException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġboundary count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem : ĠMutable Map < String , ĠString ?> Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmp line Ġ= Ġ` in `. readLine () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( mp line Ġ!= Ġnull Ġ&& Ġmp line . trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ}. length Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġmp line . indexOf (': ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem [ mp line . substring ( 0 , Ġp ). trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toLowerCase ()] Ġ= Ġmp line . substring ( p Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmp line Ġ= Ġ` in `. readLine () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mp line Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Disposition Ġ= Ġitem [" content - dis position "] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( content Disposition Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . Status . BAD _ REQUEST , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" BAD ĠREQUEST : ĠContent Ġtype Ġis Ġmultipart / form - data Ġbut Ġno Ġcontent - dis position Ġinfo Ġfound . ĠUsage : ĠGET Ġ/ example / file . html " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInterruptedException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġst Ġ= ĠString Tokenizer ( content Disposition , Ġ"; Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdis position : ĠMutable Map < String , ĠString > Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( st . hasMore Tokens ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġst . nextToken () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġtoken . indexOf (' =') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdis position [ token . substring ( 0 , Ġp ). trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toLowerCase ()] Ġ= Ġtoken . substring ( p Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpname Ġ= Ġdis position [" name "] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpname Ġ= Ġpname !!. substring ( 1 , Ġpname . length Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvalue : ĠString ? Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item [" content - type "] Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( mp line Ġ!= Ġnull Ġ&& Ġ! mp line . contains ( boundary )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmp line Ġ= Ġ` in `. readLine () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mp line Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Ġ= Ġmp line . indexOf ( boundary ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ+= Ġif Ġ( d Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmp line ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmp line . substring ( 0 , Ġd Ġ- Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( boundary count Ġ> Ġb positions . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . Status . INTERNAL _ ERROR , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Error Ġprocessing Ġrequest " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInterruptedException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġstrip Multipart Headers ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf buf , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb positions [ boundary count Ġ- Ġ 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġsave Tmp File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf buf , Ġoffset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb positions [ boundary count Ġ- Ġ 1 ] Ġ- Ġoffset Ġ- Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles [ pname ] Ġ= Ġpath ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġdis position [" filename "] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġvalue !!. substring ( 1 , Ġvalue . length Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmp line Ġ= Ġ` in `. readLine () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( mp line Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ! mp line . contains ( boundary ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpar ms [ pname ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( io e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . Status . INTERNAL _ ERROR , Ġ" SERVER ĠINTERNAL ĠERROR : ĠIOException : Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġio e . message ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInterruptedException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠFind Ġbyte Ġindex Ġsepar ating Ġheader Ġfrom Ġbody . ĠIt Ġmust Ġbe Ġthe Ġlast Ġbyte ĊĠĠĠĠĠĠĠĠ Ġ* Ġof Ġthe Ġfirst Ġtwo Ġsequential Ġnew Ġlines . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfind Header End ( buf : ĠByteArray , Ġr len : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsplit byte Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( split byte Ġ+ Ġ 3 Ġ< Ġr len ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( buf [ split byte ]. to Char () Ġ== Ġ'\ r ' Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf [ split byte Ġ+ Ġ 1 ]. to Char () Ġ== Ġ'\ n ' Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf [ split byte Ġ+ Ġ 2 ]. to Char () Ġ== Ġ'\ r ' Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf [ split byte Ġ+ Ġ 3 ]. to Char () Ġ== Ġ'\ n ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsplit byte Ġ+ Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsplit byte ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠFind Ġthe Ġbyte Ġpositions Ġwhere Ġmultipart Ġboundaries Ġstart . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget Boundary Positions ( b : ĠByteBuffer , Ġboundary : ĠByteArray ): ĠInt Array Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmatch count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmatch byte Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatch bytes : ĠMutable List < Int > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġb . limit ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( b [ i ] Ġ== Ġboundary [ match count ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( match count Ġ== Ġ 0 ) Ġmatch byte Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( match count Ġ== Ġboundary . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch bytes . add ( match byte ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch byte Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ-= Ġmatch count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch byte Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Ġ= ĠInt Array ( match bytes . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġret . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret [ i ] Ġ= Ġmatch bytes [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠRetrieves Ġthe Ġcontent Ġof Ġa Ġsent Ġfile Ġand Ġsaves Ġit Ġto Ġa Ġtemporary ĊĠĠĠĠĠĠĠĠ Ġ* Ġfile . ĠThe Ġfull Ġpath Ġto Ġthe Ġsaved Ġfile Ġis Ġreturned . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġsave Tmp File ( b : ĠByteBuffer , Ġoffset : ĠInt , Ġlen : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpath Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( len Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp File Ġ= Ġtemp FileManager . create TempFile () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= Ġb . duplicate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdest Ġ= ĠFileOutputStream ( temp File . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. channel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc . position ( offset ). limit ( offset Ġ+ Ġlen ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdest . write ( src . slice ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ= Ġtemp File . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ Ġ// ĠCatch Ġexception Ġif Ġany ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" Error : Ġ" Ġ+ Ġe . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpath ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ get : Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtmp Bucket : ĠRandom Access File ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp File Ġ= Ġtemp FileManager . create TempFile () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRandom Access File ( temp File . name , Ġ" rw ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" Error : Ġ" Ġ+ Ġe . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠIt Ġreturns Ġthe Ġoffset Ġsepar ating Ġmultipart Ġfile Ġheaders Ġfrom Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* Ġfile 's Ġdata . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġstrip Multipart Headers ( b : ĠByteBuffer , Ġoffset : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ= Ġoffset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġb . limit ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( b [ i ] Ġ== Ġ'\ r '. to Byte () Ġ&& Ġb [++ i ] Ġ== Ġ'\ n '. to Byte () Ġ&& Ġb [++ i ] Ġ== Ġ'\ r '. to Byte () Ġ&& Ġb [++ i ] Ġ== Ġ'\ n '. to Byte ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġi Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠDe codes Ġparameters Ġin Ġpercent - encoded ĠURI - format Ġ( Ġe . g . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ" name = Jack % 2 0 Dan iel s & pass = Single % 2 0 M alt " Ġ) Ġand Ġadds Ġthem Ġto Ġgiven ĊĠĠĠĠĠĠĠĠ Ġ* ĠMap . ĠNOTE : Ġthis Ġdoesn 't Ġsupport Ġmultiple Ġidentical Ġkeys Ġdue Ġto Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* Ġsimplicity Ġof ĠMap . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Throws ( InterruptedException :: class ) ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġdecode Parms ( parms : ĠString ?, Ġp : ĠMutable Map < String , ĠString ?> ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parms Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp [ QUERY _ STRING _ PARAMETER ] Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp [ QUERY _ STRING _ PARAMETER ] Ġ= Ġpar ms ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġst Ġ= ĠString Tokenizer ( parms , Ġ"& ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( st . hasMore Tokens ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe Ġ= Ġst . nextToken () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsep Ġ= Ġe . indexOf (' =') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sep Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp [ decode Percent ( e . substring ( 0 , Ġsep )). trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ}] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecode Percent ( e . substring ( sep Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp [ decode Percent ( e ). trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ}] Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponse . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream , ĠResponse . Status . BAD _ REQUEST , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" BAD ĠREQUEST : ĠBad Ġpercent - encoding ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠDefault TempFile ManagerFactory Ġ: ĠTemp FileManager Factory Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate (): ĠTemp FileManager Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDefault TempFile Manager () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠDefault TempFile Manager Ġ: ĠTemp FileManager Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtmp dir : ĠString ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtemp Files : ĠMutable List < TempFile > ĊĠĠĠĠĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate TempFile (): ĠTemp File Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp File Ġ= ĠDefault TempFile ( tmpdir ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Files . add ( temp File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtemp File ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( file Ġin Ġtemp Files ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Files . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp dir Ġ= ĠSystem . getProperty (" java . io . tmpdir ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Files Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠDefault Async Runner Ġ: ĠAsync Runner Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġrequest Count : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġexec ( code : ĠRunnable ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ++ request Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= ĠThread ( code ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt . is Daemon Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt . name Ġ= Ġ" Nano Http d ĠRequest ĠProcessor Ġ(# $ request Count )" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt . start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠP seudo - Parameter Ġto Ġuse Ġto Ġstore Ġthe Ġactual Ġquery Ġstring Ġin Ġthe ĊĠĠĠĠ Ġ* Ġparameters Ġmap Ġfor Ġlater Ġre - processing . ĊĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠQUERY _ STRING _ PARAMETER Ġ= Ġ" Nano Http d . QUERY _ STRING " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCommon Ġmime Ġtypes Ġfor Ġdynamic Ġcontent ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMIME _ PL AINT EXT Ġ= Ġ" text / plain " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMIME _ HTML Ġ= Ġ" text / html " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMIME _ DEFAULT _ BINARY Ġ= Ġ" application / octet - stream " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBU F SIZE Ġ= Ġ 8 1 9 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġtemp FileManager Factory Ġ= ĠDefault TempFile ManagerFactory () ĊĠĠĠĠĠĠĠ Ġasync Runner Ġ= ĠDefault Async Runner () ĊĠĠĠ Ġ} Ċ }