ここに表示されているのは Apigee Edge のドキュメントです。
Go to the
Apigee X のドキュメントに移動します。 info
症状
クライアント アプリケーションが、API 呼び出しに対するレスポンスとしてエラーコード
messaging.adaptors.http.flow.DecompressionFailureAtRequest 付きの HTTP ステータス コード 400 Bad Request を受け取ります。
エラー メッセージ
クライアント アプリケーションは、次のレスポンス コードを受け取ります。
HTTP/1.1 400 Bad Request
また、次のようなエラー メッセージが表示されます。
{
"fault":{
"faultstring":"Decompression failure at request",
"detail":{
"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"
}
}
}考えられる原因
このエラーは、次の場合にのみ発生します。
- HTTP リクエスト ヘッダー
Content-Encodingで指定されたエンコードが有効であり、 Apigee Edge でサポートされている。 - クライアントから送信されるペイロードの形式が、HTTP リクエスト の一部として、
Content-Encodingヘッダーで指定されたエンコード形式と一致していません
ただし
これは、ペイロードの形式が
Content-Encoding ヘッダーで指定されたエンコードと同じ形式ではないため、Apigee Edge が指定されたエンコードを使用してペイロードをデコードできないことが原因です。
サポートされている Content-Encoding 値の例と、Apigee Edge
がペイロード形式を想定するケースをいくつか示します。
| シナリオ | Content-Encoding | 予想されるペイロード形式 |
|---|---|---|
| 単一エンコード | gzip | Unix の |
| 単一エンコード | deflate | この形式では、deflate 圧縮アルゴリズムで |
| 複数エンコード | 複数エンコード たとえば、エンコードが 2 回行われる場合は、次のようになります。
|
ヘッダーに表示される順序でペイロードに適用される複数エンコード。 |
このエラーには、次の原因が考えられます。
| 原因 | 説明 | トラブルシューティングの実施対象 |
|---|---|---|
| リクエスト ペイロードの形式が Content-Encoding ヘッダーで指定されたエンコードと一致しない | クライアントから送信されたリクエスト ペイロードの形式がエンコードされていないか、エンコードが
Content-Encoding ヘッダーで指定されたエンコードと一致していません。 |
Edge Public Cloud と Private Cloud のユーザー |
共通の診断手順
このエラーを診断するには、次のいずれかのツールまたは手法を使用します。
API Monitoring
API Monitoring を使用してエラーを診断するには:
- 適切なロールを持つユーザーとして Apigee Edge UIにログインします。
問題を調査する組織に切り替えます。
- [分析] > [API Monitoring] > [調査] ページに移動します。
- エラーが発生した特定の期間を選択します。
- [プロキシ] フィルタが [すべて] に設定されていることを確認します。
- [障害コード] を [時間] に対してプロットします。
次のように、障害コード
messaging.adaptors.http.flow.DecompressionFailureAtRequestを含むセルを選択します。( 大きい画像を表示)
障害コード
messaging.adaptors.http.flow.DecompressionFailureAtRequestに関する情報が次のように表示されます。( 大きい画像を表示)
[ログを表示] をクリックし、
400エラーで失敗した行を展開します。( 大きい画像を表示)
- [ログ] ウィンドウで、次の詳細をメモします。
- ステータス コード:
400 - 障害の発生源:
proxy - 障害コード:
messaging.adaptors.http.flow.DecompressionFailureAtRequest。
- ステータス コード:
- [障害の発生源] の値が
proxyの場合、リクエスト ペイロードの形式が サポート対象のエンコードとContent-Encodingヘッダーで指定された一致していません。
Trace ツール
Trace ツールを使用してエラーを診断するには:
- トレース セッションを有効にして、次のいずれかを行います。
400 Bad Requestエラーが発生するまで待つ。- 問題が再現できる場合は、API 呼び出しを行って
400 Bad Requestを再現します。
[Show all FlowInfos] が有効になっていることを確認します。
- 失敗したリクエストのいずれかを選択して、トレースを調べます。
- トレースのさまざまなフェーズを確認し、失敗が発生した場所を特定します。
通常、エラーは次のように [Request Received from Client] フェーズの直後のフローにあります。
( 大きい画像を表示)
-
トレースからプロパティの値を確認します。
- エラー:
Decompression failure at request - error.class:
com.apigee.rest.framework.BadRequestException - error.cause:
Not in GZIP format
error.cause は、リクエスト ペイロードが GZIP 形式ではないことを示しています。 これは、Apigee Edge がリクエスト ペイロードを GZIP 形式で想定していたことを意味します
Content-Encodingヘッダーで指定されているように。 - エラー:
リクエスト ヘッダー
Content-Encodingの値を特定します。 これを行うには、次のように [Request Received from Client] フェーズに移動します。( 大きい画像を表示)
リクエスト ヘッダー
Content-Encodingの値はgzipです。上記のトレース例では、リクエスト ヘッダー
Content-Encodingで指定されたエンコードはgzipですが、リクエスト ペイロード は GZIP 形式ではありません。そのため、Apigee は gzip を使用してペイロードを解凍できず、エラーDecompression failure at requestを返します。- 次のようにトレースの [**Response Sent to Client**] フェーズに移動して、Apigee Edge から返されたステータス コードとエラー メッセージを確認します。
トレース内の以下のクライアントに送信された応答フェーズまで:
( 大きい画像を表示)
トレースから次の詳細を確認します。
- ステータス コード:
400 Bad Request。 - エラー コンテンツ:
{"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
- ステータス コード:
トレースの [AX](Analytics データが記録されました)フェーズに移動してクリックします。
- [Phase Details]、[Error Headers] セクションまでスクロールし、次のように X-Apigee-fault-code と X-Apigee-fault-source の値を特定します。
( 大きい画像を表示)
- X-Apigee-fault-code と X-Apigee-fault-source の値は
messaging.adaptors.http.flow.DecompressionFailureAtRequestとpolicyであり、リクエスト ペイロードの形式がContent-Encodingヘッダーで指定されたエンコードと一致していないことを示しています。レスポンス ヘッダー 値 X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequestX-Apigee-fault-source policy
NGINX
NGINX アクセスログを使用してエラーを診断するには:
- Private Cloud ユーザーの場合は、NGINX アクセスログを使用して HTTP
400エラーに関する重要な情報を特定できます。 NGINX アクセスログを確認します。
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logここで: ORG、ENV、PORT# は実際の値に置き換えてください。
- 特定の期間に
400エラーが発生したかどうか (過去に問題が発生した場合)、または400で失敗しているリクエストがまだあるかどうかを検索します。 X-Apigee-fault-code が
messaging.adaptors.http.flow.DecompressionFailureAtRequestの値と一致する400エラーが見つかった場合は、X-Apigee-fault-source の値を特定します。NGINX アクセスログからの 400 エラーの例:
NGINX アクセスログの上のサンプル エントリには、 X-Apigee-fault-code と X-Apigee-fault-source の値が次のように設定されています。
レスポンス ヘッダー 値 X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequestX-Apigee-fault-source policy
原因: リクエスト ペイロードの形式が Content-Encoding ヘッダーで指定されたエンコードと一致しない
デフォルトでは、リクエスト ヘッダー
Content-Encoding に有効な
サポート対象のエンコードが含まれている場合、Apigee Edge は常にペイロードを解凍します。したがって、リクエスト ペイロードの形式は、
一致する リクエスト ヘッダー Content-Encoding で指定されたエンコードと一致する 必要があります。
不一致がある場合は、このエラーが発生します。
診断
- 共通の診断手順で説明されているように、API Monitoring、Trace ツール、NGINX アクセスログを使用して、確認されたエラーの障害コード と障害の発生源 を特定します。
- 障害コード が
messaging.adaptors.http.flow.DecompressionFailureAtRequestで、 障害の発生源 の値がpolicyまたはproxyの場合、クライアント アプリケーションから送信されたリクエストに、リクエスト ヘッダーContent-Encodingで指定された サポート対象のエンコードと一致しないペイロードが含まれていることを示します。 次のいずれかの方法で、HTTP リクエストの一部として不一致を特定できます。 メソッド:
エラー メッセージ
エラー メッセージを使用して検証するには:
-
Apigee Edge から受信した完全なエラー メッセージにアクセスできる場合は、
faultstringを参照してください。エラー メッセージの例:
"faultstring":"Decompression failure at request"
- 上記のエラー メッセージには
"Decompression failure at request"と表示されています。これは、リクエスト を解凍できなかったことを意味します。 ヘッダーで指定されたエンコードを使用してContent-Encoding
トレース
トレースを使用して検証するには:
- 共通の診断手順で説明されているように、Trace を使用してリクエスト ヘッダー Content-Encoding とプロパティ error.cause の値を特定します。
トレース例の値は次のとおりです。
- Content-Encoding:
gzip - error.cause:
Not in GZIP format
リクエスト ヘッダー Content-Encoding の値は gzipですが、リクエスト ペイロードは GZIP 形式ではありません(error.cause で示されています)。そのため、Apigee Edge は
400 Bad Requestとエラーコードmessaging.adaptors.http.flow.DecompressionFailureAtRequestで応答します。- Content-Encoding:
実際のリクエスト
実際のリクエストを使用して検証するには:
クライアント アプリケーションから送信された実際のリクエストにアクセスできる場合は、次の手順を行います。
- リクエスト ヘッダー
Content-Encodingに渡された値を特定します。 - リクエストの一部として送信されるペイロードの形式を特定します。
Content-Encodingヘッダーの値が サポートされているエンコードのリストに含まれていても、リクエスト ペイロードの形式がContent-Encodingヘッダーで指定されたエンコードと一致 しない場合、 それが問題の原因です。リクエスト例:
curl -v "http://HOSTALIAS/v1/testgzip"
-H "Content-Encoding: gzip"-X POST -d @request_payload.zip上記のリクエスト例では、値
gzipがContent-Encodingヘッダーに送信されます。これは、 サポートされているエンコード です。ただし、リクエスト ペイロードrequest_payload.zipは ZIP 形式です。そのため、このリクエストは400 Bad Requestステータス コードとエラーコードmessaging.adaptors.http.flow.DecompressionFailureAtRequestで失敗します。
Message Processor ログ
Message Processor ログを使用して検証するには:
Private Cloud ユーザーの場合は、Message Processor ログ を使用して HTTP
400エラーに関する重要な情報を特定できます。- 共通の診断手順で説明されているように、API Monitoring、Trace ツール、 または NGINX アクセスログを使用して、失敗したリクエストのメッセージ ID を特定します。
Message Processor ログでメッセージ ID を検索します。
/opt/apigee/var/log/edge-message-processor/logs/system.log次のいずれかの例外が表示されます。
シナリオ #1
シナリオ #1: API リクエストにヘッダー Content-Encoding: gzip がある場合
2021-07-28 10:21:16,861 NIOThread@0 ERROR HTTP.SERVER - HTTPServer$Context.onInputException() : Message id:rt-57-1 SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.80.234:44284]@28469 useCount=1 bytesRead=0 bytesWritten=28764 age=2739893ms lastIO=0ms isOpen=true.onExceptionRead exception: {} java.util.zip.ZipException: Not in GZIP format 2021-07-28 10:21:16,862 NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:POST, uri:/test, message Id:rt-57-1, exception:java.util.zip.ZipException: Not in GZIP format, context:Context@71ea5ac input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.80.234:44284]@28469 useCount=1 bytesRead=0 bytesWritten=28764 age=2739894ms lastIO=0ms isOpen=true) 2021-07-28 10:21:16,862 NIOThread@0 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exceptionjava.util.zip.ZipException: Not in GZIP formatoccurred while writing to channel null 2021-07-28 10:21:16,863 NIOThread@0 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception trace: java.util.zip.ZipException: Not in GZIP format上記のエラー メッセージの行
java.util.zip.ZipException: Not in GZIP formatは、リクエスト ペイロードが GZIP 形式で送信されていないことを示しています。ただし、Content-Encodingは gzip として指定されています。そのため、Apigee Edge は例外をスローし、 障害コードmessaging.adaptors.http.flow.DecompressionFailureAtRequestを含む400ステータス コードをクライアント アプリケーションに返します。シナリオ #2
シナリオ #2: API リクエストにヘッダー Content-Encoding: deflate がある場合
2021-07-28 15:26:31,893 NIOThread@1 ERROR HTTP.SERVER - HTTPServer$Context.onInputException() : Message id:rt-47875-1 SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.81.72:45954]@29276 useCount=1 bytesRead=0 bytesWritten=37230 age=3498856ms lastIO=1ms isOpen=true.onExceptionRead exception: {}java.util.zip.ZipException: incorrect header check….Caused by: java.util.zip.DataFormatException: incorrect header check.. 2021-07-28 15:26:31,894 NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:POST, uri:/test, message Id:rrt-47875-1, exception:java.util.zip.ZipException: incorrect header check, context:Context@69b3ac45 input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.81.72:45954]@29276 useCount=1 byt esRead=0 bytesWritten=37230 age=3498856ms lastIO=1ms isOpen=true)上記のエラー メッセージの行
java.util.zip.ZipException: incorrect header checkとCaused by: java.util.zip.DataFormatException: incorrect header checkは、リクエスト ペイロードが deflate 形式で送信されておらず、deflate のContent-Encodingヘッダーで指定されたエンコードと一致していないことを示しています。そのため、Apigee Edge は例外をスローし、障害コードmessaging.adaptors.http.flow.DecompressionFailureAtRequestを含む400ステータス コードをクライアント アプリケーションに返します。
-
解決策
- Apigee Edge とバックエンド サーバーの API プロキシ フローで圧縮されたリクエスト ペイロードが必要ない場合は、渡さないでください。
Content-Encodingリクエスト ペイロードを圧縮する必要がある場合は、ステップ 2 に進みます。 - クライアント アプリケーションが常に次のものを送信するようにします。
- リクエストの
`Content-Encoding` ヘッダーの値として、サポートされているエンコードのいずれか
Content-Encoding - サポートされている形式のリクエスト ペイロードが、Apigee Edge のエンコード
形式と
Content-Encodingヘッダーで一致している
- リクエストの
`Content-Encoding` ヘッダーの値として、サポートされているエンコードのいずれか
- 上記で説明した例では、リクエスト ペイロードは ZIP 形式ですが、リクエスト ヘッダー
は
Content-Encoding: gzipを指定しています。リクエスト ヘッダーをContent-Encoding: gzipとして送信し、リクエスト ペイロードもgzip形式で送信することで、問題を解決できます。curl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.gz
仕様
Apigee Edge は、次の RFC 仕様に従って、エラーコード
messaging.adaptors.http.flow.DecompressionFailureAtRequest を含むステータス コード 400 Bad Request で応答します。
| 仕様 |
|---|
| RFC 7231、セクション 6.5.1 |
| RFC 7231、セクション 3.1.2.2 |
Apigee サポートのサポートが必要な場合は、 診断情報の収集が必要な場合をご覧ください。
診断情報の収集が必要な場合
次の診断情報を収集して、Apigee Edge サポートにお問い合わせください。
Public Cloud ユーザーの場合は、次の情報を提供してください。
- 組織名
- 環境名
- API プロキシ名
400エラーを再現するために使用した完全なcurlコマンド- API リクエストのトレース ファイル
Private Cloud ユーザーの場合は、次の情報を提供してください。
- 失敗したリクエストで確認された完全なエラー メッセージ
- 環境名
- API プロキシ バンドル
- API リクエストのトレース ファイル
NGINX アクセスログ
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logここで: ORG、ENV、PORT# は実際の値に置き換えてください。
- Message Processor システムログ
/opt/apigee/var/log/edge-message-processor/logs/system.log