/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 6 ĠSquare , ĠInc . Ċ Ġ* Ċ Ġ* Ġ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 Ġokhttp 3 . internal . platform Ċ Ċ import Ġokhttp 3 . Protocol Ċ import Ġjava . lang . reflect . Invocation Handler Ċ import Ġjava . lang . reflect . Invocation TargetException Ċ import Ġjava . lang . reflect . Method Ċ import Ġjava . lang . reflect . Proxy Ċ import Ġjavax . net . ssl . SS LS ocket Ċ Ċ /** ĠOpen JDK Ġ 8 Ġwith Ġ` org . mort bay . jetty . al pn : al pn - boot ` Ġin Ġthe Ġboot Ġclass Ġpath . Ġ*/ Ċ class ĠJ dk 8 With Jet ty Boot Platform ( ĊĠ Ġprivate Ġval Ġput Method : ĠMethod , ĊĠ Ġprivate Ġval Ġget Method : ĠMethod , ĊĠ Ġprivate Ġval Ġremove Method : ĠMethod , ĊĠ Ġprivate Ġval Ġclient Provider Class : ĠClass <* >, ĊĠ Ġprivate Ġval Ġserver Provider Class : ĠClass < *> Ċ ) Ġ: ĠPlatform () Ġ{ ĊĠ Ġoverride Ġfun Ġconfigure Tls Extensions ( ĊĠĠĠ Ġssl Socket : ĠSSL Socket , ĊĠĠĠ Ġhostname : ĠString ?, ĊĠĠĠ Ġprotocols : ĠList < Protocol > ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġval Ġnames Ġ= Ġal pn Protocol Names ( protocols ) ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġal pn Provider Ġ= ĠProxy . new Proxy Instance ( Platform :: class . java . class Loader , ĊĠĠĠĠĠĠĠĠĠ ĠarrayOf ( client Provider Class , Ġserver Provider Class ), ĠA lp n Provider ( names )) ĊĠĠĠĠĠ Ġput Method . invoke ( null , Ġssl Socket , Ġal pn Provider ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠInvocation TargetException ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠAssertionError (" failed Ġto Ġset ĠAL PN ", Ġe ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠAssertionError (" failed Ġto Ġset ĠAL PN ", Ġe ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġafter Handshake ( ssl Socket : ĠSSL Socket ) Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġremove Method . invoke ( null , Ġssl Socket ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠAssertionError (" failed Ġto Ġremove ĠAL PN ", Ġe ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠInvocation TargetException ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠAssertionError (" failed Ġto Ġremove ĠAL PN ", Ġe ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Selected Protocol ( socket : ĠSSL Socket ): ĠString ? Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġprovider Ġ= ĠProxy . get Invocation Handler ( getMethod . invoke ( null , Ġsocket )) Ġas ĠA lp n Provider ĊĠĠĠĠĠ Ġif Ġ(! provider . unsupported Ġ&& Ġprovider . selected Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPlatform . get (). log ( INFO , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" AL PN Ġcallback Ġdropped : ĠHTTP / 2 Ġis Ġdisabled . Ġ" Ġ+ Ġ" Is Ġal pn - boot Ġon Ġthe Ġboot Ġclass Ġpath ?", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ) ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġif Ġ( provider . unsupported ) Ġnull Ġelse Ġprovider . selected ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠInvocation TargetException ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠAssertionError (" failed Ġto Ġget ĠAL PN Ġselected Ġprotocol ", Ġe ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠAssertionError (" failed Ġto Ġget ĠAL PN Ġselected Ġprotocol ", Ġe ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠHandle Ġthe Ġmethods Ġof ĠAL PN 's ĠClient Provider Ġand ĠServer Provider Ġwithout Ġa Ġcompile - time ĊĠĠ Ġ* Ġdependency Ġon Ġthose Ġinterfaces . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġclass ĠA lp n Provider Ġinternal Ġconstructor ( ĊĠĠĠ Ġ/** ĠThis Ġpeer 's Ġsupported Ġprotocols . Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġprotocols : ĠList < String > ĊĠ Ġ) Ġ: ĠInvocation Handler Ġ{ ĊĠĠĠ Ġ/** ĠSet Ġwhen Ġremote Ġpeer Ġnot ifies ĠAL PN Ġis Ġunsupported . Ġ*/ ĊĠĠĠ Ġinternal Ġvar Ġunsupported : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ/** ĠThe Ġprotocol Ġthe Ġserver Ġselected . Ġ*/ ĊĠĠĠ Ġinternal Ġvar Ġselected : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Throws ( Throwable :: class ) ĊĠĠĠ Ġoverride Ġfun Ġinvoke ( proxy : ĠAny , Ġmethod : ĠMethod , Ġargs : ĠArray < Any >? ): ĠAny ? Ġ{ ĊĠĠĠĠĠ Ġval Ġcall Args Ġ= Ġargs Ġ?: ĠarrayOf < Any ?> () ĊĠĠĠĠĠ Ġval ĠmethodName Ġ= Ġmethod . name ĊĠĠĠĠĠ Ġval ĠreturnType Ġ= Ġmethod . returnType ĊĠĠĠĠĠ Ġif Ġ( methodName Ġ== Ġ" supports " Ġ&& ĠBoolean :: class . java Primitive Type Ġ== ĠreturnType ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue Ġ// ĠAL PN Ġis Ġsupported . ĊĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( methodName Ġ== Ġ" unsupported " Ġ&& ĠVoid . TYPE Ġ== ĠreturnType ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . unsupported Ġ= Ġtrue Ġ// ĠPeer Ġdoesn 't Ġsupport ĠAL PN . ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( methodName Ġ== Ġ" protocols " Ġ&& Ġcall Args . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġprotocols Ġ// ĠClient Ġadvert ises Ġthese Ġprotocols . ĊĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(( methodName Ġ== Ġ" select Protocol " Ġ|| ĠmethodName Ġ== Ġ" select ") Ġ&& ĊĠĠĠĠĠĠĠĠĠ ĠString :: class . java Ġ== ĠreturnType Ġ&& Ġcall Args . size Ġ== Ġ 1 Ġ&& Ġcall Args [ 0 ] Ġis ĠList <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpeer Protocols Ġ= Ġcall Args [ 0 ] Ġas ĠList < *> ĊĠĠĠĠĠĠĠ Ġ// ĠPick Ġthe Ġfirst Ġknown Ġprotocol Ġthe Ġpeer Ġadvert ises . ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. peer Protocols . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġprotocol Ġ= Ġpeer Protocols [ i ] Ġas ĠString ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( protocol Ġin Ġprotocols ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Ġ= Ġprotocol ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġselected ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġselected Ġ= Ġprotocols [ 0 ] Ġ// ĠOn Ġno Ġintersection , Ġtry Ġpeer 's Ġfirst Ġprotocol . ĊĠĠĠĠĠĠĠ Ġreturn Ġselected ĊĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(( methodName Ġ== Ġ" protocol Selected " Ġ|| ĠmethodName Ġ== Ġ" selected ") Ġ&& Ġcall Args . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . selected Ġ= Ġcall Args [ 0 ] Ġas ĠString Ġ// ĠServer Ġselected Ġthis Ġprotocol . ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmethod . invoke ( this , Ġ* call Args ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġfun Ġbuild If Supported (): ĠPlatform ? Ġ{ ĊĠĠĠĠĠ Ġval Ġj vm Version Ġ= ĠSystem . getProperty (" java . specification . version ", Ġ" unknown ") ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ 1 . 8 , Ġ 9 , Ġ 1 0 , Ġ 1 1 , Ġ 1 2 Ġetc ĊĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġj vm Version . toInt () ĊĠĠĠĠĠĠĠ Ġif Ġ( version Ġ>= Ġ 9 ) Ġreturn Ġnull ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( n fe : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġexpected Ġon Ġ>= ĠJDK Ġ 9 ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// ĠFind ĠJet ty 's ĠAL PN Ġextension Ġfor ĠOpen JDK . ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġal pn ClassName Ġ= Ġ" org . eclipse . jetty . al pn . AL PN " ĊĠĠĠĠĠĠĠ Ġval Ġal pn Class Ġ= ĠClass . forName ( al pn ClassName , Ġtrue , Ġnull ) ĊĠĠĠĠĠĠĠ Ġval Ġprovider Class Ġ= ĠClass . forName ("$ al pn ClassName \$ Provider ", Ġtrue , Ġnull ) ĊĠĠĠĠĠĠĠ Ġval Ġclient Provider Class Ġ= ĠClass . forName ("$ al pn ClassName \$ Client Provider ", Ġtrue , Ġnull ) ĊĠĠĠĠĠĠĠ Ġval Ġserver Provider Class Ġ= ĠClass . forName ("$ al pn ClassName \$ Server Provider ", Ġtrue , Ġnull ) ĊĠĠĠĠĠĠĠ Ġval Ġput Method Ġ= Ġal pn Class . getMethod (" put ", ĠSSL Socket :: class . java , Ġprovider Class ) ĊĠĠĠĠĠĠĠ Ġval Ġget Method Ġ= Ġal pn Class . getMethod (" get ", ĠSSL Socket :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġremove Method Ġ= Ġal pn Class . getMethod (" remove ", ĠSSL Socket :: class . java ) ĊĠĠĠĠĠĠĠ Ġreturn ĠJ dk 8 With Jet ty Boot Platform ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Method , Ġget Method , Ġremove Method , Ġclient Provider Class , Ġserver Provider Class ) ĊĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠClass NotFoundException ) Ġ{ ĊĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠNoSuch Method Exception ) Ġ{ ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ