Протокол.registerProtocol для apache HttpClient вызывает глобальное статическое изменение? - PullRequest
0 голосов
/ 18 октября 2018

Я наткнулся на некоторый код, который использует

Protocol.registerProtocol

в попытке заблокировать некоторые шифры TLS для запроса и повторять запрос с повторным включением его время от времени., в зависимости от других факторов.

Но вызывает ли Protocol.registerProtocol глобальное изменение - т.е. повлияет ли это на другие потоки?

Вот код вопроса:

protected static HostConfiguration buildTLSConfig(String uri, HostConfiguration config,
        boolean blockTLS1)
        throws MalformedURLException
{
        scheme = "https";
        if (baseHttps == null)
        {
            baseHttps = Protocol.getProtocol(scheme);
            baseFactory = baseHttps.getSocketFactory();
        }

        URL newUrl = new URL(uri);

        defaultPort = baseHttps.getDefaultPort();

        if (blockTLS1)
        {
            ProtocolSocketFactory customFactory =
                    new CustomHttpsSocketFactory(baseFactory, TLS_PREFERRED_PROTOCOLS);
            Protocol applyHttps = new Protocol(scheme, customFactory, defaultPort);
            Protocol.registerProtocol(scheme, applyHttps);
            config.setHost(newUrl.getHost(), defaultPort, applyHttps);
        }
        else
        {
            Protocol.registerProtocol(scheme, baseHttps);
            config.setHost(newUrl.getHost(), defaultPort, baseHttps);
        }

        return config;
}

1 Ответ

0 голосов
/ 19 октября 2018

Да, изменение затронет все потоки.

Если мы посмотрим на org.apache.commons.httpclient.protocol.Protocol, мы увидим глобальный протокол Map:

    /** The available protocols */
    private static final Map PROTOCOLS = Collections.synchronizedMap(new HashMap());

И registerProtocol()просто изменив его:

public static void registerProtocol(String id, Protocol protocol) {

    // . . .

    PROTOCOLS.put(id, protocol);
}

По крайней мере он синхронизирован, поэтому не будет гонки во время модификации .

...