Apigee Edge 문서를 보고 있습니다.
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 RFC1952 GZIP 형식을 참고하세요. |
| 단일 인코딩 | deflate | 이 형식은 deflate 압축 알고리즘과 함께 |
| 다중 인코딩 | 다중 인코딩 예를 들어 인코딩이 두 번 실행되는 경우 다음과 같을 수 있습니다.
|
헤더에 표시된 순서대로 페이로드에 적용된 여러 인코딩입니다. |
이 오류의 가능한 원인은 다음과 같습니다.
| 원인 | 설명 | 다음에 관한 문제 해결 안내 |
|---|---|---|
| 요청 페이로드 형식이 Content-Encoding 헤더에 지정된 인코딩과 일치하지 않습니다. | 클라이언트에서 전송한 요청 페이로드의 형식이 인코딩되지 않았거나 Content-Encoding 헤더에 지정된 인코딩과 일치하지 않습니다. |
Edge Public 및 Private Cloud 사용자 |
일반적인 진단 단계
다음 도구/기법 중 하나를 사용하여 이 오류를 진단하세요.
API 모니터링
API 모니터링을 사용하여 오류를 진단하려면 다음 단계를 따르세요.
- 적절한 역할이 있는 사용자로 Apigee Edge UI에 로그인합니다.
문제를 조사하려는 조직으로 전환합니다.
- 분석 > API 모니터링 > 조사 페이지로 이동합니다.
- 오류가 발생한 구체적인 기간을 선택합니다.
- 프록시 필터가 모두로 설정되어 있는지 확인합니다.
- 시간에 대한 오류 코드를 표시합니다.
아래와 같이 오류 코드
messaging.adaptors.http.flow.DecompressionFailureAtRequest가 있는 셀을 선택합니다.( 큰 이미지 보기)
결함 코드
messaging.adaptors.http.flow.DecompressionFailureAtRequest에 관한 정보가 아래와 같이 표시됩니다.( 큰 이미지 보기)
로그 보기를 클릭하고
400오류로 실패한 행을 펼칩니다.( 큰 이미지 보기)
- 로그 창에서 다음 세부정보를 확인합니다.
- 상태 코드:
400 - 결함 소스:
proxy - 오류 코드:
messaging.adaptors.http.flow.DecompressionFailureAtRequest
- 상태 코드:
- Fault Source에
proxy값이 있으면 요청 페이로드 형식이Content-Encoding헤더에 지정된 지원되는 인코딩과 일치하지 않음을 나타냅니다.
추적 도구
Trace 도구를 사용하여 오류를 진단하려면 다음 단계를 따르세요.
- 추적 세션을 사용 설정하고 다음 중 하나를 사용합니다.
400 Bad Request오류가 발생할 때까지 기다리거나- 문제를 재현할 수 있는 경우 API를 호출하고
400 Bad Request를 재현합니다.
모든 FlowInfo 표시가 사용 설정되어 있는지 확인합니다.
- 실패한 요청 중 하나를 선택하고 트레이스를 검사합니다.
- 트레이스의 여러 단계를 탐색하여 실패가 발생한 위치를 찾습니다.
일반적으로 아래와 같이 클라이언트에서 요청 수신됨 단계 바로 뒤의 흐름에서 오류가 발생합니다.
( 큰 이미지 보기)
-
트레이스에서 속성 값을 확인합니다.
- 오류:
Decompression failure at request - error.class:
com.apigee.rest.framework.BadRequestException - error.cause:
Not in GZIP format
error.cause는 요청 페이로드가 GZIP 형식이 아님을 나타냅니다. 이는 Apigee Edge가
Content-Encoding헤더에 지정된 대로 요청 페이로드가 GZIP 형식일 것으로 예상했음을 의미합니다. - 오류:
요청 헤더
Content-Encoding의 값을 확인합니다. 이를 위해 아래와 같이 클라이언트로부터 요청 수신됨 단계로 이동합니다.( 큰 이미지 보기)
요청 헤더
Content-Encoding의 값이 실제로gzip입니다.위 샘플 트레이스에서는 요청 헤더
Content-Encoding에 지정된 인코딩이gzip이지만 요청 페이로드가 GZIP 형식이 아님을 보여줍니다. 따라서 Apigee는 gzip을 사용하여 페이로드를 압축 해제할 수 없으며Decompression failure at request오류를 반환합니다.- 다음으로 이동하여 Apigee Edge에서 반환된 상태 코드와 오류 메시지를 확인합니다.
아래와 같이 추적의 클라이언트에 전송된 응답 단계로 이동합니다.
( 큰 이미지 보기)
트레이스에서 다음 세부정보를 확인하세요.
- 상태 코드:
400 Bad Request - 오류 콘텐츠:
{"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
- 상태 코드:
트레이스에서 AX (분석 데이터 기록됨) 단계로 이동하여 클릭합니다.
- 단계 세부정보, 오류 헤더 섹션까지 아래로 스크롤하여 아래와 같이 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 액세스 로그를 사용하여 오류를 진단하려면 다음 단계를 따르세요.
- 비공개 클라우드 사용자인 경우 NGINX 액세스 로그를 사용하여 HTTP
400오류에 관한 주요 정보를 확인할 수 있습니다. NGINX 액세스 로그를 확인합니다.
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log여기서: ORG, ENV, PORT#은 실제 값으로 대체됩니다.
- 특정 기간 동안
400오류가 있는지(문제가 과거에 발생한 경우) 또는400로 인해 여전히 실패하는 요청이 있는지 검색합니다. messaging.adaptors.http.flow.DecompressionFailureAtRequest값과 일치하는 X-Apigee-fault-code가 있는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 헤더에 지정된 인코딩과 일치하지 않습니다.
기본적으로 Apigee Edge는 요청 헤더 Content-Encoding에 유효하고
지원되는 인코딩이 포함된 경우 항상 페이로드를 압축 해제합니다. 따라서 요청 페이로드의 형식은 요청 헤더 Content-Encoding에 지정된 인코딩과 일치해야 합니다.
불일치가 있으면 이 오류가 표시됩니다.
진단
- 일반적인 진단 단계에 설명된 대로 API 모니터링, 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헤더에 지정된 인코딩을 사용하여 request를 압축 해제할 수 없음을 나타냅니다.
Trace
Trace를 사용하여 검증하려면 다음 단계를 따르세요.
- 일반적인 진단 단계에 설명된 대로 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위 샘플 요청은 Apigee Edge에서 지원되는 인코딩인
Content-Encoding헤더에gzip값을 전송합니다. 하지만 요청 페이로드request_payload.zip는 ZIP 형식입니다. 따라서 이 요청은400 Bad Request상태 코드와 오류 코드messaging.adaptors.http.flow.DecompressionFailureAtRequest로 인해 실패합니다.
메시지 프로세서 로그
메시지 프로세서 로그를 사용하여 유효성을 검사하려면 다음 단계를 따르세요.
프라이빗 클라우드 사용자인 경우 메시지 프로세서 로그를 사용하여 HTTP
400오류에 관한 주요 정보를 확인할 수 있습니다.- 일반적인 진단 단계에 설명된 대로 API 모니터링, Trace 도구 또는 NGINX 액세스 로그를 사용하여 실패한 요청의 메시지 ID를 확인합니다.
메시지 프로세서 로그에서 메시지 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줄은Content-Encoding이 gzip으로 지정되었지만 요청 페이로드가 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헤더 값으로 지원되는 인코딩 중 하나 - Apigee Edge에 대한 요청 페이로드가 지원되는 형식이며
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 요청의 추적 파일
프라이빗 클라우드 사용자인 경우 다음 정보를 제공하세요.
- 실패한 요청에 대해 확인된 전체 오류 메시지
- 환경 이름
- API 프록시 번들
- API 요청의 추적 파일
NGINX 액세스 로그
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log위치: ORG, ENV, PORT#이 실제 값으로 대체됩니다.
- 메시지 프로세서 시스템 로그
/opt/apigee/var/log/edge-message-processor/logs/system.log