MCPcopy Index your code
hub / github.com/nodejs/node / schemeFetch

Function schemeFetch

deps/undici/undici.js:13778–13868  ·  view source on GitHub ↗
(fetchParams)

Source from the content-addressed store, hash-verified

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";

Callers 1

mainFetchFunction · 0.70

Calls 15

resolveObjectURLFunction · 0.85
isCancelledFunction · 0.70
requestCurrentURLFunction · 0.70
makeNetworkErrorFunction · 0.70
makeResponseFunction · 0.70
isomorphicEncodeFunction · 0.70
extractBodyFunction · 0.70
simpleRangeHeaderValueFunction · 0.70
buildContentRangeFunction · 0.70
dataURLProcessorFunction · 0.70
serializeAMimeTypeFunction · 0.70

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…