blob: 78b8bf6ef2f48062a67cf07fffc14fe09a0f2ff0 [file] [log] [blame]
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Response consume</title>
<meta name="help" href="https://fetch.spec.whatwg.org/#response">
<meta name="help" href="https://fetch.spec.whatwg.org/#body-mixin">
<meta name="author" title="Canon Research France" href="https://www.crf.canon.fr">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../resources/utils.js"></script>
</head>
<body>
<script>
function responsePromise(body, responseInit) {
return new Promise(function(resolve, reject) {
resolve(new Response(body, responseInit));
});
}
function responseStringToMultipartFormTextData(response, name, value) {
assert_true(response.headers.has("Content-Type"), "Response contains Content-Type header");
var boundaryMatches = response.headers.get("Content-Type").match(/;\s*boundary=("?)([^";\s]*)\1/);
assert_true(!!boundaryMatches, "Response contains boundary parameter");
return stringToMultipartFormTextData(boundaryMatches[2], name, value);
}
function streamResponsePromise(streamData, responseInit) {
return new Promise(function(resolve, reject) {
var stream = new ReadableStream({
start: function(controller) {
controller.enqueue(stringToArray(streamData));
controller.close();
}
});
resolve(new Response(stream, responseInit));
});
}
function stringToMultipartFormTextData(multipartBoundary, name, value) {
return ('--' + multipartBoundary + '\r\n' +
'Content-Disposition: form-data;name="' + name + '"\r\n' +
'\r\n' +
value + '\r\n' +
'--' + multipartBoundary + '--\r\n');
}
function checkBodyText(test, response, expectedBody) {
return response.text().then( function(bodyAsText) {
assert_equals(bodyAsText, expectedBody, "Retrieve and verify response's body");
assert_true(response.bodyUsed, "body as text: bodyUsed turned true");
});
}
function checkBodyArrayBuffer(test, response, expectedBody) {
return response.arrayBuffer().then( function(bodyAsArrayBuffer) {
validateBufferFromString(bodyAsArrayBuffer, expectedBody, "Retrieve and verify response's body");
assert_true(response.bodyUsed, "body as arrayBuffer: bodyUsed turned true");
});
}
function checkBodyJSON(test, response, expectedBody) {
return response.json().then(function(bodyAsJSON) {
var strBody = JSON.stringify(bodyAsJSON)
assert_equals(strBody, expectedBody, "Retrieve and verify response's body");
assert_true(response.bodyUsed, "body as json: bodyUsed turned true");
});
}
function checkResponseBody(responsePromise, expectedBody, checkFunction, bodyTypes) {
promise_test(function(test) {
return responsePromise.then(function(response) {
assert_false(response.bodyUsed, "bodyUsed is false at init");
return checkFunction(test, response, expectedBody);
});
}, "Consume response's body: " + bodyTypes);
}
var textData = JSON.stringify("This is response's body");
var textResponseInit = { "headers": [["Content-Type", "text/PLAIN"]] };
var multipartBoundary = "boundary-" + Math.random();
var formTextResponseInit = { "headers": [["Content-Type", 'multipart/FORM-data; boundary="' + multipartBoundary + '"']] };
var formTextData = stringToMultipartFormTextData(multipartBoundary, "name", textData);
checkResponseBody(responsePromise(textData, textResponseInit), textData, checkBodyText, "from text to text");
checkResponseBody(responsePromise(textData, textResponseInit), textData, checkBodyArrayBuffer, "from text to arrayBuffer");
checkResponseBody(responsePromise(textData, textResponseInit), textData, checkBodyJSON, "from text to json");
checkResponseBody(streamResponsePromise(textData), textData, checkBodyText, "from stream to text");
checkResponseBody(streamResponsePromise(textData), textData, checkBodyArrayBuffer, "from stream to arrayBuffer");
checkResponseBody(streamResponsePromise(textData), textData, checkBodyJSON, "from stream to json");
checkResponseBody(fetch("../resources/top.txt"), "top", checkBodyText, "from fetch to text");
checkResponseBody(fetch("../resources/top.txt"), "top", checkBodyArrayBuffer, "from fetch to arrayBuffer");
</script>
</body>
</html>