@@ -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 }
@@ -359,10 +365,7 @@ func (h *aliasHandler) getSessionData(r *http.Request) (session *sessionContext,
359365 fsPath := filepath .Clean (h .dir + reqPath )
360366
361367 query := r .URL .Query ()
362- queryPrefix := r .URL .RawQuery
363- if querySepIndex := strings .IndexByte (queryPrefix , '&' ); querySepIndex >= 0 {
364- queryPrefix = queryPrefix [:querySepIndex ]
365- }
368+ queryPrefix := getQueryPrefix (r .URL .RawQuery )
366369
367370 status := http .StatusOK
368371
@@ -376,39 +379,6 @@ func (h *aliasHandler) getSessionData(r *http.Request) (session *sessionContext,
376379
377380 headers := h .getHeaders (vhostReqPath , fsPath , authSuccess )
378381
379- isUpload := false
380- isMkdir := false
381- isDelete := false
382- isMutate := false
383- switch queryPrefix {
384- case "upload" :
385- isUpload = true
386- isMutate = true
387- case "mkdir" :
388- isMkdir = true
389- isMutate = true
390- case "delete" :
391- isDelete = true
392- isMutate = true
393- }
394-
395- isArchive := false
396- var arFmt archiveFormat
397- switch queryPrefix {
398- case "tar" :
399- isArchive = true
400- arFmt = tarFmt
401- case "tgz" :
402- isArchive = true
403- arFmt = tgzFmt
404- case "zip" :
405- isArchive = true
406- arFmt = zipFmt
407- }
408-
409- isSimple := query .Has ("simple" )
410- isDownload := query .Has ("download" )
411-
412382 accepts := acceptHeaders .ParseAccepts (r .Header .Get ("Accept" ))
413383 acceptIndex , _ , _ := accepts .GetPreferredValue (acceptContentTypes )
414384 wantJson := acceptIndex == acceptJsonIndex
@@ -463,7 +433,60 @@ func (h *aliasHandler) getSessionData(r *http.Request) (session *sessionContext,
463433
464434 canIndex = canIndex && allowAccess
465435
466- itemName := getItemName (item , r )
436+ itemName := getItemName (item , r , prefixReqPath )
437+
438+ var outFileName string
439+
440+ isUpload := false
441+ isMkdir := false
442+ isDelete := false
443+ isMutate := false
444+ switch queryPrefix {
445+ case "upload" :
446+ isUpload = true
447+ isMutate = true
448+ case "mkdir" :
449+ isMkdir = true
450+ isMutate = true
451+ case "delete" :
452+ isDelete = true
453+ isMutate = true
454+ }
455+
456+ isArchive := false
457+ var arFmt archiveFormat
458+ switch queryPrefix {
459+ case "tar" :
460+ isArchive = true
461+ arFmt = tarFmt
462+ outFileName = ".tar"
463+ case "tgz" :
464+ isArchive = true
465+ arFmt = tgzFmt
466+ outFileName = ".tar.tz"
467+ case "zip" :
468+ isArchive = true
469+ arFmt = zipFmt
470+ outFileName = ".zip"
471+ }
472+ if isArchive {
473+ arName , _ := getQueryValue (query , queryPrefix )
474+ if len (arName ) > 0 {
475+ outFileName = arName
476+ } else {
477+ outFileName = itemName + outFileName
478+ }
479+ }
480+
481+ _ , isSimple := query ["simple" ]
482+ dlName , isDownload := getQueryValue (query , "download" )
483+ if isDownload {
484+ if len (dlName ) > 0 {
485+ outFileName = dlName
486+ } else {
487+ outFileName = itemName
488+ }
489+ }
467490
468491 subItems , _readdirErr := readdir (file , item , canIndex && ! isMutate && ! isArchive && NeedResponseBody (r .Method ))
469492 if _readdirErr != nil {
@@ -536,6 +559,8 @@ func (h *aliasHandler) getSessionData(r *http.Request) (session *sessionContext,
536559 isArchive : isArchive ,
537560 archiveFormat : arFmt ,
538561
562+ outFileName : outFileName ,
563+
539564 file : file ,
540565
541566 query : query ,
@@ -565,7 +590,6 @@ func (h *aliasHandler) getSessionData(r *http.Request) (session *sessionContext,
565590 RootRelPath : rootRelPath ,
566591
567592 Item : item ,
568- ItemName : itemName ,
569593 SubItems : subItems ,
570594 AliasSubItems : aliasSubItems ,
571595 SubItemsHtml : nil ,
0 commit comments