Skip to content

Commit

Permalink
refactor: perform partial content request when is possible
Browse files Browse the repository at this point in the history
  • Loading branch information
Kikobeats committed Sep 23, 2022
1 parent 8fc0826 commit 01fade5
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 24 deletions.
13 changes: 11 additions & 2 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,17 @@ const { URL } = require('url')
const got = require('got').extend({
decompress: false,
responseType: 'buffer',
retry: 0
retry: 1,
headers: {
Range: 'bytes=0-0'
},
hooks: {
beforeRetry: [
options => {
delete options.headers.range
}
]
}
})

const mergeResponse = (responseOrigin = {}, responseDestination = {}) => ({
Expand All @@ -26,7 +36,6 @@ const reachableUrl = async (url, opts) => {

req.on('response', res => {
response = res
response.once('data', () => req.cancel())
})

req.on('redirect', res => {
Expand Down
20 changes: 8 additions & 12 deletions test/cache.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ test("don't cache response with no cache-control", async t => {
const url = 'https://test-http.vercel.app/'
const cache = new Map()

const responseOne = await reachableUrl(url, { cache })
const responseOne = await reachableUrl(url, { cache, timeout: 3000 })

t.is(responseOne.isFromCache, false)
t.is(cache.size, 1)

const responseTwo = await reachableUrl(url, { cache })
const responseTwo = await reachableUrl(url, { cache, timeout: 3000 })

t.is(responseTwo.isFromCache, false)
t.is(cache.size, 1)
Expand All @@ -38,14 +38,10 @@ test('5xx', async t => {
const url = 'https://test-http.vercel.app/?statusCode=500&maxAge=300'
const cache = new Map()

const responseOne = await reachableUrl(url, { cache })
await reachableUrl(url, { cache, timeout: 3000 })
const response = await reachableUrl(url, { cache, timeout: 3000 })

t.is(responseOne.isFromCache, false)
t.is(cache.size, 1)

const responseTwo = await reachableUrl(url, { cache })

t.is(responseTwo.isFromCache, true)
t.is(response.isFromCache, true)
t.is(cache.size, 1)
})

Expand All @@ -68,19 +64,19 @@ test('2xx', async t => {
const url = 'https://test-http.vercel.app/?maxAge=300'
const cache = new Map()

const responseOne = await reachableUrl(url, { cache })
const responseOne = await reachableUrl(url, { cache, timeout: 3000 })

t.is(responseOne.isFromCache, false)
t.is(cache.size, 1)

const responseTwo = await reachableUrl(url, { cache })
const responseTwo = await reachableUrl(url, { cache, timeout: 3000 })

t.is(responseTwo.isFromCache, true)
t.is(cache.size, 1)
})

test('static asset', async t => {
const url = 'https://microlink.io/favicon.ico'
const url = 'http://ftp.nluug.nl/pub/graphics/blender/demo/movies/ToS/ToS-4k-1920.mov'
const cache = new Map()

const responseOne = await reachableUrl(url, { cache })
Expand Down
18 changes: 8 additions & 10 deletions test/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ test('resolve multiple redirects', async t => {
])
t.deepEqual(res.redirectStatusCodes, [302, 302, 302])
t.is('https://example.com/', res.url)
t.is(200, res.statusCode)
t.true(isReachable(res))
})

Expand Down Expand Up @@ -112,20 +111,21 @@ test('keep original query search', async t => {
'https://www.b92.net/biz/vesti/srbija/dogovoreno-nikola-tesla-primer-aerodromu-u-cg-1465369'
const res = await reachableUrl(url)
t.is(res.url, url)
t.is(200, res.statusCode)
t.is(res.statusMessage, 'OK')
t.true(Object.keys(res.headers).length > 0)
t.true(isReachable(res))
t.true(Object.keys(res.headers).length > 0)
t.truthy(res.headers['content-length'])
t.truthy(res.headers['content-range'])
})

test("ensure to don't download body", async t => {
t.timeout(8000)
const url = 'http://ftp.nluug.nl/pub/graphics/blender/demo/movies/ToS/ToS-4k-1920.mov'
const res = await reachableUrl(url)
t.is(res.url, url)
t.is(200, res.statusCode)
t.is(res.statusMessage, 'OK')
t.true(isReachable(res))
t.true(Object.keys(res.headers).length > 0)
t.truthy(res.headers['content-length'])
t.truthy(res.headers['content-range'])
})

test('handle DNS errors', async t => {
Expand Down Expand Up @@ -157,15 +157,13 @@ test('fast unreachable request resolution', async t => {
const url = 'https://httpbin.org/status/404'
const res = await reachableUrl(url)
t.is(res.url, url)
t.is(res.statusCode, 404)
t.is(res.statusMessage.toLowerCase(), 'not found')
t.false(isReachable(res))
})

test('header `content-length` is present', async t => {
const url = 'https://cdn-microlink.vercel.app/file-examples/file_example_CSV_5000.csv'
const res = await reachableUrl(url)
t.is(res.url, url)
t.is(200, res.statusCode)
t.is(res.statusMessage, 'OK')
t.true(isReachable(res))
t.truthy(res.headers['content-length'])
})

0 comments on commit 01fade5

Please sign in to comment.