On Fri, Sep 28, 2012 at 4:42 PM, Robert Dailey <span dir="ltr">&lt;<a href="mailto:rcdailey.lists@gmail.com" target="_blank">rcdailey.lists@gmail.com</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5">On Fri, Sep 28, 2012 at 2:58 PM, David Cole &lt;<a href="mailto:david.cole@kitware.com">david.cole@kitware.com</a>&gt; wrote:<br>
&gt; On Fri, Sep 28, 2012 at 3:30 PM, Robert Dailey &lt;<a href="mailto:rcdailey.lists@gmail.com">rcdailey.lists@gmail.com</a>&gt;<br>
&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; CMake downloads our third party libraries from a central repository<br>
&gt;&gt; and we have a &quot;manifest.cmake&quot; module where we define the following:<br>
&gt;&gt;<br>
&gt;&gt; - Library alias (the library&#39;s base name, such as &quot;boost&quot;, &quot;bdb&quot;,<br>
&gt;&gt; &quot;openssl&quot;)<br>
&gt;&gt; - Library version (e.g. 2.1.5)<br>
&gt;&gt; - Library iteration (A counter that is incremented if a library<br>
&gt;&gt; changes remotely without version # increasing (such as if we rebuild<br>
&gt;&gt; the same version of the library and it must be re-served))<br>
&gt;&gt;<br>
&gt;&gt; My third party download logic knows to download the following files:<br>
&gt;&gt;<br>
&gt;&gt; &lt;repo&gt;/&lt;alias&gt;/&lt;version&gt;/include.7z<br>
&gt;&gt; &lt;repo&gt;/&lt;alias&gt;/&lt;version&gt;/&lt;platform&gt;.7z<br>
&gt;&gt;<br>
&gt;&gt; In this case, platform will represent the toolchain -- such as<br>
&gt;&gt; vc9sp1.7z for the lib &amp; bin files for visual studio 2008 SP1.<br>
&gt;&gt;<br>
&gt;&gt; I have 2 files here, so I&#39;d need 2 MD5 values recorded in my manifest<br>
&gt;&gt; somewhere, but since I have 1 line per &quot;library&quot; (not per file that<br>
&gt;&gt; will be downloaded) it wouldn&#39;t work out very well.<br>
&gt;&gt;<br>
&gt;&gt; I want to keep my manifest simple and easy to look at and modify,<br>
&gt;&gt; adding a bunch of MD5 values will make it messy and harder to upgrade<br>
&gt;&gt; libraries (right now I just drop files on a server and add or modify a<br>
&gt;&gt; line in the manifest. Having MD5s would mean I would have to run<br>
&gt;&gt; another tool to calculate the MD5 and then stuff it somewhere in the<br>
&gt;&gt; manifest module)<br>
&gt;&gt;<br>
&gt;&gt; If you have some ideas on how to make this fit well into my system I&#39;m<br>
&gt;&gt; all for that, but I guess if not then I&#39;ll have to rely on assumptions<br>
&gt;&gt; :(<br>
&gt;&gt;<br>
&gt;&gt; However I strongly believe that CMake&#39;s file DOWNLOAD should do more<br>
&gt;&gt; checks to make sure that the data received is valid. I will look at<br>
&gt;&gt; the code later to see if there is more that can be done.<br>
&gt;&gt;<br>
&gt;&gt; On Wed, Sep 26, 2012 at 11:20 PM, David Cole &lt;<a href="mailto:david.cole@kitware.com">david.cole@kitware.com</a>&gt;<br>
&gt;&gt; wrote:<br>
&gt;&gt; &gt; On Wed, Sep 26, 2012 at 7:32 PM, Robert Dailey<br>
&gt;&gt; &gt; &lt;<a href="mailto:rcdailey.lists@gmail.com">rcdailey.lists@gmail.com</a>&gt; wrote:<br>
&gt;&gt; &gt;&gt; To do MD5 checks, I need to somehow record the expected MD5 somewhere,<br>
&gt;&gt; &gt;&gt; which isn&#39;t very maintainable.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; I provide a list of third party libraries that CMake should download<br>
&gt;&gt; &gt;&gt; from a central third party repository here at work. It is a trusted<br>
&gt;&gt; &gt;&gt; source, because we know it is, so we don&#39;t need to verify the MD5.<br>
&gt;&gt; &gt;&gt; However, if I could request the MD5 first, and then download, then<br>
&gt;&gt; &gt;&gt; compare the MD5 the server gave me with what I actually downloaded,<br>
&gt;&gt; &gt;&gt; that would certainly work just to verify the complete file was<br>
&gt;&gt; &gt;&gt; downloaded.<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;&gt; Other than that, I&#39;ll have to rely on the status of the operation...<br>
&gt;&gt; &gt;&gt; but I don&#39;t like that the destination file is created prior to any<br>
&gt;&gt; &gt;&gt; writes being possible by CMake (it can&#39;t write anything if no data was<br>
&gt;&gt; &gt;&gt; received, so why doesn&#39;t it create the file once it has a write<br>
&gt;&gt; &gt;&gt; buffer?)<br>
&gt;&gt; &gt;&gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Recording the MD5 somewhere is the only way to have a reasonable<br>
&gt;&gt; &gt; re-assurance that what you&#39;ve asked for is what you&#39;re getting from a<br>
&gt;&gt; &gt; network operation. It seems to me that it could be made &quot;maintainable&quot;<br>
&gt;&gt; &gt; if you centralize the knowledge of the checksums in a file that is<br>
&gt;&gt; &gt; changed whenever any of the downloadable files is changed.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; I guess we figure it&#39;s no use downloading bits over the network if you<br>
&gt;&gt; &gt; can&#39;t even open a (presumably local) output file for writing... so we<br>
&gt;&gt; &gt; try to open the output file for writing first, and if it succeeds,<br>
&gt;&gt; &gt; then we start grabbing bits from the network and writing them into the<br>
&gt;&gt; &gt; file as we receive them.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; There is room for improvement in the file(DOWNLOAD implementation, but<br>
&gt;&gt; &gt; it is the way it is right now (and will be for 2.8.10 as well...)<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Start proposing improvements for it now, and submitting patches to<br>
&gt;&gt; &gt; make stuff better for 2.8.11 and/or beyond. :-)<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; HTH,<br>
&gt;&gt; &gt; David<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; You can rely on the STATUS to see if there were any errors during the<br>
&gt; download. If the error code is 0, then you got whatever was on the server.<br>
&gt; You can rely on that.<br>
&gt;<br>
&gt; So, if you don&#39;t want to use a hash, you can rely on STATUS. I do not know<br>
&gt; of any case that reports a &quot;0&quot; status code, but gives an incorrect file<br>
&gt; result.<br>
&gt;<br>
&gt;<br>
&gt; What you *can&#39;t* rely on is that the correct thing was on the server. And to<br>
&gt; validate that, you should use checksums of some sort. (If you can&#39;t or don&#39;t<br>
&gt; want to, that&#39;s fine. To each his own.) Starting with CMake 2.8.10, there<br>
&gt; will be EXPECTED_HASH and you can use the hashing algorithm of your choice<br>
&gt; rather than just the MD5 that we had in 2.8.9 and earlier...<br>
&gt;<br>
&gt; Also new in 2.8.10, the Kitware provided pre-built binaries will link to<br>
&gt; OpenSSL such that we can handle downloading files from &quot;https://&quot; URLs.<br>
<br>
</div></div>In my tests, I&#39;ve found that redirects can affect the return code of<br>
STATUS. For example, if I try to initiate a download of a file that<br>
doesn&#39;t really exist, the HTTP server may return a &quot;dummy&quot; file, in<br>
that case it would be downloaded just fine no matter what the URL or<br>
filename is, and status wouldn&#39;t know the difference.<br>
<br>
However for FTP URLs, it is generally more honest (since HTTP can do<br>
funny things, like lie to you).<br>
</blockquote></div><div><br></div><br><div>What version of CMake are you using? Server side redirects should be followed properly since this commit:</div><div><br></div><div>  <a href="http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=ef491f78218e255339278656bf6dc26073fef264">http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=ef491f78218e255339278656bf6dc26073fef264</a></div>
<div><br></div><div>Which has been in CMake for more than 2 years since 2.8.2...</div><div><br></div>