Reguła wysyła http://reports.example:80/ przez proxy, ale pozwala http://reports.example/ iść bezpośrednio. Te adresy URL opisują ten sam zwykły punkt końcowy HTTP. Niezgodność zwykle wynika z dosłownego porównywania sparsowanych portów.

URI.getPort() zwraca -1, gdy w URI nie ma portu. Nie zastępuje wartości domyślnej schematu. Polityka routingu, która porównuje wartość z 80, przeoczy drugi adres 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;
}

Zastosuj tę samą normalizację po obu stronach porównania. Poprawienie tylko URI żądania nadal pozostawia skonfigurowane miejsce docelowe z pominiętym portem bez dopasowania. Porównuj host, efektywny port i zamierzony schemat; odrzucaj nieprawidłowe lub bezhostowe miejsca docelowe przez zdefiniowaną ścieżkę błędu.

Nie zamieniaj każdego wywołania zwrotnego w decyzję HTTP

Domyślny selektor można też odpytać o połączenia surowych gniazd, ze schematem socket. Samo dopasowanie hosta i portu nie może powodować, że to wywołanie zwróci proxy HTTP przeznaczone dla żądań URL. Przekazuj nieobsługiwane schematy poprzedniemu selektorowi, zachowując jego odpowiednie zachowanie.

Przechwyć ten poprzedni selektor, zanim zainstalujesz własny. Wyszukanie bieżącej wartości domyślnej od wewnątrz zamiennika może po prostu ponownie wywołać zamiennik.

Podczas diagnozowania niezgodności rejestruj schemat, host, port oryginalny i port efektywny. Nie polegaj na jednej zaobserwowanej liczbie ani kolejności wywołań zwrotnych w różnych implementacjach JDK. Polityka powinna podejmować poprawną decyzję dla każdego dostarczonego URI.

Powiązane artykuły