/* Ċ Ġ* Ġ ĠLicensed Ġto Ġthe ĠApache ĠSoftware ĠFoundation Ġ( ASF ) Ġunder Ġone Ġor Ġmore Ċ Ġ* Ġ Ġcontributor Ġlicense Ġagreements . Ġ ĠSee Ġthe ĠNOTICE Ġfile Ġdistributed Ġwith Ċ Ġ* Ġ Ġthis Ġwork Ġfor Ġadditional Ġinformation Ġregarding Ġcopyright Ġownership . Ċ Ġ* Ġ ĠThe ĠASF Ġlicenses Ġthis Ġfile Ġto ĠYou Ġ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 Ċ Ċ import Ġjava . net . Socket Ċ Ċ /** Ċ Ġ* ĠThe Ġsockets Ġand Ġstreams Ġof Ġan ĠHTTP , ĠHTTPS , Ġor ĠHTTPS + HTTP / 2 Ġconnection . ĠMay Ġbe Ġused Ġfor Ġmultiple Ċ Ġ* ĠHTTP Ġrequest / response Ġex changes . ĠConnection s Ġmay Ġbe Ġdirect Ġto Ġthe Ġorigin Ġserver Ġor Ġvia Ġa Ġproxy . Ċ Ġ* Ċ Ġ* ĠTypically Ġinstances Ġof Ġthis Ġclass Ġare Ġcreated , Ġconnected Ġand Ġexerc ised Ġautomatically Ġby Ġthe ĠHTTP Ċ Ġ* Ġclient . ĠApplications Ġmay Ġuse Ġthis Ġclass Ġto Ġmonitor ĠHTTP Ġconnections Ġas Ġmembers Ġof Ġa Ċ Ġ* Ġ[ connection Ġpool ][ Connection Pool ]. Ċ Ġ* Ċ Ġ* ĠDo Ġnot Ġconf use Ġthis Ġclass Ġwith Ġthe Ġmis named Ġ` Http URLConnection `, Ġwhich Ġisn 't Ġso Ġmuch Ġa Ġconnection Ċ Ġ* Ġas Ġa Ġsingle Ġrequest / response Ġexchange . Ċ Ġ* Ċ Ġ* Ġ## ĠModern ĠTLS Ċ Ġ* Ċ Ġ* ĠThere Ġare Ġtrade - offs Ġwhen Ġselecting Ġwhich Ġoptions Ġto Ġinclude Ġwhen Ġneg oti ating Ġa Ġsecure Ġconnection Ċ Ġ* Ġto Ġa Ġremote Ġhost . ĠNew er ĠTLS Ġoptions Ġare Ġquite Ġuseful : Ċ Ġ* Ċ Ġ* Ġ Ġ* ĠServer ĠName ĠIndic ation Ġ( S NI ) Ġenables Ġone ĠIP Ġaddress Ġto Ġneg otiate Ġsecure Ġconnections Ġfor Ċ Ġ* ĠĠĠ Ġmultiple Ġdomain Ġnames . Ċ Ġ* Ċ Ġ* Ġ Ġ* ĠApplication ĠLayer ĠProtocol ĠNeg otiation Ġ( AL PN ) Ġenables Ġthe ĠHTTPS Ġport Ġ( 4 4 3 ) Ġto Ġbe Ġused Ġto Ċ Ġ* ĠĠĠ Ġneg otiate ĠHTTP / 2 . Ċ Ġ* Ċ Ġ* ĠUnfortunately , Ġolder ĠHTTPS Ġservers Ġref use Ġto Ġconnect Ġwhen Ġsuch Ġoptions Ġare Ġpresented . ĠR ather Ġthan Ċ Ġ* Ġavoid ing Ġthese Ġoptions Ġentirely , Ġthis Ġclass Ġallows Ġa Ġconnection Ġto Ġbe Ġattempted Ġwith Ġmodern Ċ Ġ* Ġoptions Ġand Ġthen Ġretried Ġwithout Ġthem Ġshould Ġthe Ġattempt Ġfail . Ċ Ġ* Ċ Ġ* Ġ## ĠConnection ĠRe use Ċ Ġ* Ċ Ġ* ĠEach Ġconnection Ġcan Ġcarry Ġa Ġvarying Ġnumber Ġof Ġstreams , Ġdepending Ġon Ġthe Ġunderlying Ġprotocol Ġbeing Ċ Ġ* Ġused . ĠHTTP / 1 . x Ġconnections Ġcan Ġcarry Ġeither Ġzero Ġor Ġone Ġstreams . ĠHTTP / 2 Ġconnections Ġcan Ġcarry Ġany Ċ Ġ* Ġnumber Ġof Ġstreams , Ġdynamically Ġconfigured Ġwith Ġ` SETTINGS _ MAX _ CON CURRENT _ STREAM S `. ĠA Ġconnection Ċ Ġ* Ġcurrently Ġcarry ing Ġzero Ġstreams Ġis Ġan Ġidle Ġstream . ĠWe Ġkeep Ġit Ġalive Ġbecause Ġre using Ġan Ġexisting Ċ Ġ* Ġconnection Ġis Ġtypically Ġfaster Ġthan Ġestablish ing Ġa Ġnew Ġone . Ċ Ġ* Ċ Ġ* ĠWhen Ġa Ġsingle Ġlogical Ġcall Ġrequires Ġmultiple Ġstreams Ġdue Ġto Ġredirects Ġor Ġauthorization Ċ Ġ* Ġchallenges , Ġwe Ġprefer Ġto Ġuse Ġthe Ġsame Ġphysical Ġconnection Ġfor Ġall Ġstreams Ġin Ġthe Ġsequence . ĠThere Ċ Ġ* Ġare Ġpotential Ġperformance Ġand Ġbehavior Ġcon sequences Ġto Ġthis Ġpreference . ĠTo Ġsupport Ġthis Ġfeature , Ċ Ġ* Ġthis Ġclass Ġsepar ates Ġ_ alloc ations _ Ġfrom Ġ_ streams _. ĠAn Ġallocation Ġis Ġcreated Ġby Ġa Ġcall , Ġused Ġfor Ċ Ġ* Ġone Ġor Ġmore Ġstreams , Ġand Ġthen Ġreleased . ĠAn Ġallocated Ġconnection Ġwon 't Ġbe Ġst olen Ġby Ġother Ġcalls Ċ Ġ* Ġwhile Ġa Ġredirect Ġor Ġauthorization Ġchallenge Ġis Ġbeing Ġhandled . Ċ Ġ* Ċ Ġ* ĠWhen Ġthe Ġmaximum Ġconcurrent Ġstreams Ġlimit Ġis Ġreduced , Ġsome Ġallocations Ġwill Ġbe Ġre sc in ded . Ċ Ġ* ĠAt tempting Ġto Ġcreate Ġnew Ġstreams Ġon Ġthese Ġallocations Ġwill Ġfail . Ċ Ġ* Ċ Ġ* ĠNote Ġthat Ġan Ġallocation Ġmay Ġbe Ġreleased Ġbefore Ġits Ġstream Ġis Ġcompleted . ĠThis Ġis Ġintended Ġto Ġmake Ċ Ġ* Ġbook keep ing Ġeasier Ġfor Ġthe Ġcaller : Ġreleasing Ġthe Ġallocation Ġas Ġsoon Ġas Ġthe Ġterminal Ġstream Ġhas Ċ Ġ* Ġbeen Ġfound . ĠBut Ġonly Ġcomplete Ġthe Ġstream Ġonce Ġits Ġdata Ġstream Ġhas Ġbeen Ġex hausted . Ċ Ġ*/ Ċ interface ĠConnection Ġ{ ĊĠĠ Ġ/** ĠReturns Ġthe Ġroute Ġused Ġby Ġthis Ġconnection . Ġ*/ ĊĠĠ Ġfun Ġroute (): ĠRoute ĊĊĠĠ Ġ/** ĊĠĠĠ Ġ* ĠReturns Ġthe Ġsocket Ġthat Ġthis Ġconnection Ġis Ġusing . ĠReturns Ġan ĊĠĠĠ Ġ* Ġ[ SSL Ġsocket ][ javax . net . ssl . SS LS ocket ] Ġif Ġthis Ġconnection Ġis ĠHTTPS . ĠIf Ġthis Ġis Ġan ĠHTTP / 2 ĊĠĠĠ Ġ* Ġconnection Ġthe Ġsocket Ġmay Ġbe Ġshared Ġby Ġmultiple Ġconcurrent Ġcalls . ĊĠĠĠ Ġ*/ ĊĠĠ Ġfun Ġsocket (): ĠSocket ĊĊĠĠ Ġ/** ĊĠĠĠ Ġ* ĠReturns Ġthe ĠTLS Ġhandshake Ġused Ġto Ġestablish Ġthis Ġconnection , Ġor Ġnull Ġif Ġthe Ġconnection Ġis Ġnot ĊĠĠĠ Ġ* ĠHTTPS . ĊĠĠĠ Ġ*/ ĊĠĠ Ġfun Ġhandshake (): ĠHand shake ? ĊĊĠĠ Ġ/** ĊĠĠĠ Ġ* ĠReturns Ġthe Ġprotocol Ġneg oti ated Ġby Ġthis Ġconnection , Ġor Ġ[ Protocol . HTTP _ 1 _ 1 ] Ġif Ġno Ġprotocol ĊĠĠĠ Ġ* Ġhas Ġbeen Ġneg oti ated . ĠThis Ġmethod Ġreturns Ġ[ Protocol . HTTP _ 1 _ 1 ] Ġeven Ġif Ġthe Ġremote Ġpeer Ġis Ġusing ĊĠĠĠ Ġ* Ġ[ Protocol . HTTP _ 1 _ 0 ]. ĊĠĠĠ Ġ*/ ĊĠĠ Ġfun Ġprotocol (): ĠProtocol Ċ } Ċ