On Tue, 02 Aug 2016 11:27:08 +0200 Tim Ruehsen <[email protected]> wrote:
> On Tuesday, August 2, 2016 10:06:42 AM CEST Matthew White wrote: > > On Sat, 30 Jul 2016 21:23:56 +0200 > > > > Matthew White <[email protected]> wrote: > > > Hello! > > > > > > I noticed that wget doesn't use the metalink:file element as the RFC5854 > > > suggests. > > > > > > https://tools.ietf.org/html/rfc5854#section-4.1.2.1 > > > > > > The RFC5854 specifies that the metalink:file could have a "path/file" > > > format. In this case wget should create the "path" tree and save the file > > > as "path/file", but it doesn't. Instead wget saves the file in the > > > working directory. > > > > > > e.g. <file name="dirA/dirB/file.gz"> > > > > > > With this patch wget conforms to the RFC5854. > > > > > > I made this patch working on the following branch: > > > master (latest 20cac2c5ab3d63aacfba35fb10878a2d490e2377) > > > git://git.savannah.gnu.org/wget.git > > > > > > Let me know if this helps. > > > > Hi, > > > > After the suggestions of Tim, I fixed the patch (nice! fix the fix...). So, > > scratch the previous patch and use this one instead. > > > > The function concat_strings() replaces the combination of malloc(), > > strlen(), and strcpy(). (Thanks Tim.) > > In this special case (just one string to clone), please use xstrdup(). That > is > much less overhead. > > > The description now follows the style of the other patches. (Thanks again > > Tim!) > > > > You may consider this patch a Bugfix: > > * src/utils.c (unique_create, fopen_excl): cannot create a directory tree > > like "path/file". > > > > The problem is that fopen_excl() doesn't create non-existing directories. > > What do you suggest? > > IMO, saving metalink files should work 'as usual and expected'. That means, > all > the directory options should apply (see man wget / Directory Options). We > also > have to deal with 'escaping' file name sequences like ../ etc. > Not to forget character set conversions. > > What about cases where you download https://myserver/file.tgz, and in the > metalink file 'name' is set to 'xyz.doc' ? IMO, we should keep file.tgz, > except > the user stated --trust-server-names. > > Maybe we should set up a a metalink document where we define how everything > should work including corner cases. Next step would be to set up appropriate > tests and fix the wget metalink code to survive the tests. > > > Can we make this patch obsolete? > > Basically yes. > But we see, there is still much to do around metalink ... but most of the > needed code is already there. Most work will be the definition and the tests. > > Regards, Tim Changed to use xstrdup(), new patch attached. I'm currently evaluating how the "Directory Options" combine with the Metalink module. I hope to come up with useful considerations soon. Later, Matthew -- Matthew White <[email protected]>
>From a7978778db4501b872b0946346c2dedd8e12769d Mon Sep 17 00:00:00 2001 From: Matthew White <[email protected]> Date: Thu, 28 Jul 2016 17:10:46 +0200 Subject: [PATCH] Bugfix: create/download/verify Metalink's files with a "path/file" format * src/metalink.c (retrieve_from_metalink): Set filename to mfile->name to create/download/verify files with a "path/file" format Bug: * src/utils.c (unique_create, fopen_excl): cannot create "path/file" * src/metalink.c (retrieve_from_metalink): when filename is NULL, "path/file" is downloaded as "file", and it cannot be verified The directory information contained in a metalink:file element shall be used in the same way the option --directory-prefix will. <file name="dirA/dirB/file.gz"> --directory-prefix="dirA/dirB/file.gz" This patch conforms to the RFC5854 specification: The Metalink Download Description Format 4.1.2.1. The "name" Attribute https://tools.ietf.org/html/rfc5854#section-4.1.2.1 --- src/metalink.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/metalink.c b/src/metalink.c index 9f34b32..dd16db2 100644 --- a/src/metalink.c +++ b/src/metalink.c @@ -156,6 +156,13 @@ retrieve_from_metalink (const metalink_t* metalink) output_stream = unique_create (mfile->name, true, &filename); output_stream_regular = true; + /* Bug: utils.h (unique_create): cannot create a + "path/file" tree. Bugfix: If filename is set to + "path/file", a tree is created in the same way as + --directory-prefix does (see RFC5854). */ + if (filename == NULL && mfile->name) + filename = xstrdup (mfile->name); + /* Store the real file name for displaying in messages. */ opt.output_document = filename; -- 2.7.3
pgpc70rz6OMpZ.pgp
Description: PGP signature
