Символ @ в пароле к Java-прокси
Передайте необработанный пароль в PasswordAuthentication и применяйте URL-кодирование только при построении реального URL прокси.
java.net.PasswordAuthentication принимает имя пользователя и массив символов пароля. Передайте исходные символы пароля:
var credential = new java.net.PasswordAuthentication(
"proxy-user", "p@ssword".toCharArray());
Значение — иллюстративный пароль. В коде приложения получайте настоящие символы из нужного источника учётных данных.
Символ @ внутри этого пароля — данные, потому что у пароля уже есть собственный аргумент. Преобразование в p%40ssword до конструктора передаёт другой пароль.
URL прокси имеет другое представление учётных данных. В URL вроде http://proxy-user:p%[email protected]:8080 кодированный @ относится к сведениям о пользователе, а следующий @ отделяет эти сведения от хоста. Декодируйте и кодируйте в соответствии с интерфейсом, который действительно потребляет значение.
Кавычки в shell, экранирование строковых литералов Java и процентное кодирование URL тоже решают разные задачи разбора. Определите, какой слой читает ввод, вместо того чтобы повторно кодировать учётные данные, пока не изменится поведение запроса.