summaryrefslogtreecommitdiff
path: root/deps/npm/node_modules/pacote/lib/fetchers/registry/fetch.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/npm/node_modules/pacote/lib/fetchers/registry/fetch.js')
-rw-r--r--deps/npm/node_modules/pacote/lib/fetchers/registry/fetch.js92
1 files changed, 92 insertions, 0 deletions
diff --git a/deps/npm/node_modules/pacote/lib/fetchers/registry/fetch.js b/deps/npm/node_modules/pacote/lib/fetchers/registry/fetch.js
new file mode 100644
index 0000000000..914053c79f
--- /dev/null
+++ b/deps/npm/node_modules/pacote/lib/fetchers/registry/fetch.js
@@ -0,0 +1,92 @@
+'use strict'
+
+const Buffer = require('safe-buffer').Buffer
+
+const checkWarnings = require('./check-warning-header')
+const fetch = require('make-fetch-happen')
+const registryKey = require('./registry-key')
+const url = require('url')
+
+module.exports = regFetch
+function regFetch (uri, registry, opts) {
+ const startTime = Date.now()
+ return fetch(uri, {
+ agent: opts.agent,
+ algorithms: opts.algorithms,
+ cache: getCacheMode(opts),
+ cacheManager: opts.cache,
+ headers: getHeaders(uri, registry, opts),
+ integrity: opts.integrity,
+ memoize: opts.memoize,
+ noProxy: opts.noProxy,
+ proxy: opts.proxy,
+ referer: opts.refer,
+ retry: opts.retry,
+ timeout: opts.timeout
+ }).then(res => {
+ if (res.headers.has('npm-notice') && !res.headers.has('x-local-cache')) {
+ opts.log.warn('notice', res.headers.get('npm-notice'))
+ }
+ checkWarnings(res, registry, opts)
+ if (res.status >= 400) {
+ const err = new Error(`${res.status} ${res.statusText}: ${
+ opts.spec ? opts.spec : uri
+ }`)
+ err.code = `E${res.status}`
+ err.uri = uri
+ err.response = res
+ err.spec = opts.spec
+ logRequest(uri, res, startTime, opts)
+ throw err
+ } else {
+ res.body.on('end', () => logRequest(uri, res, startTime, opts))
+ return res
+ }
+ })
+}
+
+function logRequest (uri, res, startTime, opts) {
+ const elapsedTime = Date.now() - startTime
+ const attempt = res.headers.get('x-fetch-attempts')
+ const attemptStr = attempt && attempt > 1 ? ` attempt #${attempt}` : ''
+ const cacheStr = res.headers.get('x-local-cache') ? ' (from cache)' : ''
+ opts.log.http(
+ 'fetch',
+ `GET ${res.status} ${uri} ${elapsedTime}ms${attemptStr}${cacheStr}`
+ )
+}
+
+function getCacheMode (opts) {
+ return opts.offline
+ ? 'only-if-cached'
+ : opts.preferOffline
+ ? 'force-cache'
+ : opts.preferOnline
+ ? 'no-cache'
+ : 'default'
+}
+
+function getHeaders (uri, registry, opts) {
+ const headers = Object.assign({
+ 'npm-in-ci': opts.isFromCI,
+ 'npm-scope': opts.projectScope,
+ 'user-agent': opts.userAgent,
+ 'referer': opts.refer
+ }, opts.headers)
+ const auth = (
+ opts.auth &&
+ // If these two are on different hosts, don't send credentials.
+ // This is mainly used by the tarball fetcher.
+ url.parse(uri).host === url.parse(registry).host &&
+ opts.auth[registryKey(registry)]
+ )
+ if (auth && auth.token) {
+ headers.authorization = `Bearer ${auth.token}`
+ } else if (auth && opts.alwaysAuth && auth.username && auth.password) {
+ const encoded = Buffer.from(
+ `${auth.username}:${auth.password}`, 'utf8'
+ ).toString('base64')
+ headers.authorization = `Basic ${encoded}`
+ }
+ return headers
+}