Java ProxySelector: ทำให้พอร์ต HTTP และ HTTPS ที่หายไปเป็นมาตรฐาน
ทำให้พอร์ต HTTP ที่ถูกละไว้เป็นมาตรฐานก่อนเปรียบเทียบปลายทางใน ProxySelector ที่กำหนดเอง และเก็บกฎ HTTP ไว้นอกการเลือกซ็อกเกตดิบ
กฎหนึ่งส่ง http://reports.example:80/ ผ่านพร็อกซีแต่ปล่อยให้ http://reports.example/ ผ่านโดยตรง URL ทั้งสองนั้นอธิบายปลายทาง HTTP ปกติเดียวกัน ความไม่ตรงกันมักเกิดจากการเปรียบเทียบพอร์ตที่แยกวิเคราะห์แล้วตามตัวอักษร
URI.getPort() คืนค่า -1 เมื่อไม่มีพอร์ตใน URI มันไม่แทนที่ค่าเริ่มต้นของสคีมา นโยบายการกำหนดเส้นทางที่เปรียบเทียบค่ากับ 80 จะพลาด 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;
}
ใช้การทำให้เป็นมาตรฐานเดียวกันกับทั้งสองด้านของการเปรียบเทียบ การแก้เฉพาะ URI ของคำขอจะยังทำให้ปลายทางที่กำหนดค่าไว้ซึ่งมีพอร์ตถูกละไว้ไม่ตรงกัน เปรียบเทียบโฮสต์ พอร์ตที่มีผล และสคีมาที่ตั้งใจ ปลายทางที่ผิดรูปแบบหรือไม่มีโฮสต์ให้ปฏิเสธผ่านเส้นทางข้อผิดพลาดที่กำหนดไว้
อย่าเปลี่ยนทุก callback ให้เป็นการตัดสินใจ HTTP
ตัวเลือกเริ่มต้นอาจถูกถามสำหรับการเชื่อมต่อซ็อกเกตดิบด้วย โดยใช้สคีมา socket การตรงกันของโฮสต์และพอร์ตเพียงอย่างเดียวไม่ควรทำให้ callback นั้นคืนพร็อกซี HTTP ที่มีไว้สำหรับคำขอ URL มอบสคีมาที่ไม่รองรับให้ตัวเลือกก่อนหน้า โดยรักษาพฤติกรรมที่เหมาะสมไว้
เก็บตัวเลือกก่อนหน้านั้นไว้ก่อนติดตั้งของคุณเอง การค้นหาค่าเริ่มต้นปัจจุบันจากภายในตัวแทนอาจเรียกตัวแทนซ้ำอีกครั้ง
บันทึกสคีมา โฮสต์ พอร์ตเดิม และพอร์ตที่มีผลเมื่อวินิจฉัยความไม่ตรงกัน อย่าพึ่งพาตัวเลขที่สังเกตได้ตัวเดียวหรือลำดับของ callback ข้ามการใช้งาน JDK นโยบายควรตัดสินใจอย่างถูกต้องสำหรับทุก URI ที่ให้มา