<ph type="x-smartling-placeholder"></ph>
現在、Apigee Edge のドキュメントが表示されています。
Apigee X のドキュメント。 詳細
症状
クライアント アプリケーションが HTTP ステータス コードと 400 Bad Request エラーコードを取得する
messaging.adaptors.http.flow.DecompressionFailureAtRequest (API へのレスポンス)
できます。
エラー メッセージ
クライアント アプリケーションが次のレスポンス コードを受け取ります。
HTTP/1.1 400 Bad Request
また、次のようなエラー メッセージが表示される場合があります。
{
"fault":{
"faultstring":"Decompression failure at request",
"detail":{
"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"
}
}
}考えられる原因
このエラーは、次の場合にのみ発生します。
- HTTP リクエスト ヘッダー
Content-Encodingで指定されたエンコード 有効であり、 <ph type="x-smartling-placeholder"></ph> Apigee Edge でサポートされている - HTTP リクエストの一部としてクライアントによって送信されるペイロード形式は、
Content-Encodingヘッダーで指定されたエンコード形式と一致している
ただし
これは Apigee Edge が、指定されたエンコードを使用してペイロードをデコードできないためです。これは、
ペイロードの形式が、
Content-Encoding ヘッダー。
サポートされている Content-Encoding値の例と Apigee Edge が、
では、次の場合のペイロード形式が想定されます。
| シナリオ | Content-Encoding | 想定されるペイロード形式 |
|---|---|---|
| 単一エンコード | gzip | Unix 詳しくは、 <ph type="x-smartling-placeholder"></ph> RFC1952 GZIP 形式。 |
| 単一エンコード | Deflate | この形式は、deflate 圧縮アルゴリズムを使用した <ph type="x-smartling-placeholder"></ph>をご覧ください。
RFC1950 および
<ph type="x-smartling-placeholder"></ph>
RFC1951 |
| 複数のエンコード | 複数のエンコード たとえば、エンコードが 2 回行われる場合は、次のようになります。
|
ヘッダーに記述されている順序に従って、ペイロードに複数のエンコードが適用されます。 |
このエラーには、次の原因が考えられます。
| 原因 | 説明 | トラブルシューティングの実施対象 |
|---|---|---|
| <ph type="x-smartling-placeholder"></ph> リクエストのペイロードの形式が、Content-Encoding ヘッダーで指定されたエンコードと一致しません | クライアントから送信されたリクエスト ペイロードの形式がエンコードされていないか、エンコードされていません。
Content-Encoding ヘッダーで指定されたエンコードと一致している。 |
Edge Public Cloud ユーザーと Edge Private Cloud ユーザー |
共通の診断手順
このエラーを診断するには、次のいずれかのツールまたは手法を使用します。
API Monitoring
<ph type="x-smartling-placeholder">API Monitoring を使用してエラーを診断するには:
- <ph type="x-smartling-placeholder"></ph> Apigee Edge UI にログインするユーザーとして、 付与します。
問題を調査する組織に切り替えます。
- [Analyze] >API モニタリング >Investigate ページをご覧ください。
- エラーが発生した期間を選択します。
- [プロキシ] フィルタが [すべて] に設定されていることを確認します。
- 障害コードを Time に対してプロットします。
障害コード
messaging.adaptors.http.flow.DecompressionFailureAtRequestを持つセルを選択します。 下に示します。( 拡大画像を表示)
障害コードに関する情報
messaging.adaptors.http.flow.DecompressionFailureAtRequestは次のように表示されます。( 拡大画像を表示)
[ログを表示] をクリックし、
400エラーで失敗した行を開きます。( 拡大画像を表示)
- [ログ] ウィンドウで、次の詳細をメモします。
<ph type="x-smartling-placeholder">
- </ph>
- ステータス コード:
400 - 障害の発生元:
proxy - 障害コード:
messaging.adaptors.http.flow.DecompressionFailureAtRequest
- ステータス コード:
- [Fault Source] の値が
proxyの場合、 リクエストのペイロード形式が <ph type="x-smartling-placeholder"></ph>Content-Encodingヘッダーで指定されたサポートされているエンコード。
Trace ツール
<ph type="x-smartling-placeholder">Trace ツールを使用してエラーを診断するには:
- トレース セッションを有効にする
および次のいずれかです。
<ph type="x-smartling-placeholder">
- </ph>
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を返します。- 次に移動して、Apigee Edge から返されたステータス コードとエラー メッセージをメモします。
以下に示すように、トレースの Response Sent to Client フェーズにレスポンスを送信
( 拡大画像を表示)
トレースの次の詳細に注意してください。
- ステータス コード:
400 Bad Request。 - エラーの内容:
{"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
- ステータス コード:
トレースの AXAX(Analytics Data Recorded)フェーズに移動します。 クリックします。
- [Phase Details]、[Error Headers] セクションまで下にスクロールし、
X-Apigee-fault-codeX-Apigee-fault-code と X-Apigee-fault-sourceX-Apigee-fault-code の値を確認します。
次のように指定します。
( 拡大画像を表示)
- 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
<ph type="x-smartling-placeholder">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 で
400エラーが見つかった場合 値messaging.adaptors.http.flow.DecompressionFailureAtRequestと一致し、 次に、X-Apigee-fault-source. の値を確認します。NGINX アクセスログの 400 エラーの例:
NGINX アクセスログの上記のサンプル エントリには、次の値が含まれます。 X-Apigee-fault-code と X-Apigee-fault-code
レスポンス ヘッダー 値 X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequestX-Apigee-fault-source policy
原因: リクエストのペイロード形式が、指定されたエンコードと一致していない Content-Encoding ヘッダー内
デフォルトでは、Apigee Edge はリクエスト ヘッダーに
Content-Encoding には、有効なフィールドと
<ph type="x-smartling-placeholder"></ph>
エンコード方式をご覧ください。そのため、リクエスト ペイロードの形式は
リクエスト ヘッダー Content-Encoding で指定されたエンコードと一致する必要があります。
不一致がある場合は、このエラーが発生します。
診断
- API を使用して、観測されたエラーの障害コードと障害ソースを特定します。 Monitoring、Trace ツール、または NGINX アクセスログ( 一般的な診断手順。
- 障害コードが
messaging.adaptors.http.flow.DecompressionFailureAtRequestおよび [Fault Source] の値がpolicyまたはproxyの場合、 は、クライアント アプリケーションから送信されたリクエストのペイロードが サポートされているエンコードがリクエスト ヘッダーContent-Encodingで指定されます。 次のいずれかの方法で、HTTP リクエストの一部として不一致を判断できます。 メソッド:
エラー メッセージ
エラー メッセージを使用して検証するには:
-
Apigee Edge から受信した完全なエラー メッセージにアクセスできる場合は、
faultstringをご覧ください。エラー メッセージの例:
"faultstring":"Decompression failure at request"
- 上記のエラー メッセージでは、
"Decompression failure at request"。これは、リクエストが 指定されたエンコードで圧縮解除できませんでした。Content-Encodingヘッダー。
トレース
Trace を使用して検証するには:
- リクエスト ヘッダー Content-Encoding の値と、 Trace を使用した 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ヘッダーの値が次のリストにある場合: <ph type="x-smartling-placeholder"></ph> サポートされているエンコードですが、リクエスト ペイロードの形式はContent-Encodingヘッダーで指定されたエンコードと一致している。 それが問題の原因ですリクエストの例:
curl -v "http://HOSTALIAS/v1/testgzip"
-H "Content-Encoding: gzip"-X POST -d @request_payload.zip上記のサンプル リクエストでは、値
gzipがContent-Encodingヘッダーは、 <ph type="x-smartling-placeholder"></ph> サポートされているエンコードをご確認ください。ただし、リクエスト ペイロードはrequest_payload.zipは ZIP 形式です。そのためこのリクエストは400 Bad Requestステータス コードとエラーコードで失敗します。messaging.adaptors.http.flow.DecompressionFailureAtRequest。
Message Processor のログ
<ph type="x-smartling-placeholder">Message Processor ログを使用して検証するには:
Private Cloud ユーザーは、Message Processor のログを使用できます。 HTTP
400エラーに関する重要な情報を確認します。- 失敗したリクエストのメッセージ ID を、API Monitoring、Trace ツール、 または NGINX アクセスログを作成する必要があります。詳しくは、一般的な診断手順をご覧ください。
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-Encodinggzip として指定されます。Apigee Edge は例外をスローし、400ステータス コードと障害コードを返すmessaging.adaptors.http.flow.DecompressionFailureAtRequestクライアントアプリケーションに提供しますシナリオ #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 は 例外がスローされ、次を含む400ステータス コードが返されます。 障害コードmessaging.adaptors.http.flow.DecompressionFailureAtRequestクライアントアプリケーションに提供します
-
解決策
- Apigee Edge の API プロキシフローで圧縮リクエスト ペイロードが必要ない場合
バックエンド サーバーでは、ヘッダー
Content-Encodingを渡さないでください。 リクエスト ペイロードを圧縮する必要がある場合は、ステップ 2 に進みます。 - クライアント アプリケーションが常に以下を送信するようにします。
<ph type="x-smartling-placeholder">
- </ph>
- 次のいずれか
<ph type="x-smartling-placeholder"></ph>
サポートされているエンコードを
Content-Encodingヘッダーの値として リクエスト - Apigee Edge へのサポートされている形式のリクエスト ペイロードがエンコードと一致している
Content-Encodingヘッダーで指定された形式
- 次のいずれか
<ph type="x-smartling-placeholder"></ph>
サポートされているエンコードを
- 上記の例では、リクエストのペイロードは ZIP 形式ですが、リクエスト ヘッダーは
Content-Encoding: gzipを指定します。この問題を解決するには、 ヘッダーをContent-Encoding: gzipとして指定し、リクエスト ペイロードもgzipに含めます。 形式: <ph type="x-smartling-placeholder">curl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.gz
仕様
Apigee Edge は、ステータス コード 400 Bad Request とエラーコードを返します。
次の RFC に基づく messaging.adaptors.http.flow.DecompressionFailureAtRequest
仕様:
| 仕様 |
|---|
| <ph type="x-smartling-placeholder"></ph> RFC 7231、セクション 6.5.1 |
| <ph type="x-smartling-placeholder"></ph> 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