Skip to content

Commit ae66fe5

Browse files
authored
Merge pull request #14006 from rouault/vsis3_error_msg
/vsis3/: add compatibility for XML <Error> responses without <Message>
2 parents e638d60 + 9014804 commit ae66fe5

File tree

2 files changed

+63
-10
lines changed

2 files changed

+63
-10
lines changed

autotest/gcore/vsis3.py

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -914,7 +914,7 @@ def method_req_1(self, request):
914914
request.send_response(307)
915915
response = """<?xml version="1.0" encoding="UTF-8"?>
916916
<Error>
917-
<Message>bla</Message>
917+
<!-- no <Message> to test compatibility with OpenStack Swift on CloudFerro -->
918918
<Code>TemporaryRedirect</Code>
919919
<Endpoint>localhost:%d</Endpoint>
920920
</Error>""" % request.server.port
@@ -984,6 +984,46 @@ def method_req_2(self, request):
984984
assert data == "bar"
985985

986986

987+
###############################################################################
988+
989+
990+
@pytest.mark.parametrize("with_error_message", [True, False])
991+
def test_vsis3_request_timeout(aws_test_config, webserver_port, with_error_message):
992+
gdal.VSICurlClearCache()
993+
994+
error_msg = "<Message>message</Message>" if with_error_message else ""
995+
996+
handler = webserver.SequentialHandler()
997+
handler.add(
998+
"GET",
999+
"/test_vsis3_request_timeout/?delimiter=%2F&list-type=2",
1000+
400,
1001+
{"Content-type": "application/xml"},
1002+
f"""<?xml version="1.0" encoding="UTF-8"?>
1003+
<Error>{error_msg}
1004+
<Code>RequestTimeout</Code>
1005+
</Error>""",
1006+
)
1007+
handler.add(
1008+
"GET",
1009+
"/test_vsis3_request_timeout/?delimiter=%2F&list-type=2",
1010+
200,
1011+
{"Content-type": "application/xml"},
1012+
"""<?xml version="1.0" encoding="UTF-8"?>
1013+
<ListBucketResult>
1014+
<Prefix></Prefix>
1015+
<Contents>
1016+
<Key>test.bin</Key>
1017+
<LastModified>1970-01-01T00:00:01.000Z</LastModified>
1018+
<Size>123456</Size>
1019+
</Contents>
1020+
</ListBucketResult>""",
1021+
)
1022+
with webserver.install_http_handler(handler):
1023+
with gdal.VSIFile("/vsis3/test_vsis3_request_timeout/test.bin", "rb"):
1024+
pass
1025+
1026+
9871027
###############################################################################
9881028
# Test re-opening after changing configuration option (#2294)
9891029

@@ -1169,9 +1209,13 @@ def method(request):
11691209
)
11701210

11711211
with webserver.install_http_handler(handler):
1172-
f = open_for_read(
1173-
"/vsis3/s3_fake_bucket2/a_dir with_space/resource3 with_space.bin"
1174-
)
1212+
with gdaltest.error_raised(
1213+
gdal.CE_Warning,
1214+
match="Ignoring key 'a_dir with_space/../../not_ok' that has a path traversal pattern",
1215+
):
1216+
f = open_for_read(
1217+
"/vsis3/s3_fake_bucket2/a_dir with_space/resource3 with_space.bin"
1218+
)
11751219
if f is None:
11761220
pytest.fail()
11771221
gdal.VSIFCloseL(f)

port/cpl_aws.cpp

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2761,17 +2761,26 @@ bool VSIS3HandleHelper::CanRestartOnError(const char *pszErrorMsg,
27612761
return true;
27622762
}
27632763

2764+
if (EQUAL(pszCode, "RequestTimeout"))
2765+
{
2766+
const char *pszMessage =
2767+
CPLGetXMLValue(psTree, "=Error.Message", nullptr);
2768+
if (pszMessage != nullptr)
2769+
CPLDebug("S3", "Request Timeout: %s", pszMessage);
2770+
2771+
CPLDestroyXMLNode(psTree);
2772+
return true;
2773+
}
2774+
27642775
if (bSetError)
27652776
{
27662777
// Translate AWS errors into VSI errors.
2778+
27672779
const char *pszMessage =
2768-
CPLGetXMLValue(psTree, "=Error.Message", nullptr);
2780+
CPLGetXMLValue(psTree, "=Error.Message", pszErrorMsg);
2781+
// Some S3 implementations (e.g. OpenStack) skip the Message part
27692782

2770-
if (pszMessage == nullptr)
2771-
{
2772-
VSIError(VSIE_ObjectStorageGenericError, "%s", pszErrorMsg);
2773-
}
2774-
else if (EQUAL(pszCode, "AccessDenied"))
2783+
if (EQUAL(pszCode, "AccessDenied"))
27752784
{
27762785
VSIError(VSIE_AccessDenied, "%s", pszMessage);
27772786
}

0 commit comments

Comments
 (0)