package Ġcom . ton y ode v . fetch 2 Ċ Ċ import Ġcom . ton y ode v . fetch 2 core .* Ċ import Ġjava . io . InputStream Ċ import Ġjava . net . Cookie Handler Ċ import Ġjava . net . Http URLConnection Ċ import Ġjava . net . URL Ċ import Ġjava . util . Collections Ċ import Ġkotlin . collections . HashMap Ċ Ċ import Ġandroid . util . Log Ċ Ċ /** Ċ Ġ* ĠThe Ġdefault ĠDown loader Ġused Ġby ĠFetch Ġfor Ġdownloading Ġrequests . Ċ Ġ* ĠThis Ġdown loader Ġuses Ġa ĠHttp Url Connection Ġto Ġperform Ġhttp Ġrequests Ċ Ġ* Ġ@ see Ġ{@ link Ġcom . ton y ode v . fetch 2 core . Downloader } Ċ Ġ* Ġ*/ Ċ open Ġclass ĠHttp Url Connection Downloader Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠHttp Url Connection Preferences Ġto Ġset Ġpreference Ġsettings Ġfor Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* ĠHttp Url Connection Downloader ĠHttp Url Connection Ġclient . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ see Ġcom . ton y ode v . fetch 2 . Http Url Connection Downloader . Http Url Connection Preferences ĊĠĠĠĠĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠĠĠĠĠ Ġhttp Url Connection Preferences : ĠHttp Url Connection Preferences ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġ/** ĠThe Ġfile Ġdown loader Ġtype Ġused Ġto Ġdownload Ġa Ġrequest . ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe ĠSEQ U ENTIAL Ġtype Ġdownloads Ġbytes Ġin Ġsequence . ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe ĠPAR ALLEL Ġtype Ġdownloads Ġbytes Ġin Ġparallel . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfile Downloader Type : ĠDown loader . File Downloader Type Ġ= ĠDown loader . File Downloader Type . SEQUENTIAL ) Ġ: ĠDown loader < Http URLConnection , ĠVoid > Ġ{ ĊĊĠĠĠ Ġconstructor ( file Downloader Type : ĠDown loader . File Downloader Type ) Ġ: Ġthis ( null , Ġfile Downloader Type ) ĊĊĠĠĠ Ġprotected Ġval Ġconnection Prefs Ġ= Ġhttp Url Connection Preferences Ġ?: ĠHttp Url Connection Preferences () ĊĠĠĠ Ġprotected Ġval Ġconnections : ĠMutable Map < Downloader . Response , ĠHttp URLConnection > Ġ= ĠCollections . synchronized Map ( HashMap < Downloader . Response , ĠHttp URLConnection >()) ĊĠĠĠ Ġprotected Ġval Ġcookie Manager Ġ= ĠgetDefault Cookie Manager () ĊĊĠĠĠ Ġoverride Ġfun Ġon Pre Client Execute ( client : ĠHttp URLConnection , Ġrequest : ĠDown loader . Server Request ): ĠVoid ? Ġ{ ĊĠĠĠĠĠĠĠ Ġclient . request Method Ġ= Ġrequest . request Method ĊĠĠĠĠĠĠĠ Ġclient . read Timeout Ġ= Ġconnection Prefs . read Timeout ĊĠĠĠĠĠĠĠ Ġclient . connect Timeout Ġ= Ġconnection Prefs . connect Timeout ĊĠĠĠĠĠĠĠ Ġclient . use Caches Ġ= Ġconnection Prefs . uses Cache ĊĠĠĠĠĠĠĠ Ġclient . default Use Caches Ġ= Ġconnection Prefs . uses Default Cache ĊĠĠĠĠĠĠĠ Ġclient . instance Follow Redirect s Ġ= Ġconnection Prefs . follow s Redirect ĊĠĠĠĠĠĠĠ Ġclient . do Input Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġrequest . headers . entries . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . add Request Property ( it . key , Ġit . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ_ connect With Redirect s Handled ( request : ĠDown loader . Server Request ) Ġ: ĠHttp URLConnection Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġclient Ġ: ĠHttp URLConnection ĊĠĠĠĠĠĠĠ Ġvar Ġredirected Ġ: ĠBoolean ĊĠĠĠĠĠĠĠ Ġvar Ġurl Ġ: ĠString Ġ= Ġrequest . url ĊĠĠĠĠĠĠĠ Ġvar Ġredirected Times Ġ: ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval ĠMax Redirect Times Ġ= Ġ 2 0 ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġredirected Times ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhttp Url Ġ= ĠURL ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient Ġ= Ġhttp Url . open Connection () Ġas ĠHttp URLConnection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Pre Client Execute ( client , Ġrequest ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . connect () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġclient . response Code ĊĠĠĠĠĠĠĠĠĠĠĠ Ġredirected Ġ= Ġ( code Ġ== ĠHttp URLConnection . HTTP _ MOVED _ PERM Ġ|| Ġcode Ġ== ĠHttp URLConnection . HTTP _ MOVED _ TEMP Ġ|| Ġcode Ġ== ĠHttp URLConnection . HTTP _ SE E _ OTHER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( redirect ed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( redirect ed Times Ġ>= ĠMax Redirect Times Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġclient . getHeader Field (" Location ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . disconnect () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( redirect ed ); ĊĠĠĠĠĠĠĠ Ġreturn Ġclient ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġexecute ( request : ĠDown loader . Server Request , Ġinterrupt Monitor : ĠInterrupt Monitor ): ĠDown loader . Response ? Ġ{ ĊĠĠĠĠĠĠĠ ĠCookie Handler . setDefault ( cookie Manager ) ĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠ Ġval Ġhttp Url Ġ= ĠURL ( request . url ) ĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= Ġhttp Url . open Connection () Ġas ĠHttp URLConnection ĊĠĠĠĠĠĠĠ Ġon Pre Client Execute ( client , Ġrequest ) ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġ( client . getRequest Property (" Refer er ") Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġval Ġrefer er Ġ= Ġget Refer er From Url ( request . url ) ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġclient . add Request Property (" Refer er ", Ġrefer er ) ĊĠĠĠĠĠĠĠ Ġ// Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġ. set Instance Follow Redirect s ( Ġboolean Ġ) ĊĠĠĠĠĠĠĠ Ġclient . connect () ĊĠĠĠĠĠĠĠ Ġ*/ ĊĊĠĠĠĠĠĠĠ Ġval Ġclient Ġ= Ġ_ connect With Redirect s Handled ( request ) ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġclient . response Code ĊĠĠĠĠĠĠĠ Ġvar Ġsuccess Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġcontent Length Ġ= Ġ- 1 L ĊĠĠĠĠĠĠĠ Ġvar Ġbyte Stream : ĠInputStream ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġresponse Headers Ġ= Ġclient . header Fields ĊĠĠĠĠĠĠĠ Ġvar Ġerror Response String : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġhash Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġif Ġ( is Response Ok ( code )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Length Ġ= Ġclient . getHeader Field (" Content - Length ") ?. to Long () Ġ?: Ġ- 1 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Stream Ġ= Ġclient . inputStream ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Ġ= ĠgetContent Hash ( response Headers ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror Response String Ġ= Ġcopy Stream ToString ( client . error Stream , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġaccepts Ranges Ġ= Ġcode Ġ== ĠHttp URLConnection . HTTP _ PAR TIAL Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Headers [" Accept - Ranges "] ?. first OrNull () Ġ== Ġ" bytes " ĊĊĠĠĠĠĠĠĠ Ġon Server Response ( request , ĠDown loader . Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode Ġ= Ġcode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Successful Ġ= Ġsuccess , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Length Ġ= Ġcontent Length , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Stream Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Ġ= Ġrequest , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhash Ġ= Ġhash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Headers Ġ= Ġresponse Headers , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccepts Ranges Ġ= Ġaccepts Ranges , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Response Ġ= Ġerror Response String )) ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠDown loader . Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode Ġ= Ġcode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Successful Ġ= Ġsuccess , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Length Ġ= Ġcontent Length , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbyte Stream Ġ= Ġbyte Stream , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Ġ= Ġrequest , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhash Ġ= Ġhash , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Headers Ġ= Ġresponse Headers , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccepts Ranges Ġ= Ġaccepts Ranges , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Response Ġ= Ġerror Response String ) ĊĊĠĠĠĠĠĠĠ Ġconnections [ response ] Ġ= Ġclient ĊĠĠĠĠĠĠĠ Ġreturn Ġresponse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġis Response Ok ( response Code : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġresponse Code Ġin Ġ 2 0 0 .. 2 9 9 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdisconnect ( response : ĠDown loader . Response ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( connections . contains ( response )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Ġ= Ġconnections [ response ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnections . remove ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect Client ( client ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetContent Hash ( response Headers : ĠMutable Map < String , ĠList < String >> ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġresponse Headers [" Content - MD 5 "] ?. first OrNull () Ġ?: Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġconnections . entries . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisconnect Client ( it . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġconnections . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisconnect Client ( client : ĠHttp URLConnection ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient ?. disconnect () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetFile S licing Count ( request : ĠDown loader . Server Request , Ġcontent Length : ĠLong , Ġprevious Slice Size : ĠInt ): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Request File Downloader Type ( request : ĠDown loader . Server Request , Ġsupported File Downloader Types : ĠSet < Downloader . File Downloader Type >): ĠDown loader . File Downloader Type Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfile Downloader Type ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġverify Content Hash ( request : ĠDown loader . Server Request , Ġhash : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( hash . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfile Hash Ġ= ĠgetFile Md 5 String ( request . file ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfile Hash ?. content Equals ( hash ) Ġ?: Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Server Response ( request : ĠDown loader . Server Request , Ġresponse : ĠDown loader . Response ) Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Head Request Method Supported ( request : ĠDown loader . Server Request ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Request BufferSize ( request : ĠDown loader . Server Request ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠDEFAULT _ BUFFER _ SIZE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Request Content Length ( request : ĠDown loader . Server Request ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Request Content Length ( request , Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Request Supported File Downloader Types ( request : ĠDown loader . Server Request ): ĠSet < Downloader . File Downloader Type > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Request Supported File Downloader Types ( request , Ġthis ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutable Set Of ( file Downloader Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUse Ġthis Ġclass Ġto Ġset Ġpreference Ġsettings Ġfor Ġthe ĊĠĠĠĠ Ġ* ĠHttp Url Connection Downloader ĠHttp Url Connection Ġclient . ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġopen Ġclass ĠHttp Url Connection Preferences Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġread Timeout Ġ= Ġ 2 0 _ 0 0 0 ĊĠĠĠĠĠĠĠ Ġvar Ġconnect Timeout Ġ= Ġ 1 5 _ 0 0 0 ĊĠĠĠĠĠĠĠ Ġvar Ġuses Cache Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġuses Default Cache Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġfollows Redirect Ġ= Ġtrue ĊĠĠĠ Ġ} Ċ Ċ }