HTTP コネクタトラブルシューティングガイド

ワイヤロギング

HTTP の問題をトラブルシューティングする最良の方法は、ワイヤロギングを有効にすることです。ワイヤロギングをセットアップすると、流れている実際の未加工 HTTP 要求および応答がログに記録されます。

ログが収集されたら、そのログを使用して現在の設定を検証したり、HTTP コネクタの動作を他のクライアントやサーバと比較したりできます。

HTTP ワイヤロギングを有効にするには、次のエントリをアーチファクトのログ設定 (log4j2.xml​) に追加する必要があります。

<?xml version="1.0" encoding="utf-8"?>
<Configuration>
    ...
    <Loggers>
        ...
        <!-- Http Logger shows wire traffic on DEBUG. -->
        <AsyncLogger name="org.mule.service.http.impl.service.HttpMessageLogger" level="DEBUG"/>
        ...
    </Loggers>
</Configuration>

TLS デバッグ

HTTPS が使用されているために SSL 障害が確認されたか疑われる場合、通常接続は確立さえできず、ワイヤロギングは役に立ちません。 この状況では、SSL デバッグを有効にする必要があります。それにより、すべての SSL 関連のデータ (接続試行、ハンドシェイク、ネゴシエーションなど) がログに記録されます。

そのログを調査して、正しい証明書が揃っているか、暗号化やプロトコルの不一致が起きていないか、なぜ接続が失敗するのかなどを判別できます。

TLS デバッグを有効にするには、システムプロパティ -Djavax.net.debug=ssl​ が設定されている必要があります。

一般的な問題

HTTP 使用時に見られる一般的な問題として次のようなものがあります。

Host ヘッダーの誤使用

Host​ ヘッダーは、要求されるリソースのホストとポート番号を示すために HTTP クライアントで使用されます。これは、HTTP 要求が 設定されたホストとポートを考慮して自動生成する必須のヘッダーです。

ポート情報は省略可能であるため、サーバがその情報を考慮しないことがあり、ホストとポートの両方のデータがある要求を受信するとエラーになります。

こうしたエラーはサーバ所有者に報告する必要があります。修正プログラムは提供されていますが、HTTP Request 操作を変更して、ポートセクションのない明示的な Host​ ヘッダーを指定することで問題を回避できます。

たとえば、次の設定では Host: somehost.com​ ヘッダーが送信されます。

<flow name="connectingToFaultyServer">
  <http:request method="GET" url="http://somehost.com:8081/api/v3/someresource">
    <http:headers>
      #[{"Host" : "somehost.com"}]
    </http:headers>
  </http:request>
  <logger level="INFO"
   message="#['Received a ' ++ attributes.status code ++ ' response with body: {' ++ payload ++ '}']"/>
</flow>

明示的なヘッダー設定がないと、自動生成された Host: somehost.com:8081​ が送信されます。

HTTP エンコードのサポート

HTTP コネクタは、送信するデータのサイズに関する情報を入手できない場合、要求と応答を Transfer-Encoding: chunked​ エンコードで送信します。これは、ストリーミングデータの操作時のパフォーマンスを改善するためによく使用される方法です。

HTTP クライアントおよびサーバがこうしたデータを受信する準備ができていない場合があります。

このようなエラーはサーバまたはクライアント所有者に報告する必要があります。修正プログラムは提供されていますが、HTTP Listener と HTTP Request の両方を変更して、常に Content-Length​ でエンコードされた本文を返すことで、問題を回避できます。

次の例では、HTTP Listener で responseStreamingMode​ が NEVER​ に設定されています。これは、Content-Length​ エンコードを常に使用する必要があることを示します。

<flow name="main-contact-read">
  <http:listener path="account/{accountId}/main-contact" allowedMethods="GET" responseStreamingMode="NEVER" config-ref="HTTP_Listener_config"/>
  <!-- fetch main contact for accountId -->
</flow>

次の例では、HTTP Request 操作で requestStreamingMode​ が NEVER​ に設定されています。これは、Content-Length​ エンコードを常に使用する必要があることを示します。

<flow name="connectingToFaultyServer">
  <http:request method="GET" url="http://somehost.com:8081/api/v3/someresource" requestStreamingMode="NEVER"/>
  <logger level="INFO"
   message="#['Received a ' ++ attributes.status code ++ ' response with body: {' ++ payload ++ '}']"/>
</flow>