(fetchParams)
| 13776 | } |
| 13777 | __name(mainFetch, "mainFetch"); |
| 13778 | function schemeFetch(fetchParams) { |
| 13779 | if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) { |
| 13780 | return Promise.resolve(makeAppropriateNetworkError(fetchParams)); |
| 13781 | } |
| 13782 | const { request } = fetchParams; |
| 13783 | const { protocol: scheme } = requestCurrentURL(request); |
| 13784 | switch (scheme) { |
| 13785 | case "about:": { |
| 13786 | return Promise.resolve(makeNetworkError("about scheme is not supported")); |
| 13787 | } |
| 13788 | case "blob:": { |
| 13789 | if (!resolveObjectURL) { |
| 13790 | resolveObjectURL = require("node:buffer").resolveObjectURL; |
| 13791 | } |
| 13792 | const blobURLEntry = requestCurrentURL(request); |
| 13793 | if (blobURLEntry.search.length !== 0) { |
| 13794 | return Promise.resolve(makeNetworkError("NetworkError when attempting to fetch resource.")); |
| 13795 | } |
| 13796 | const blob = resolveObjectURL(blobURLEntry.toString()); |
| 13797 | if (request.method !== "GET" || !webidl.is.Blob(blob)) { |
| 13798 | return Promise.resolve(makeNetworkError("invalid method")); |
| 13799 | } |
| 13800 | const response = makeResponse(); |
| 13801 | const fullLength = blob.size; |
| 13802 | const serializedFullLength = isomorphicEncode(`${fullLength}`); |
| 13803 | const type = blob.type; |
| 13804 | if (!request.headersList.contains("range", true)) { |
| 13805 | const bodyWithType = extractBody(blob); |
| 13806 | response.statusText = "OK"; |
| 13807 | response.body = bodyWithType[0]; |
| 13808 | response.headersList.set("content-length", serializedFullLength, true); |
| 13809 | response.headersList.set("content-type", type, true); |
| 13810 | } else { |
| 13811 | response.rangeRequested = true; |
| 13812 | const rangeHeader = request.headersList.get("range", true); |
| 13813 | const rangeValue = simpleRangeHeaderValue(rangeHeader, true); |
| 13814 | if (rangeValue === "failure") { |
| 13815 | return Promise.resolve(makeNetworkError("failed to fetch the data URL")); |
| 13816 | } |
| 13817 | let { rangeStartValue: rangeStart, rangeEndValue: rangeEnd } = rangeValue; |
| 13818 | if (rangeStart === null) { |
| 13819 | rangeStart = fullLength - rangeEnd; |
| 13820 | rangeEnd = rangeStart + rangeEnd - 1; |
| 13821 | } else { |
| 13822 | if (rangeStart >= fullLength) { |
| 13823 | return Promise.resolve(makeNetworkError("Range start is greater than the blob's size.")); |
| 13824 | } |
| 13825 | if (rangeEnd === null || rangeEnd >= fullLength) { |
| 13826 | rangeEnd = fullLength - 1; |
| 13827 | } |
| 13828 | } |
| 13829 | const slicedBlob = blob.slice(rangeStart, rangeEnd + 1, type); |
| 13830 | const slicedBodyWithType = extractBody(slicedBlob); |
| 13831 | response.body = slicedBodyWithType[0]; |
| 13832 | const serializedSlicedLength = isomorphicEncode(`${slicedBlob.size}`); |
| 13833 | const contentRange = buildContentRange(rangeStart, rangeEnd, fullLength); |
| 13834 | response.status = 206; |
| 13835 | response.statusText = "Partial Content"; |
no test coverage detected
searching dependent graphs…