KSOAP-AndroidとJCIFSに基づいてNTLM認証SOAPクライアントを作成しました。実装は次のようになります。
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はその役割を果たしているようであり、Wiresharkを介してNTLMチャレンジレスポンスが行われているのを見ることができます。問題は、メッセージ本文が欠落していることです。それは単にnullです。このため、Webサービスは501に遭遇し、InputStream返されたものはnullです。
なぜこれが起こるのか誰かが手がかりを持っていますか?
注:setEntity明らかにこれを設定しようとしているが、KSOAPがすでに設定しているため、以下のCONTENT-LENGTHヘッダーを削除しています。削除しsetEntityてリセットするだけです。