diff --git a/CHANGES b/CHANGES index a683aa8a5..8b9f552c4 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,9 @@ Changelog Daniel Stenberg (29 Sep 2008) +- Ian Lynagh provided a patch that now makes CURLOPT_RANGE work fine for SFTP + downloads! + - Maxim Ivanov filed bug report #2107803 (http://curl.haxx.se/bug/view.cgi?id=2107803) "no CURLINFO_REDIRECT_URL in multi mode" together with a patch that fixed the problem. diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 4ff8386a4..7a71b6824 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -29,6 +29,7 @@ This release includes the following bugfixes: o removed the use of mktime() and gmtime(_r)() in date parsing and conversions o HTTP Digest with a blank realm did wrong o CURLINFO_REDIRECT_URL didn't work with the multi interface + o CURLOPT_RANGE now works for SFTP downloads This release includes the following known bugs: @@ -44,6 +45,6 @@ advice from friends like these: Keith Mok, Yang Tse, Daniel Fandrich, Guenter Knauf, Dmitriy Sergeyev, Linus Nielsen Feltzing, Martin Drasar, Stefan Krause, Dmitry Kurochkin, Mike Revi, Andres Garcia, Michael Goffioul, Markus Moeller, Rob Crittenden, - Jamie Lokier, Emanuele Bovisio, Maxim Ivanov + Jamie Lokier, Emanuele Bovisio, Maxim Ivanov, Ian Lynagh Thanks! (and sorry if I forgot to mention someone) diff --git a/TODO-RELEASE b/TODO-RELEASE index 66d8ff56c..8b9af6f32 100644 --- a/TODO-RELEASE +++ b/TODO-RELEASE @@ -17,8 +17,6 @@ To be addressed before 7.19.1 (planned release: October/November 2008) possibly the same or related to "Potential issue when using the new PRIMARY_IP metric" -176 - "SFTP and CURLOPT_RANGE" - 177 - "[Patch] Disable proxy support" 178 - "[Patch] Disable multi API support" diff --git a/lib/ssh.c b/lib/ssh.c index b968dcf36..005eb265f 100644 --- a/lib/ssh.c +++ b/lib/ssh.c @@ -101,6 +101,7 @@ #include "inet_ntop.h" #include "parsedate.h" /* for the week day and month names */ #include "sockaddr.h" /* required for Curl_sockaddr_storage */ +#include "strtoofft.h" #include "multiif.h" #define _MPRINTF_REPLACE /* use our functions only */ @@ -1631,9 +1632,35 @@ static CURLcode ssh_statemach_act(struct connectdata *conn) data->req.maxdownload = -1; } else { - data->req.size = attrs.filesize; - data->req.maxdownload = attrs.filesize; - Curl_pgrsSetDownloadSize(data, attrs.filesize); + curl_off_t size; + + size = attrs.filesize; + if(conn->data->state.use_range) { + curl_off_t from, to; + char *ptr; + char *ptr2; + + from=curlx_strtoofft(conn->data->state.range, &ptr, 0); + while(ptr && *ptr && (isspace((int)*ptr) || (*ptr=='-'))) + ptr++; + to=curlx_strtoofft(ptr, &ptr2, 0); + if ((ptr == ptr2) /* no "to" value given */ + || (to > size)) { + to = size; + } + if (from > to) { + from = to; + size = 0; + } + else { + size = to - from + 1; + } + + libssh2_sftp_seek(conn->proto.sshc.sftp_handle, from); + } + data->req.size = size; + data->req.maxdownload = size; + Curl_pgrsSetDownloadSize(data, size); } /* We can resume if we can seek to the resume position */