soap-errorsxmlparsing

Unable to create envelope from given source の原因と対処法

SOAPless Team3 min read

このエラーは、クライアントが 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 が途中で欠けている

このエラーを見た時は、次の順番で見れば十分です。

  1. response は XML か
  2. XML は最後まで揃っているか
  3. xmllint を通るか
  4. 本当に SOAP endpoint から返っているか
  5. gateway が body を壊していないか

ここまで見れば、どの層で壊れているかはかなり切れます。