Java ProxySelector: eksik HTTP ve HTTPS bağlantı noktalarını normalleştirme
Özel bir ProxySelector içinde hedefleri karşılaştırmadan önce atlanan HTTP bağlantı noktalarını normalleştirin ve HTTP kurallarını ham soket seçiminin dışında tutun.
Bir kural http://reports.example:80/ adresini proxy üzerinden gönderir ama http://reports.example/ adresinin doğrudan geçmesine izin verir. Bu URL'ler aynı sıradan HTTP uç noktasını tanımlar. Uyuşmazlık genellikle ayrıştırılmış bağlantı noktalarının harfi harfine karşılaştırılmasından kaynaklanır.
URI.getPort(), URI'de bağlantı noktası yoksa -1 döndürür. Şemanın varsayılanını yerine koymaz. Değeri 80 ile karşılaştıran bir yönlendirme ilkesi ikinci URL'yi kaçırır.
String scheme = uri.getScheme();
int port = uri.getPort();
if (port == -1) {
if ("http".equalsIgnoreCase(scheme)) port = 80;
else if ("https".equalsIgnoreCase(scheme)) port = 443;
}
Aynı normalleştirmeyi karşılaştırmanın iki tarafına da uygulayın. Yalnızca isteğin URI'sini düzeltmek, bağlantı noktası atlanmış yapılandırılmış bir hedefi yine eşleşmeden bırakır. Ana bilgisayarı, etkin bağlantı noktasını ve amaçlanan şemayı karşılaştırın; bozuk veya ana bilgisayarsız hedefleri tanımlı bir hata yoluyla reddedin.
Her geri çağırmayı bir HTTP kararına dönüştürmeyin
Varsayılan seçiciye ham soket bağlantıları için de socket şemasıyla danışılabilir. Yalnızca ana bilgisayar ve bağlantı noktası eşleşmesi, o geri çağırmanın URL istekleri için amaçlanmış bir HTTP proxy'si döndürmesine neden olmamalıdır. Desteklenmeyen şemaları önceki seçiciye devredin ve onun uygun davranışını koruyun.
Kendinizinkini kurmadan önce o önceki seçiciyi yakalayın. Geçerli varsayılanı değiştiricinin içinden aramak, değiştiriciyi yeniden çağırmakla sonuçlanabilir.
Bir uyuşmazlığı teşhis ederken şemayı, ana bilgisayarı, özgün bağlantı noktasını ve etkin bağlantı noktasını günlüğe kaydedin. JDK uygulamaları arasında gözlenen tek bir sayıya veya geri çağırma sırasına güvenmeyin. İlke, verilen her URI için doğru karar vermelidir.