v2.0.0 - webprogress namespace, errors for failed and truncated downloads, Filename option
LatestdownloadFile and uploadFile are now webprogress.download and webprogress.upload, and a download that fails, is interrupted or is cut short raises an error and leaves no file at the target path. Upgrading takes renaming the calls; the arguments are unchanged. See Changed and Removed before upgrading, because a failed download now raises an error where v1.2.1 returned normally.
Added
webprogress.downloadandwebprogress.uploadacceptFilename=NAME, which is shown in the progress title as given and takes precedence overShowFilename. Use it when the last segment of a download URL is an identifier, or when an uploaded object is known by its path in a storage bucket, such asfolder/data.bin(#23).
Changed
webprogress.downloadraiseswebprogress:download:RequestFailedwith the server's status line when the response status is not a 2xx status. In v1.2.1downloadFilesaved the server's error page at the target path and returned that path (#3).webprogress.downloadsaves a file target under the exact name given. In v1.2.1 a target without an extension was given one, from the URL or else fromContent-Type, soLICENSEserved astext/plainwas saved asLICENSE.txt(#14).- With a folder as the target,
webprogress.downloadsaves the file under the name in theContent-Dispositionheader, or else under the last segment of the URL path. Only the last component of aContent-Dispositionname is used, so a name such as../outside.txtcannot write outside the folder. A second download into the same folder replaces the file, where it failed withMATLAB:http:CannotOverwriteNoNamebefore (#14). webprogress.toolboxversionreturns the version number alone, such as2.0.0, instead ofVersion 2.0.0(#22).- The constructor of
webprogress.FileTransferProgressMonitordeclares its options in anargumentsblock. It rejects a name that is not an option, such asDisplayMod, which v1.2.1 skipped without notice, and it validates the values. An unambiguous prefix of an option name is accepted, so'Disp'setsDisplayMode(#8). - The
FileSizeBytesproperty ofwebprogress.FileTransferProgressMonitorcan be set only through the constructor, like the other options (#22).
Removed
downloadFileanduploadFileno longer exist. Callwebprogress.downloadandwebprogress.uploadwith the same arguments.FileTransferProgressMonitoris nowwebprogress.FileTransferProgressMonitor(#2).- The constructor of
webprogress.FileTransferProgressMonitorno longer accepts a scalar struct of options. Pass name-value arguments instead (#8).
Fixed
- A failed or interrupted download leaves an existing file at the target path unchanged.
webprogress.downloadreceives the file in a temporary.partfile in the target folder and moves it to the target only after a successful response. The temporary file is deleted when the function exits early, including by an error or Ctrl+C (#14). webprogress.downloadraiseswebprogress:download:IncompleteTransferwhen the size of the received file differs from theContent-Lengthof the response. The MATLAB HTTP client returns without an error when the server closes the connection early, so a dropped connection saved a truncated file under the final name. Responses withoutContent-Length, such as chunked responses, and responses with aContent-Encodingother thanidentityare not compared (#24).- A response with several
Content-Lengthheaders of different values raiseswebprogress:download:InvalidContentLength. A MATLAB release whose HTTP client uses libcurl 8.17.0 or later rejects such a response itself, withMATLAB:webservices:CopyContentToDataStreamError. In both cases no file is saved (#24). webprogress.downloadraiseswebprogress:download:FolderNotFoundwhen the folder of the target does not exist, andwebprogress:download:NoFilenamewhen a folder target gets no file name from the response or the URL. A response with an empty body saves an empty file (#14).webprogress.uploadtreats any 2xx status as success. In v1.2.1uploadFilecompared the status with 200 only, so an upload acknowledged with 201 Created or 204 No Content was reported as failed. The error raised for an unsuccessful status has the identifierwebprogress:upload:RequestFailedand names the server's status line (#4).- Progress is shown for transfers shorter than one second, including the completion message. v1.2.1 set
ProgressMonitor.Intervalto 1 second, which is the delay before the HTTP stack first calls the monitor, so a 10 MB download that finished sooner printed nothing.Intervalis now at most 0.01 seconds and the first update is displayed without waiting forUpdateInterval; later updates are throttled as before (#21, #22). - The remaining time is shown only when the transferred fraction supports an estimate. A transfer that had not received its first bytes after ten seconds reported
Estimated time remaining: Inf hours; it now showsEstimating remaining time...(#21). - When neither the server nor
FileSizeBytesgives the size of the transfer, the status line and the completion message report the transferred size alone (#22). - Cancelling a transfer closes the progress display and keeps it closed. The byte counts that the HTTP stack reports before it acts on the cancellation opened a new dialog or waitbar (#22).
- A finished upload is described as an upload. When the server's reply had no body, the completion message read
Downloaded 0 MB/0 MB (Inf%)(#5). - With
ShowFilename,webprogress.downloadshows the last decoded segment of the URL path, so the title of a signed URL no longer includes the query and its signature, andmy%20file.binis shown asmy file.bin.webprogress.uploadshows the name of the local file instead of the last segment of the upload URL (#6). - The progress passed to
uiprogressdlgand the waitbar is limited to the range 0 to 1, and NaN becomes 0. AFileSizeBytessmaller than the transfer raised an error from inside the progress monitor. The percentage in the progress message is not limited, so an incorrectFileSizeBytesremains visible (#7). - URLs are validated with
matlab.net.URIinstead of the undocumentedmatlab.internal.webservices.urlencode. A URL must have anhttporhttpsscheme in lowercase and a host, and an invalid URL raiseswebprogress:validators:InvalidUrl(#9). webprogress.toolboxversionreports the version of the installed toolbox. In v1.2.1 it reported 1.2.0, because the release updated a secondContents.mthat the function does not read (#20).
Documentation
webprogress.downloadandwebprogress.uploadhave help text with one syntax paragraph per output and option. It documents the errors raised, theFigureoption and theFileSizeBytesoption ofdownload, and thatuploadraises an error only when it is called without outputs (#11).help webprogresslists the functions of the toolbox below the version header, and the README uses the namespaced function names (#20).
Internal
- The test suite grows from
ToolboxTestto 64 tests in six classes.DownloadTargetTest,ProgressDisplayTestandUploadTestrun against a local Python HTTP server intests/fixturesand are skipped whenpython3or a Unix shell is unavailable (#12, #14, #24). - The toolbox is packaged from
src/webprogressinstead ofsrc, so anything that ships in the.mltbxhas to live under that folder.webprogress.toolboxdirfollows the new layout (#20). webprogresstools.installMatBoxpicks one.mltbxasset from a MatBox release, and the codespell workflow no longer names a.codespellrcthat the repository does not have (#22).- The test workflow caches the MATLAB installation and uploads coverage to Codecov (552eea7).
All merged pull requests
What's Changed
- refactor!: move functions into the webprogress namespace and rename them by @ehennestad in #2
- fix: raise an error when a download request fails by @ehennestad in #3
- fix: treat any 2xx upload response as success by @ehennestad in #4
- fix: describe a finished upload as an upload by @ehennestad in #5
- fix: show the correct file name in the progress title by @ehennestad in #6
- fix: keep dialog progress between 0 and 1 by @ehennestad in #7
- fix: reject unknown options in FileTransferProgressMonitor by @ehennestad in #8
- fix: validate URLs with the public URI class by @ehennestad in #9
- docs: add missing help text by @ehennestad in #11
- test: add tests for download, upload and the progress monitor by @ehennestad in #12
- fix!: download to a temporary file and save under the exact name by @ehennestad in #14
- Keep Contents.m in src/webprogress and add its function listing by @ehennestad in #20
- fix: show progress for short transfers and drop the infinite time estimate by @ehennestad in #21
- fix: report progress for short transfers and stop cancel reopening the display by @ehennestad in #22
- feat: add a Filename option to download and upload by @ehennestad in #23
- fix: raise an error when a download ends before its announced length by @ehennestad in #24
Full Changelog: v1.2.1...v2.0.0