@@ -84,6 +84,8 @@ type sessionContext struct {
8484
8585 query url.Values
8686
87+ outFileName string
88+
8789 errors []error
8890}
8991
@@ -110,7 +112,6 @@ type responseData struct {
110112 RootRelPath string
111113
112114 Item os.FileInfo
113- ItemName string
114115 SubItems []os.FileInfo
115116 AliasSubItems []os.FileInfo
116117 SubItemsHtml []itemHtml
@@ -267,7 +268,12 @@ func getSubItemPrefix(currDirRelPath, rawRequestPath string, tailSlash bool) str
267268 }
268269}
269270
270- func getItemName (info os.FileInfo , r * http.Request ) (itemName string ) {
271+ func getItemName (info os.FileInfo , r * http.Request , prefixReqPath string ) (itemName string ) {
272+ itemName = path .Base (prefixReqPath )
273+ if len (itemName ) > 0 && itemName != "/" {
274+ return
275+ }
276+
271277 if info != nil {
272278 itemName = info .Name ()
273279 }
@@ -372,39 +378,6 @@ func (h *aliasHandler) getSessionData(r *http.Request) (session *sessionContext,
372378
373379 headers := h .getHeaders (vhostReqPath , fsPath , authSuccess )
374380
375- isMutate := false
376- isUpload := false
377- isMkdir := false
378- isDelete := false
379- switch {
380- case query .Has ("upload" ):
381- isMutate = true
382- isUpload = true
383- case query .Has ("mkdir" ):
384- isMutate = true
385- isMkdir = true
386- case query .Has ("delete" ):
387- isMutate = true
388- isDelete = true
389- }
390-
391- isArchive := false
392- var arFmt archiveFormat
393- switch {
394- case query .Has ("tar" ):
395- isArchive = true
396- arFmt = tarFmt
397- case query .Has ("tgz" ):
398- isArchive = true
399- arFmt = tgzFmt
400- case query .Has ("zip" ):
401- isArchive = true
402- arFmt = zipFmt
403- }
404-
405- isSimple := query .Has ("simple" )
406- isDownload := query .Has ("download" )
407-
408381 accepts := acceptHeaders .ParseAccepts (r .Header .Get ("Accept" ))
409382 acceptIndex , _ , _ := accepts .GetPreferredValue (acceptContentTypes )
410383 wantJson := acceptIndex == acceptJsonIndex
@@ -459,7 +432,56 @@ func (h *aliasHandler) getSessionData(r *http.Request) (session *sessionContext,
459432
460433 canIndex = canIndex && allowAccess
461434
462- itemName := getItemName (item , r )
435+ itemName := getItemName (item , r , prefixReqPath )
436+
437+ isMutate := false
438+ isUpload := false
439+ isMkdir := false
440+ isDelete := false
441+ switch {
442+ case query .Has ("upload" ):
443+ isMutate = true
444+ isUpload = true
445+ case query .Has ("mkdir" ):
446+ isMutate = true
447+ isMkdir = true
448+ case query .Has ("delete" ):
449+ isMutate = true
450+ isDelete = true
451+ }
452+
453+ var outFileName string
454+
455+ isSimple := query .Has ("simple" )
456+ dlName , isDownload := getUrlValue (query , "download" )
457+ if isDownload {
458+ if len (dlName ) > 0 {
459+ outFileName = dlName
460+ } else {
461+ outFileName = itemName
462+ }
463+ }
464+
465+ isArchive := false
466+ var arName string
467+ var arFmt archiveFormat
468+ if arName , isArchive = getUrlValue (query , "tar" ); isArchive {
469+ outFileName = ".tar"
470+ arFmt = tarFmt
471+ } else if arName , isArchive = getUrlValue (query , "tgz" ); isArchive {
472+ outFileName = ".tar.tz"
473+ arFmt = tgzFmt
474+ } else if arName , isArchive = getUrlValue (query , "zip" ); isArchive {
475+ outFileName = ".zip"
476+ arFmt = zipFmt
477+ }
478+ if isArchive {
479+ if len (arName ) > 0 {
480+ outFileName = arName
481+ } else {
482+ outFileName = itemName + outFileName
483+ }
484+ }
463485
464486 subItems , _readdirErr := readdir (file , item , canIndex && ! isMutate && ! isArchive && NeedResponseBody (r .Method ))
465487 if _readdirErr != nil {
@@ -532,6 +554,8 @@ func (h *aliasHandler) getSessionData(r *http.Request) (session *sessionContext,
532554 isArchive : isArchive ,
533555 archiveFormat : arFmt ,
534556
557+ outFileName : outFileName ,
558+
535559 file : file ,
536560
537561 query : query ,
@@ -561,7 +585,6 @@ func (h *aliasHandler) getSessionData(r *http.Request) (session *sessionContext,
561585 RootRelPath : rootRelPath ,
562586
563587 Item : item ,
564- ItemName : itemName ,
565588 SubItems : subItems ,
566589 AliasSubItems : aliasSubItems ,
567590 SubItemsHtml : nil ,
0 commit comments