Java ProxySelector: menormalkan port HTTP dan HTTPS yang hilang
Normalkan port HTTP yang ditinggalkan sebelum membandingkan destinasi dalam ProxySelector tersuai, dan jauhkan peraturan HTTP daripada pemilihan soket mentah.
Satu peraturan menghantar http://reports.example:80/ melalui proksi tetapi membenarkan http://reports.example/ pergi terus. Kedua-dua URL itu menerangkan titik akhir HTTP biasa yang sama. Ketidakpadanan biasanya datang daripada membandingkan port yang dihuraikan secara literal.
URI.getPort() mengembalikan -1 apabila tiada port dalam URI. Ia tidak menggantikan nilai lalai untuk skema. Dasar penghalaan yang membandingkan nilai dengan 80 akan terlepas URL kedua.
String scheme = uri.getScheme();
int port = uri.getPort();
if (port == -1) {
if ("http".equalsIgnoreCase(scheme)) port = 80;
else if ("https".equalsIgnoreCase(scheme)) port = 443;
}
Gunakan normalisasi yang sama pada kedua-dua belah perbandingan. Membaiki hanya URI permintaan masih meninggalkan destinasi yang dikonfigurasikan dengan port yang ditinggalkan tanpa padanan. Bandingkan hos, port berkesan dan skema yang dimaksudkan; tolak destinasi cacat atau tanpa hos melalui laluan ralat yang ditentukan.
Jangan jadikan setiap callback keputusan HTTP
Pemilih lalai juga boleh ditanya untuk sambungan soket mentah, dengan skema socket. Padanan hos dan port semata-mata tidak boleh menyebabkan callback itu mengembalikan proksi HTTP yang dimaksudkan untuk permintaan URL. Wakilkan skema yang tidak disokong kepada pemilih sebelumnya, sambil mengekalkan tingkah laku yang sesuai.
Tangkap pemilih sebelumnya itu sebelum memasang milik anda. Mencari nilai lalai semasa dari dalam pengganti mungkin hanya memanggil pengganti semula.
Log skema, hos, port asal dan port berkesan apabila mendiagnosis ketidakpadanan. Jangan bergantung pada satu nombor yang diperhatikan atau susunan callback merentas implementasi JDK. Dasar itu harus membuat keputusan yang betul untuk setiap URI yang diberikan.