Прибытие из встроенного мира...
Ваш код компилируется в три типа памяти:
1. .data: инициализированная память
2. .text: константы и код
3. .bss: неинициализированная память (инициализированный к 0 в C++, если не явно инициализированный)
Globals входит в .data, если инициализировано. Если не они размещаются в .bss и zero'ed в предосновном коде.
Вы женаты на JAX-WS? Я использую Apache Axis2, который использует обычный httpclient и имеет встроенную аутентификацию NTLM.
Пример:
//Configure SOAP HTTP client to authenticate to server using NTLM
HttpTransportProperties.Authenticator auth = new HttpTransportProperties.Authenticator();
//TODO make report server credentials configurable
auth.setUsername("jdoe");
auth.setPassword("strongpass");
auth.setDomain("WINDOWSDOMAIN");
auth.setHost("host.mydomain.com");
auth.setPort(443);
Options o = new Options();
o.setProperty(org.apache.axis2.transport.http.HTTPConstants.AUTHENTICATE,auth);
myWebServiceStub._getServiceClient().setOptions(o);
После некоторой отладки это кажется недостатком в библиотеках классов JRE, особенно в sun.net.www.protocol.http.HttpURLConnection
.
Изучение HTTP-запросы и ответы в случае конечных точек HTTP и HTTPS показали, что в случае успешного HTTP запросы имели заголовок Proxy-Connection = keep-alive
, который отсутствовал в случае отказа HTTPS. В более общем плане, кажется, есть некоторая путаница в том, следует ли использовать «Прокси-соединение» или просто «Соединение» ...
В любом случае, примечательно, что в случае HTTP код проходит через HttpURLConnection.writeRequests ()
, который содержит следующий фрагмент кода
/*
* For HTTP/1.1 the default behavior is to keep connections alive.
* However, we may be talking to a 1.0 server so we should set
* keep-alive just in case, except if we have encountered an error
* or if keep alive is disabled via a system property
*/
// Try keep-alive only on first attempt
if (!failedOnce && http.getHttpKeepAliveSet()) {
if (http.usingProxy) {
requests.setIfNotSet("Proxy-Connection", "keep-alive");
} else {
requests.setIfNotSet("Connection", "keep-alive");
}
. При создании туннеля через прокси для HTTPS такого кода нет, что заставляет Squid расстраиваться во время разговора об аутентификации NTLM.
Чтобы обойти это, в HttpURLConnection.sendCONNECTRequest ()
я добавил
if (http.getHttpKeepAliveSet()) {
if (http.usingProxy) {
requests.setIfNotSet("Proxy-Connection", "keep-alive");
}
}
непосредственно перед
setPreemptiveProxyAuthentication(requests);
http.writeRequests(requests, null);
Я ввожу свой измененный HttpURLConnection.class
в JRE с помощью флага «-Xbootclasspath / p», и теперь он работает! Не совсем элегантно, но вот мы.