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