Java ProxySelector: chuẩn hóa cổng HTTP và HTTPS bị thiếu
Chuẩn hóa các cổng HTTP bị bỏ qua trước khi so sánh đích trong một ProxySelector tùy chỉnh và giữ các quy tắc HTTP ra ngoài việc chọn socket thô.
Một quy tắc gửi http://reports.example:80/ qua proxy nhưng để http://reports.example/ đi trực tiếp. Hai URL đó mô tả cùng một điểm cuối HTTP thông thường. Sự không khớp thường đến từ việc so sánh nguyên văn các cổng đã phân tích.
URI.getPort() trả về -1 khi không có cổng trong URI. Nó không thay thế giá trị mặc định của lược đồ. Một chính sách định tuyến so sánh giá trị với 80 sẽ bỏ sót URL thứ hai.
String scheme = uri.getScheme();
int port = uri.getPort();
if (port == -1) {
if ("http".equalsIgnoreCase(scheme)) port = 80;
else if ("https".equalsIgnoreCase(scheme)) port = 443;
}
Áp dụng cùng một chuẩn hóa cho cả hai bên của phép so sánh. Chỉ sửa URI của yêu cầu vẫn để một đích đã cấu hình với cổng bị bỏ qua không khớp. So sánh máy chủ, cổng hiệu lực và lược đồ dự định; từ chối các đích sai định dạng hoặc không có máy chủ thông qua một đường lỗi được xác định.
Đừng biến mỗi callback thành một quyết định HTTP
Bộ chọn mặc định cũng có thể được hỏi cho các kết nối socket thô, với lược đồ socket. Chỉ khớp máy chủ và cổng không được khiến callback đó trả về một proxy HTTP dành cho yêu cầu URL. Chuyển các lược đồ không được hỗ trợ cho bộ chọn trước đó, giữ nguyên hành vi phù hợp của nó.
Hãy nắm bắt bộ chọn trước đó trước khi cài đặt bộ chọn của bạn. Việc tra cứu giá trị mặc định hiện tại từ bên trong phần thay thế có thể chỉ đơn giản gọi lại phần thay thế.
Ghi lại lược đồ, máy chủ, cổng gốc và cổng hiệu lực khi chẩn đoán sự không khớp. Đừng dựa vào một con số quan sát được hay thứ tự callback giữa các bản triển khai JDK. Chính sách phải đưa ra quyết định đúng cho mỗi URI được cung cấp.