Java ProxySelector: gawing normal ang mga nawawalang port ng HTTP at HTTPS
Gawing normal ang mga inalis na port ng HTTP bago ihambing ang mga destinasyon sa custom na ProxySelector, at ilayo ang mga tuntunin ng HTTP sa pagpili ng raw socket.
Isang tuntunin ang nagpapadala ng http://reports.example:80/ sa pamamagitan ng proxy ngunit hinahayaang dumiretso ang http://reports.example/. Ang parehong URL ay naglalarawan ng iisang ordinaryong HTTP endpoint. Karaniwang nagmumula ang pagkakaiba sa literal na paghahambing ng mga na-parse na port.
Nagbabalik ang URI.getPort() ng -1 kapag walang port sa URI. Hindi nito pinapalitan ang default para sa scheme. Ang patakaran sa routing na naghahambing ng halaga sa 80 ay makakaligtaan ang pangalawang URL.
String scheme = uri.getScheme();
int port = uri.getPort();
if (port == -1) {
if ("http".equalsIgnoreCase(scheme)) port = 80;
else if ("https".equalsIgnoreCase(scheme)) port = 443;
}
Ilapat ang parehong normalisasyon sa magkabilang panig ng paghahambing. Ang pag-aayos lamang ng URI ng kahilingan ay nag-iiwan pa rin ng naka-configure na destinasyon na may inalis na port na walang tugma. Ihambing ang host, epektibong port at nilalayong scheme; tanggihan ang mga malformed o walang host na destinasyon sa pamamagitan ng tinukoy na error path.
Huwag gawing desisyon sa HTTP ang bawat callback
Ang default na selector ay maaari ring tanungin para sa mga koneksyon ng raw socket, gamit ang scheme na socket. Ang pagtutugma lamang ng host at port ay hindi dapat maging dahilan upang ibalik ng callback na iyon ang HTTP proxy na inilaan para sa mga kahilingan ng URL. Ipagkatiwala ang mga hindi sinusuportahang scheme sa naunang selector, pinapanatili ang angkop na pag-uugali nito.
Kunin ang naunang selector bago i-install ang iyo. Ang paghahanap ng kasalukuyang default mula sa loob ng kapalit ay maaaring tumawag muli sa kapalit.
I-log ang scheme, host, orihinal na port at epektibong port kapag nag-diagnose ng pagkakaiba. Huwag umasa sa isang naobserbahang numero o pagkakasunod-sunod ng callback sa mga implementasyon ng JDK. Dapat gumawa ng tamang desisyon ang patakaran para sa bawat ibinigay na URI.