Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add simple implementation of serving directories as zip files #836

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

kimsey0
Copy link

@kimsey0 kimsey0 commented Oct 4, 2022

This is a first draft of a new functionality that allows downloading the contents of a directory as a zip file. See the issue linked below for why I think this would be useful.

It's implemented using the archiver library, which allows streaming the compressed files directly to the response. There are currently no automated tests, but the feature can be manually tested without any additional setup by running npm start and visiting http://localhost:8080/img.zip.

Questions I'd like answered before I continue the work:

  1. Is this something that could fit within the mission for http-server?
  2. Are there any concerns about the number or size of the dependencies? archiver adds quite a few transitive dependencies. The number could probably be reduced by using a lower-level library like zip-stream at the cost of more complex wrapping code.
  3. How should this be configured? I've currently added a --serve-dir-zip command line argument that controls it. Should it be enabled by default?
  4. What happens if there's a zip file with the same name as a directory? Right now, it's served instead of zipping the directory. The risk of collisions could potentially be reduced by serving directory zips at /directory/.zip instead of /directory.zip.
  5. Should other archive formats be supported? Support for tar files, optionally gzipped, is included archiver, so it's trivial to enable.
  6. And as a last minor question, should a link to the zip file be added to directory listings, and in that case where?
Relevant issues

Fixes #798.

Contributor checklist
  • Provide tests for the changes (unless documentation-only)
  • Documented any new features, CLI switches, etc. (if applicable)
    • Server --help output
    • README.md
    • doc/http-server.1 (use the same format as other entries)
  • The pull request is being made against the master branch
Maintainer checklist
  • Assign a version triage tag
  • Approve tests if applicable

@kimsey0
Copy link
Author

kimsey0 commented Oct 4, 2022

@thornjad, perhaps you can help clear some of these up when you have time and energy? (In any case, thanks for this great utility. 😄)

@@ -352,6 +353,9 @@ module.exports = function createMiddleware(_dir, _options) {
// This means we're already trying ./404.html and can not find it.
// So send plain text response with 404 status code
status[404](res, next);
} else if (path.extname(parsed.pathname) === '.zip' && opts.serveDirZip) {
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should probably be case insensitive.

@kimsey0
Copy link
Author

kimsey0 commented Nov 2, 2022

@thornjad, any chance you could answer a few of the questions above? 😄

@kimsey0
Copy link
Author

kimsey0 commented Jan 4, 2023

@thornjad, any input on whether this could conceivably merge in the right state?

Copy link

This pull request has been inactive for 360 days

@github-actions github-actions bot added the stale label Dec 31, 2023
@kimsey0
Copy link
Author

kimsey0 commented Dec 31, 2023

@thornjad, I still think this would be useful. Any chance you think so too?

@github-actions github-actions bot removed the stale label Jan 1, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Allow downloading directory as archive
1 participant