package Ġcom . r sk . http . proxy Ċ Ċ import Ġcom . r sk . http . client . Socket HttpClient Ċ import Ġcom . r sk . http . socket . Net Server Socket Ċ import Ġcom . r sk . io . Multip lex OutputStream Ċ import Ġcom . r sk . io . Multip lex Writer Ċ import Ġcom . r sk . logger Ċ import Ġcom . r sk . threading . Exception Handling ThreadPool Ċ import Ġjava . io . OutputStream Writer Ċ import Ġjava . net . Bind Exception Ċ import Ġjava . util . concurrent . ExecutorService Ċ Ċ /** Ċ The Ġmain Ġconsole Ġapplication Ġcode Ġthat Ġwill Ġrun Ġand Ġstart Ġthe Ġlistener Ċ Ġ*/ Ċ class ĠK Proxy () Ġ{ ĊĊĠĠĠ Ġvar Ġrunning Ġ= Ġtrue ĊĠĠĠ Ġval ĠLogger Ġby Ġlogger () ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġmain ( args : ĠArray < String >) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . setProperty (" java . net . prefer IPv 4 Stack ", Ġ" true ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproxy Ġ= ĠK Proxy () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġport : ĠInt Ġ= Ġ 9 0 9 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġargs . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( args [ i ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"- port " Ġ-> Ġport Ġ= ĠInteger . parseInt ( args [++ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġproxy . start ( port ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġexecutor : ĠExecutor Service Ġ= ĠException Handling ThreadPool ( 1 0 ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ author ĠKevin ĠJ ones ĊĠĠĠĠ Ġ* Ġ@ param Ġport ĠThe Ġhttp Ġport Ġto Ġlisten Ġon ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstart ( port : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġss : ĠNet Server Socket Ġ= ĠNet Server Socket ( port ) ĊĠĠĠĠĠĠĠ Ġval Ġrequest Header Writer Ġ= ĠMultip lex Writer ( OutputStream Writer ( System . out )) ĊĠĠĠĠĠĠĠ Ġval Ġrequest Type Writer Ġ= ĠMultip lex OutputStream ( System . out ) ĊĠĠĠĠĠĠĠ Ġval Ġresponse Header Writer Ġ= ĠMultip lex Writer ( OutputStream Writer ( System . out )) ĊĠĠĠĠĠĠĠ Ġval Ġresponse Type Writer Ġ= ĠMultip lex OutputStream ( System . out ) ĊĊĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . debug (" Starting Ġproxy ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . debug (" Create Ġa Ġnew Ġproxy Ġlistener ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserver Ġ= ĠHttp Main Proxy Listener ( executor , Ġss , ĠProxy Task Factory ( Listeners ( request Header Writer , Ġrequest Type Writer ), ĠList eners ( response Header Writer , Ġresponse Type Writer ), ĠSocket HttpClient ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . debug (" Start Ġthe Ġproxy Ġlistener ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . debug (" Proxy Ġstarted ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver . join () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch ( ex : ĠBind Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Trying Ġto Ġbind Ġon Ġport Ġ$ port Ġand Ġgot Ġan Ġexception : Ġ${ ex . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġss . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġss Ġ= ĠNet Server Socket ( port ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e 1 : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe 1 . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( running ) ĊĠĠĠ Ġ} Ċ }