Skip to content

Commit

Permalink
-fixed href (#244)
Browse files Browse the repository at this point in the history
  • Loading branch information
Jelenkee committed Oct 12, 2021
1 parent d871592 commit ad66ca1
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 35 deletions.
28 changes: 15 additions & 13 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,17 @@ async function fastifyStatic (fastify, opts) {

const allowedPath = opts.allowedPath

if (opts.prefix === undefined) opts.prefix = '/'

let prefix = opts.prefix

if (!opts.prefixAvoidTrailingSlash) {
prefix =
opts.prefix[opts.prefix.length - 1] === '/'
? opts.prefix
: opts.prefix + '/'
}

function pumpSendToReply (
request,
reply,
Expand Down Expand Up @@ -146,7 +157,8 @@ async function fastifyStatic (fastify, opts) {
reply,
dir: path,
options: opts.list,
route: pathname
route: pathname,
prefix
}).catch((err) => reply.send(err))
return
}
Expand All @@ -172,7 +184,8 @@ async function fastifyStatic (fastify, opts) {
reply,
dir: dirList.path(opts.root, pathname),
options: opts.list,
route: pathname
route: pathname,
prefix
}).catch((err) => reply.send(err))
return
}
Expand Down Expand Up @@ -216,17 +229,6 @@ async function fastifyStatic (fastify, opts) {
stream.pipe(wrap)
}

if (opts.prefix === undefined) opts.prefix = '/'

let prefix = opts.prefix

if (!opts.prefixAvoidTrailingSlash) {
prefix =
opts.prefix[opts.prefix.length - 1] === '/'
? opts.prefix
: opts.prefix + '/'
}

const errorHandler = (error, request, reply) => {
if (error && error.code === 'ERR_STREAM_PREMATURE_CLOSE') {
reply.request.raw.destroy()
Expand Down
18 changes: 13 additions & 5 deletions lib/dirList.js
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ const dirList = {
* @param {ListOptions} options
* @param {string} route request route
*/
send: async function ({ reply, dir, options, route }) {
send: async function ({ reply, dir, options, route, prefix }) {
let entries
try {
entries = await dirList.list(dir, options)
Expand All @@ -120,8 +120,8 @@ const dirList = {
}

const html = options.render(
entries.dirs.map(entry => dirList.htmlInfo(entry, route)),
entries.files.map(entry => dirList.htmlInfo(entry, route)))
entries.dirs.map(entry => dirList.htmlInfo(entry, route, prefix, options)),
entries.files.map(entry => dirList.htmlInfo(entry, route, prefix, options)))
reply.type('text/html').send(html)
},

Expand All @@ -131,8 +131,16 @@ const dirList = {
* @param {string} route request route
* @return {ListFile}
*/
htmlInfo: function (entry, route) {
return { href: path.join(path.dirname(route), entry.name).replace(/\\/g, '/'), name: entry.name, stats: entry.stats, extendedInfo: entry.extendedInfo }
htmlInfo: function (entry, route, prefix, options) {
if (options.names && options.names.includes(path.basename(route))) {
route = path.normalize(path.join(route, '..'))
}
return {
href: path.join(prefix, route, entry.name).replace(/\\/g, '/'),
name: entry.name,
stats: entry.stats,
extendedInfo: entry.extendedInfo
}
},

/**
Expand Down
81 changes: 64 additions & 17 deletions test/dir-list.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ t.test('dir list wrong options', t => {
root: path.join(__dirname, '/static'),
list: {
format: 'html'
// no render function
// no render function
}
},
error: new TypeError('The `list.render` option must be a function and is required with html format')
Expand Down Expand Up @@ -159,16 +159,16 @@ t.test('dir list html format', t => {
output: `
<html><body>
<ul>
<li><a href="/deep">deep</a></li>
<li><a href="/shallow">shallow</a></li>
<li><a href="/public/deep">deep</a></li>
<li><a href="/public/shallow">shallow</a></li>
</ul>
<ul>
<li><a href="/.example" target="_blank">.example</a></li>
<li><a href="/a .md" target="_blank">a .md</a></li>
<li><a href="/foo.html" target="_blank">foo.html</a></li>
<li><a href="/foobar.html" target="_blank">foobar.html</a></li>
<li><a href="/index.css" target="_blank">index.css</a></li>
<li><a href="/index.html" target="_blank">index.html</a></li>
<li><a href="/public/.example" target="_blank">.example</a></li>
<li><a href="/public/a .md" target="_blank">a .md</a></li>
<li><a href="/public/foo.html" target="_blank">foo.html</a></li>
<li><a href="/public/foobar.html" target="_blank">foobar.html</a></li>
<li><a href="/public/index.css" target="_blank">index.css</a></li>
<li><a href="/public/index.html" target="_blank">index.html</a></li>
</ul>
</body></html>
`
Expand All @@ -190,16 +190,16 @@ t.test('dir list html format', t => {
output: `
<html><body>
<ul>
<li><a href="/deep">deep</a></li>
<li><a href="/shallow">shallow</a></li>
<li><a href="/public/deep">deep</a></li>
<li><a href="/public/shallow">shallow</a></li>
</ul>
<ul>
<li><a href="/.example" target="_blank">.example</a></li>
<li><a href="/a .md" target="_blank">a .md</a></li>
<li><a href="/foo.html" target="_blank">foo.html</a></li>
<li><a href="/foobar.html" target="_blank">foobar.html</a></li>
<li><a href="/index.css" target="_blank">index.css</a></li>
<li><a href="/index.html" target="_blank">index.html</a></li>
<li><a href="/public/.example" target="_blank">.example</a></li>
<li><a href="/public/a .md" target="_blank">a .md</a></li>
<li><a href="/public/foo.html" target="_blank">foo.html</a></li>
<li><a href="/public/foobar.html" target="_blank">foobar.html</a></li>
<li><a href="/public/index.css" target="_blank">index.css</a></li>
<li><a href="/public/index.html" target="_blank">index.html</a></li>
</ul>
</body></html>
`
Expand Down Expand Up @@ -240,6 +240,53 @@ t.test('dir list html format', t => {
}
})

t.test('dir list href nested structure', t => {
t.plan(6)

const options = {
root: path.join(__dirname, '/static'),
prefix: '/public',
index: false,
list: {
format: 'html',
names: ['index', 'index.htm'],
render (dirs, files) {
return dirs[0].href
}
}
}

const routes = [
{ path: '/public/', response: '/public/deep' },
{ path: '/public/index', response: '/public/deep' },
{ path: '/public/deep/', response: '/public/deep/path' },
{ path: '/public/deep/index.htm', response: '/public/deep/path' },
{ path: '/public/deep/path/', response: '/public/deep/path/for' }
]
helper.arrange(t, options, (url) => {
for (const route of routes) {
t.test(route.path, t => {
t.plan(5)
simple.concat({
method: 'GET',
url: url + route.path
}, (err, response, body) => {
t.error(err)
t.equal(response.statusCode, 200)
t.equal(body.toString(), route.response)
simple.concat({
method: 'GET',
url: url + body.toString()
}, (err, response, body) => {
t.error(err)
t.equal(response.statusCode, 200)
})
})
})
}
})
})

t.test('dir list html format - stats', t => {
t.plan(7)

Expand Down

0 comments on commit ad66ca1

Please sign in to comment.