fix: bad zip name when on drive root https://github.com/rejetto/hfs/issues/92

Massimo Melina committed Jan 19, 2023 at 11:15 UTC bfc2be2128d71d4aecc9896e9b113c3cfc773c0b
1 file changed +6 -5
src/zip.ts
+6 -5
@@ -2,12 +2,12 @@
2
3 import { getNodeName, hasPermission, nodeIsDirectory, urlToNode, VfsNode, walkNode } from './vfs'
4 import Koa from 'koa'
5 -import { filterMapGenerator, pattern2filter } from './misc'
5 +import { filterMapGenerator, isWindowsDrive, pattern2filter, wantArray } from './misc'
6 import { QuickZipStream } from './QuickZipStream'
7 import { createReadStream } from 'fs'
8 import fs from 'fs/promises'
9 import { defineConfig } from './config'
10 -import { dirname } from 'path'
10 +import { basename, dirname } from 'path'
11 import { getRange } from './serveFile'
12 import { HTTP_OK } from './const'
13
@@ -15,12 +15,13 @@ export async function zipStreamFromFolder(node: VfsNode, ctx: Koa.Context) {
15 ctx.status = HTTP_OK
16 ctx.mime = 'zip'
17 const name = getNodeName(node)
18 - ctx.attachment((name || 'archive') + '.zip')
18 + ctx.attachment((isWindowsDrive(name) ? name[0] : (name || 'archive')) + '.zip')
19 const filter = pattern2filter(String(ctx.query.search||''))
20 - const { list } = ctx.query
20 + // ctx.query.list is undefined | string | string[]
21 + const list = wantArray(ctx.query.list)[0]?.split('*') // we are using * as separator because it cannot be used in a file name and doesn't need url encoding
22 const walker = !list ? walkNode(node, ctx, Infinity)
23 : (async function*(): AsyncIterableIterator<VfsNode> {
23 - for await (const el of String(list).split('*')) { // we are using * as separator because it cannot be used in a file name and doesn't need url encoding
24 + for await (const el of list) {
25 const subNode = await urlToNode(el, ctx, node)
26 if (!subNode || !hasPermission(subNode,'can_read',ctx))
27 continue