@@ -25,7 +25,10 @@ func (o *Operations) List(ctx context.Context, params ListParams) ListResult {
2525 if params .URL != "" {
2626 return o .listFromURL (ctx , params .URL )
2727 }
28- return ListResult {Err : fmt .Errorf ("either Key or URL must be specified" )}
28+ if params .File != "" {
29+ return o .listFromFile (params .File )
30+ }
31+ return ListResult {Err : fmt .Errorf ("either Key, URL, or File must be specified" )}
2932}
3033
3134func (o * Operations ) listFromBucket (ctx context.Context , key string ) ListResult {
@@ -34,36 +37,36 @@ func (o *Operations) listFromBucket(ctx context.Context, key string) ListResult
3437 return ListResult {Err : err }
3538 }
3639
37- reader , headers , err := storage .GetFile (ctx , o .config .Bucket , key )
40+ readerAt , size , err := storage .GetReaderAt (ctx , o .config .Bucket , key , o . config . MaxInputZipSize )
3841 if err != nil {
3942 return ListResult {Err : err }
4043 }
41- defer reader .Close ()
42-
43- if headers != nil && o .config .MaxInputZipSize > 0 {
44- if contentLength := headers .Get ("Content-Length" ); contentLength != "" {
45- size , err := strconv .ParseInt (contentLength , 10 , 64 )
46- if err != nil {
47- return ListResult {Err : fmt .Errorf ("invalid Content-Length: %w" , err )}
48- }
49- if err := checkContentLength (o .config .MaxInputZipSize , size ); err != nil {
50- return ListResult {Err : err }
51- }
52- }
53- }
44+ defer readerAt .Close ()
5445
55- var body []byte
5646 if o .config .MaxInputZipSize > 0 {
57- var bytesRead uint64
58- body , err = io .ReadAll (limitedReader (reader , o .config .MaxInputZipSize , & bytesRead ))
59- } else {
60- body , err = io .ReadAll (reader )
47+ if err := checkContentLength (o .config .MaxInputZipSize , size ); err != nil {
48+ return ListResult {Err : err }
49+ }
6150 }
51+
52+ zipFile , err := zip .NewReader (readerAt , size )
6253 if err != nil {
6354 return ListResult {Err : err }
6455 }
6556
66- return o .listZipBytes (body )
57+ if o .config .MaxListFiles > 0 && len (zipFile .File ) > o .config .MaxListFiles {
58+ return ListResult {Err : fmt .Errorf ("zip too many files (max %d)" , o .config .MaxListFiles )}
59+ }
60+
61+ var files []fileTuple
62+ for _ , file := range zipFile .File {
63+ files = append (files , fileTuple {
64+ Filename : file .Name ,
65+ Size : file .UncompressedSize64 ,
66+ })
67+ }
68+
69+ return ListResult {Files : files }
6770}
6871
6972func (o * Operations ) listFromURL (ctx context.Context , url string ) ListResult {
@@ -102,6 +105,28 @@ func (o *Operations) listFromURL(ctx context.Context, url string) ListResult {
102105 return o .listZipBytes (body )
103106}
104107
108+ func (o * Operations ) listFromFile (path string ) ListResult {
109+ zipFile , err := zip .OpenReader (path )
110+ if err != nil {
111+ return ListResult {Err : err }
112+ }
113+ defer zipFile .Close ()
114+
115+ if o .config .MaxListFiles > 0 && len (zipFile .File ) > o .config .MaxListFiles {
116+ return ListResult {Err : fmt .Errorf ("zip too many files (max %d)" , o .config .MaxListFiles )}
117+ }
118+
119+ var files []fileTuple
120+ for _ , file := range zipFile .File {
121+ files = append (files , fileTuple {
122+ Filename : file .Name ,
123+ Size : file .UncompressedSize64 ,
124+ })
125+ }
126+
127+ return ListResult {Files : files }
128+ }
129+
105130func (o * Operations ) listZipBytes (body []byte ) ListResult {
106131 zipFile , err := zip .NewReader (bytes .NewReader (body ), int64 (len (body )))
107132 if err != nil {
0 commit comments