Для HTTP-стека Jena на базе JDK, появившегося в Jena 4.3, настройте transport, передаваемый построителю запросов. Пароль конечной точки SPARQL и пароль прокси могут запрашиваться разными машинами.

import java.net.InetSocketAddress;
import java.net.ProxySelector;
import java.net.http.HttpClient;
import org.apache.jena.sparql.exec.http.QueryExecutionHTTP;

var http = HttpClient.newBuilder()
    .proxy(ProxySelector.of(
        new InetSocketAddress("proxy.example", 8080)))
    .authenticator(proxyAuthenticator)
    .build();

var execution = QueryExecutionHTTP.service(endpointUrl)
    .httpClient(http)
    .query("ASK { ?s ?p ?o }")
    .build();

Этот фрагмент создаёт выполнение запроса. endpointUrl — фактический URL службы SPARQL; proxyAuthenticator — java.net.Authenticator, предоставляемый приложением. Запустите и закройте выполнение запроса в обычном жизненном цикле запросов приложения.

В методе getPasswordAuthentication этого аутентификатора возвращайте PasswordAuthentication прокси только тогда, когда getRequestorType() == RequestorType.PROXY и когда хост и порт запрашивающей стороны совпадают с настроенным посредником. Для несвязанных запросов возвращайте null. Привязка этого объекта к клиенту оставляет выбор локальным для этого клиента.

Прочитайте, что требует прокси

Ответ 407 указывает на запрос аутентификации прокси. Его заголовок Proxy-Authenticate сообщает предлагаемые схемы; сам статус не отличает Basic от NTLM или другой схемы.

Сопоставьте это предложение с возможностями развёрнутого клиента JDK и его политикой аутентификации. Передача имени пользователя и пароля не добавляет неподдерживаемую схему. Для целей HTTPS также проверьте политику JDK jdk.http.auth.tunneling.disabledSchemes; у обычного проксирования HTTP отдельная настройка disabledSchemes. Значения по умолчанию для Basic-аутентификации JDK при CONNECT — одна из таких проверок политики.

Исторические примеры Jena с Apache HttpClient и SimpleNTAuthenticator относятся к более старому поколению transport. Если корпоративный прокси требует механизм аутентификации, недоступный в текущем transport, согласуйте поддерживаемую интеграцию с сетевым администратором вместо попыток втиснуть те старые объекты аутентификации в современный построитель.

Похожие статьи