Я создал SOAP-клиент для аутентификации NTLM на основе KSOAP-Android и JCIFS.Реализация выглядит примерно так:
public class NtlmServiceConnection implements ServiceConnection
{
public NtlmServiceConnection(final SoapConnectionInfo connectionInfo, String path)
{
httpclient = new DefaultHttpClient();
httpclient.getAuthSchemes().register(AuthPolicy.NTLM, new NTLMSchemeFactory());
//...
@Override
public InputStream openInputStream() throws IOException {
ByteArrayEntity re = new ByteArrayEntity(bufferStream.toByteArray());
post.removeHeaders("CONTENT-LENGTH");
post.setEntity(re);
HttpResponse rep = httpclient.execute(post);
InputStream stream = rep.getEntity().getContent();
return stream;
}
//....
}
Судя по всему, KSOAP генерирует правильное сообщение, поскольку bufferStream
заполняется конвертом SOAP, как и ожидалось.JCIFS, кажется, выполняет свою работу, и я вижу, что ответ на вызов NTLM происходит через Wireshark.Проблема в том, что тело сообщения отсутствует.Это просто ноль.Из-за этого веб-сервис встречает 501, а InputStream
возвращает ноль.
Кто-нибудь знает, почему это произойдет?
Примечание: я удаляю заголовок CONTENT-LENGTH ниже, потому что setEntity
, очевидно, пытается установить это, но KSOAP уже установил его.Я просто удаляю его и позволяю setEntity
сбросить его.