UNPKG

urllib

Version:

Help in opening URLs (mostly HTTP) in a complex world — basic and digest authentication, redirections, timeout and more. Base undici API.

279 lines 22.5 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseJSON = parseJSON; exports.digestAuthHeader = digestAuthHeader; exports.globalId = globalId; exports.performanceTime = performanceTime; exports.isReadable = isReadable; exports.updateSocketInfo = updateSocketInfo; exports.convertHeader = convertHeader; exports.patchForNode16 = patchForNode16; const node_crypto_1 = require("node:crypto"); const node_stream_1 = require("node:stream"); const node_perf_hooks_1 = require("node:perf_hooks"); const web_1 = require("node:stream/web"); const node_buffer_1 = require("node:buffer"); const node_util_1 = require("node:util"); const symbols_js_1 = __importDefault(require("./symbols.js")); const JSONCtlCharsMap = { '"': '\\"', // \u0022 '\\': '\\\\', // \u005c '\b': '\\b', // \u0008 '\f': '\\f', // \u000c '\n': '\\n', // \u000a '\r': '\\r', // \u000d '\t': '\\t', // \u0009 }; /* eslint no-control-regex: "off"*/ const JSONCtlCharsRE = /[\u0000-\u001F\u005C]/g; function replaceOneChar(c) { return JSONCtlCharsMap[c] || '\\u' + (c.charCodeAt(0) + 0x10000).toString(16).substring(1); } function replaceJSONCtlChars(value) { return value.replace(JSONCtlCharsRE, replaceOneChar); } function parseJSON(data, fixJSONCtlChars) { if (typeof fixJSONCtlChars === 'function') { data = fixJSONCtlChars(data); } else if (fixJSONCtlChars) { // https://github.com/node-modules/urllib/pull/77 // remote the control characters (U+0000 through U+001F) data = replaceJSONCtlChars(data); } try { data = JSON.parse(data); } catch (err) { if (err.name === 'SyntaxError') { err.name = 'JSONResponseFormatError'; } if (data.length > 1024) { // show 0~512 ... -512~end data err.message += ' (data json format: ' + JSON.stringify(data.slice(0, 512)) + ' ...skip... ' + JSON.stringify(data.slice(data.length - 512)) + ')'; } else { err.message += ' (data json format: ' + JSON.stringify(data) + ')'; } throw err; } return data; } function md5(s) { const sum = (0, node_crypto_1.createHash)('md5'); sum.update(s, 'utf8'); return sum.digest('hex'); } const AUTH_KEY_VALUE_RE = /(\w{1,100})=["']?([^'"]+)["']?/; let NC = 0; const NC_PAD = '00000000'; function digestAuthHeader(method, uri, wwwAuthenticate, userpass) { // WWW-Authenticate: Digest realm="testrealm@host.com", // qop="auth,auth-int", // nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", // opaque="5ccc069c403ebaf9f0171e9517f40e41" // Authorization: Digest username="Mufasa", // realm="testrealm@host.com", // nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", // uri="/dir/index.html", // qop=auth, // nc=00000001, // cnonce="0a4f113b", // response="6629fae49393a05397450978507c4ef1", // opaque="5ccc069c403ebaf9f0171e9517f40e41" // HA1 = MD5( "Mufasa:testrealm@host.com:Circle Of Life" ) // = 939e7578ed9e3c518a452acee763bce9 // // HA2 = MD5( "GET:/dir/index.html" ) // = 39aff3a2bab6126f332b942af96d3366 // // Response = MD5( "939e7578ed9e3c518a452acee763bce9:\ // dcd98b7102dd2f0e8b11d0f600bfb0c093:\ // 00000001:0a4f113b:auth:\ // 39aff3a2bab6126f332b942af96d3366" ) // = 6629fae49393a05397450978507c4ef1 const parts = wwwAuthenticate.split(','); const opts = {}; for (const part of parts) { const m = part.match(AUTH_KEY_VALUE_RE); if (m) { opts[m[1]] = m[2].replace(/["']/g, ''); } } if (!opts.realm || !opts.nonce) { return ''; } let qop = opts.qop || ''; const index = userpass.indexOf(':'); const user = userpass.substring(0, index); const pass = userpass.substring(index + 1); let nc = String(++NC); nc = `${NC_PAD.substring(nc.length)}${nc}`; const cnonce = (0, node_crypto_1.randomBytes)(8).toString('hex'); const ha1 = md5(`${user}:${opts.realm}:${pass}`); const ha2 = md5(`${method.toUpperCase()}:${uri}`); let s = `${ha1}:${opts.nonce}`; if (qop) { qop = qop.split(',')[0]; s += `:${nc}:${cnonce}:${qop}`; } s += `:${ha2}`; const response = md5(s); let authstring = `Digest username="${user}", realm="${opts.realm}", nonce="${opts.nonce}", uri="${uri}", response="${response}"`; if (opts.opaque) { authstring += `, opaque="${opts.opaque}"`; } if (qop) { authstring += `, qop=${qop}, nc=${nc}, cnonce="${cnonce}"`; } return authstring; } const MAX_ID_VALUE = Math.pow(2, 31) - 10; const globalIds = {}; function globalId(category) { if (!globalIds[category] || globalIds[category] >= MAX_ID_VALUE) { globalIds[category] = 0; } return ++globalIds[category]; } function performanceTime(startTime, now) { return Math.floor(((now ?? node_perf_hooks_1.performance.now()) - startTime) * 1000) / 1000; } function isReadable(stream) { if (typeof node_stream_1.Readable.isReadable === 'function') return node_stream_1.Readable.isReadable(stream); // patch from node // https://github.com/nodejs/node/blob/1287530385137dda1d44975063217ccf90759475/lib/internal/streams/utils.js#L119 // simple way https://github.com/sindresorhus/is-stream/blob/main/index.js return stream !== null && typeof stream === 'object' && typeof stream.pipe === 'function' && stream.readable !== false && typeof stream._read === 'function' && typeof stream._readableState === 'object'; } function updateSocketInfo(socketInfo, internalOpaque, err) { const socket = internalOpaque[symbols_js_1.default.kRequestSocket] ?? err?.[symbols_js_1.default.kErrorSocket]; if (socket) { socketInfo.id = socket[symbols_js_1.default.kSocketId]; socketInfo.handledRequests = socket[symbols_js_1.default.kHandledRequests]; socketInfo.handledResponses = socket[symbols_js_1.default.kHandledResponses]; if (socket[symbols_js_1.default.kSocketLocalAddress]) { socketInfo.localAddress = socket[symbols_js_1.default.kSocketLocalAddress]; socketInfo.localPort = socket[symbols_js_1.default.kSocketLocalPort]; } if (socket.remoteAddress) { socketInfo.remoteAddress = socket.remoteAddress; socketInfo.remotePort = socket.remotePort; socketInfo.remoteFamily = socket.remoteFamily; } if (Array.isArray(socket.autoSelectFamilyAttemptedAddresses)) { socketInfo.attemptedRemoteAddresses = socket.autoSelectFamilyAttemptedAddresses; } socketInfo.bytesRead = socket.bytesRead; socketInfo.bytesWritten = socket.bytesWritten; if (socket[symbols_js_1.default.kSocketConnectErrorTime]) { socketInfo.connectErrorTime = socket[symbols_js_1.default.kSocketConnectErrorTime]; socketInfo.connectProtocol = socket[symbols_js_1.default.kSocketConnectProtocol]; socketInfo.connectHost = socket[symbols_js_1.default.kSocketConnectHost]; socketInfo.connectPort = socket[symbols_js_1.default.kSocketConnectPort]; } if (socket[symbols_js_1.default.kSocketConnectedTime]) { socketInfo.connectedTime = socket[symbols_js_1.default.kSocketConnectedTime]; } if (socket[symbols_js_1.default.kSocketRequestEndTime]) { socketInfo.lastRequestEndTime = socket[symbols_js_1.default.kSocketRequestEndTime]; } socket[symbols_js_1.default.kSocketRequestEndTime] = new Date(); } } function convertHeader(headers) { const res = {}; for (const [key, value] of headers.entries()) { if (res[key]) { if (!Array.isArray(res[key])) { res[key] = [res[key]]; } res[key].push(value); } else { res[key] = value; } } return res; } // support require from Node.js 16 function patchForNode16() { if (typeof global.ReadableStream === 'undefined') { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore global.ReadableStream = web_1.ReadableStream; } if (typeof global.TransformStream === 'undefined') { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore global.TransformStream = web_1.TransformStream; } if (typeof global.Blob === 'undefined') { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore global.Blob = node_buffer_1.Blob; } if (typeof global.DOMException === 'undefined') { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore global.DOMException = getDOMExceptionClass(); } // multi undici version in node version less than 20 https://github.com/nodejs/undici/issues/4374 if (typeof global.File === 'undefined') { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore global.File = node_buffer_1.File; } // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore if (String.prototype.toWellFormed === undefined) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore Object.defineProperty(String.prototype, 'toWellFormed', { value: function () { return (0, node_util_1.toUSVString)(this); }, enumerable: false, configurable: true, writable: true, }); } // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore if (String.prototype.isWellFormed === undefined) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore Object.defineProperty(String.prototype, 'isWellFormed', { value: function () { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore return (0, node_util_1.toUSVString)(this) === this; }, enumerable: false, configurable: true, writable: true, }); } } // https://github.com/jimmywarting/node-domexception/blob/main/index.js function getDOMExceptionClass() { try { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore atob(0); } catch (err) { return err.constructor; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUErQkEsOEJBd0JDO0FBWUQsNENBZ0VDO0FBS0QsNEJBS0M7QUFFRCwwQ0FFQztBQUVELGdDQVdDO0FBRUQsNENBbUNDO0FBRUQsc0NBYUM7QUFHRCx3Q0E0REM7QUFqUkQsNkNBQXNEO0FBQ3RELDZDQUF1QztBQUN2QyxxREFBOEM7QUFDOUMseUNBQWtFO0FBQ2xFLDZDQUF5QztBQUN6Qyx5Q0FBd0M7QUFHeEMsOERBQW1DO0FBR25DLE1BQU0sZUFBZSxHQUEyQjtJQUM5QyxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVM7SUFDckIsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTO0lBQ3ZCLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUztJQUN0QixJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVM7SUFDdEIsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTO0lBQ3RCLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUztJQUN0QixJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVM7Q0FDdkIsQ0FBQztBQUNGLG1DQUFtQztBQUNuQyxNQUFNLGNBQWMsR0FBRyx3QkFBd0IsQ0FBQztBQUVoRCxTQUFTLGNBQWMsQ0FBQyxDQUFTO0lBQy9CLE9BQU8sZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RixDQUFDO0FBRUQsU0FBUyxtQkFBbUIsQ0FBQyxLQUFhO0lBQ3hDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUVELFNBQWdCLFNBQVMsQ0FBQyxJQUFZLEVBQUUs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