このエラーは、クライアントが response を SOAP envelope として解釈できなかったことを意味します。
Unable to create envelope from given source
重要なのは、原因が request ではなく response 側にあることも多い、という点です。
SOAP クライアントが期待しているもの
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
...
</soap:Body>
</soap:Envelope>
返ってきた body が途中で切れている、HTML になっている、encoding が壊れている、というケースでは envelope を作れません。
よくある原因
HTML が返っている
まずはこれを疑ってください。
curl -i https://example.com/service.svc
HTML が返るなら、ログイン画面、404、proxy error のどれかであることが多いです。
response が途中で切れている
古い SOAP サーバーや途中のプロキシが connection を途中で閉じると、半端な XML が返ります。
encoding が壊れている
XML 宣言と実際のバイト列が一致していないと、パーサーは envelope 以前で落ちます。
切り分け手順
まず raw response を保存します。
curl -sv https://example.com/service.svc \
-H 'Content-Type: text/xml; charset=utf-8' \
--data @request.xml \
-o response.xml
次に確認します。
head -40 response.xml
xmllint --noout response.xml
xmllint が失敗するなら、SOAP client が出しているのは症状でしかありません。
transport 層も見る
次のような中間層の問題でも同じエラーになります。
Content-Encodingの不整合- proxy がレスポンスを書き換えている
- gzip された body が途中で欠けている
このエラーを見た時は、次の順番で見れば十分です。
- response は XML か
- XML は最後まで揃っているか
xmllintを通るか- 本当に SOAP endpoint から返っているか
- gateway が body を壊していないか
ここまで見れば、どの層で壊れているかはかなり切れます。