v0.1.35: resolveProtocol — query-mode клиенты парсят JSON-ответы (эмпирика), ошибки AWS-JSON __type
This commit is contained in:
+10
-12
@@ -262,19 +262,17 @@ func extractAction(req *http.Request) string {
|
||||
// resolveProtocol — определяет протокол ОТВЕТА по заголовкам запроса.
|
||||
//
|
||||
// Логическая схема:
|
||||
// 1. Заголовок x-amzn-query-mode: true (шлют AWS CLI v2 и boto3) означает
|
||||
// «query-compatible JSON»: тело запроса сериализовано как JSON, но клиент
|
||||
// ЖДЁТ ответ в XML (query-протокол). Если на такой запрос ответить JSON —
|
||||
// botocore не распарсит тело ошибки (ClientError с Code=None — именно это
|
||||
// наблюдалось: «сырые 400/404» без AWS-XML). Поэтому для query-mode
|
||||
// принудительно отвечаем XML.
|
||||
// 2. Content-Type: application/x-amz-json-1.0 БЕЗ query-mode — чистый
|
||||
// JSON-протокол (SDK): и запрос, и ответ в JSON.
|
||||
// 3. Всё остальное (form-urlencoded от старых клиентов) — query/XML.
|
||||
// 1. Content-Type: application/x-amz-json-1.0 → JSON-протокол (ответ JSON).
|
||||
// Сюда входят: чистые JSON-клиенты (SDK) И AWS CLI v2/boto3 в режиме
|
||||
// «query-compatible JSON» (x-amzn-query-mode: true). ВАЖНО (эмпирика):
|
||||
// query-mode клиент парсит именно JSON-ответы — при XML-ответе список
|
||||
// очередей распознаётся как пустой (None), при JSON — корректно.
|
||||
// 2. Всё остальное (form-urlencoded от классических клиентов) — query/XML.
|
||||
//
|
||||
// Ошибки в JSON-протоколе оформляются как {"__type":"...","message":"..."}
|
||||
// (см. encodeResponse) — только такой формат botocore распознаёт как ошибку
|
||||
// с кодом (раньше отдавался голый ErrorResult → Code=None).
|
||||
func resolveProtocol(req *http.Request) AwsProtocol {
|
||||
if req.Header.Get("x-amzn-query-mode") == "true" {
|
||||
return AwsQueryProtocol
|
||||
}
|
||||
if req.Header.Get("Content-Type") == "application/x-amz-json-1.0" {
|
||||
return AwsJsonProtocol
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user