mirror of
https://github.com/moparisthebest/curl
synced 2024-11-16 14:35:03 -05:00
parent
f02c34476d
commit
e04417d98f
@ -54,7 +54,7 @@ LIB_CFILES = file.c timeval.c base64.c hostip.c progress.c formdata.c \
|
|||||||
http_ntlm.c curl_ntlm_wb.c curl_ntlm_core.c curl_sasl.c rand.c \
|
http_ntlm.c curl_ntlm_wb.c curl_ntlm_core.c curl_sasl.c rand.c \
|
||||||
curl_multibyte.c hostcheck.c conncache.c pipeline.c dotdot.c \
|
curl_multibyte.c hostcheck.c conncache.c pipeline.c dotdot.c \
|
||||||
x509asn1.c http2.c smb.c curl_endian.c curl_des.c system_win32.c \
|
x509asn1.c http2.c smb.c curl_endian.c curl_des.c system_win32.c \
|
||||||
mime.c sha256.c setopt.c curl_path.c curl_ctype.c
|
mime.c sha256.c setopt.c curl_path.c curl_ctype.c curl_range.c
|
||||||
|
|
||||||
LIB_HFILES = arpa_telnet.h netrc.h file.h timeval.h hostip.h progress.h \
|
LIB_HFILES = arpa_telnet.h netrc.h file.h timeval.h hostip.h progress.h \
|
||||||
formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h if2ip.h \
|
formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h if2ip.h \
|
||||||
@ -74,7 +74,7 @@ LIB_HFILES = arpa_telnet.h netrc.h file.h timeval.h hostip.h progress.h \
|
|||||||
curl_setup_once.h multihandle.h setup-vms.h pipeline.h dotdot.h \
|
curl_setup_once.h multihandle.h setup-vms.h pipeline.h dotdot.h \
|
||||||
x509asn1.h http2.h sigpipe.h smb.h curl_endian.h curl_des.h \
|
x509asn1.h http2.h sigpipe.h smb.h curl_endian.h curl_des.h \
|
||||||
curl_printf.h system_win32.h rand.h mime.h curl_sha256.h setopt.h \
|
curl_printf.h system_win32.h rand.h mime.h curl_sha256.h setopt.h \
|
||||||
curl_path.h curl_ctype.h
|
curl_path.h curl_ctype.h curl_range.h
|
||||||
|
|
||||||
LIB_RCFILES = libcurl.rc
|
LIB_RCFILES = libcurl.rc
|
||||||
|
|
||||||
|
90
lib/curl_range.c
Normal file
90
lib/curl_range.c
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
|
*
|
||||||
|
* This software is licensed as described in the file COPYING, which
|
||||||
|
* you should have received as part of this distribution. The terms
|
||||||
|
* are also available at https://curl.haxx.se/docs/copyright.html.
|
||||||
|
*
|
||||||
|
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||||
|
* copies of the Software, and permit persons to whom the Software is
|
||||||
|
* furnished to do so, under the terms of the COPYING file.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
|
*
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include "curl_setup.h"
|
||||||
|
#include <curl/curl.h>
|
||||||
|
#include "curl_range.h"
|
||||||
|
#include "sendf.h"
|
||||||
|
#include "strtoofft.h"
|
||||||
|
|
||||||
|
/* Only include this function if one or more of FTP, FILE are enabled. */
|
||||||
|
#if !defined(CURL_DISABLE_FTP) && !defined(CURL_DISABLE_FILE)
|
||||||
|
|
||||||
|
/*
|
||||||
|
Check if this is a range download, and if so, set the internal variables
|
||||||
|
properly.
|
||||||
|
*/
|
||||||
|
CURLcode Curl_range(struct connectdata *conn)
|
||||||
|
{
|
||||||
|
curl_off_t from, to;
|
||||||
|
curl_off_t totalsize = -1;
|
||||||
|
char *ptr;
|
||||||
|
char *ptr2;
|
||||||
|
struct Curl_easy *data = conn->data;
|
||||||
|
|
||||||
|
if(data->state.use_range && data->state.range) {
|
||||||
|
CURLofft from_t;
|
||||||
|
CURLofft to_t;
|
||||||
|
from_t = curlx_strtoofft(data->state.range, &ptr, 0, &from);
|
||||||
|
if(from_t == CURL_OFFT_FLOW)
|
||||||
|
return CURLE_RANGE_ERROR;
|
||||||
|
while(*ptr && (ISSPACE(*ptr) || (*ptr == '-')))
|
||||||
|
ptr++;
|
||||||
|
to_t = curlx_strtoofft(ptr, &ptr2, 0, &to);
|
||||||
|
if(to_t == CURL_OFFT_FLOW)
|
||||||
|
return CURLE_RANGE_ERROR;
|
||||||
|
if((to_t == CURL_OFFT_INVAL) && !from_t) {
|
||||||
|
/* X - */
|
||||||
|
data->state.resume_from = from;
|
||||||
|
DEBUGF(infof(data, "RANGE %" CURL_FORMAT_CURL_OFF_T " to end of file\n",
|
||||||
|
from));
|
||||||
|
}
|
||||||
|
else if((from_t == CURL_OFFT_INVAL) && !to_t) {
|
||||||
|
/* -Y */
|
||||||
|
data->req.maxdownload = to;
|
||||||
|
data->state.resume_from = -to;
|
||||||
|
DEBUGF(infof(data, "RANGE the last %" CURL_FORMAT_CURL_OFF_T " bytes\n",
|
||||||
|
to));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* X-Y */
|
||||||
|
totalsize = to-from;
|
||||||
|
if(totalsize == CURL_OFF_T_MAX)
|
||||||
|
/* this is too big to increase, so bail out */
|
||||||
|
return CURLE_RANGE_ERROR;
|
||||||
|
data->req.maxdownload = totalsize + 1; /* include last byte */
|
||||||
|
data->state.resume_from = from;
|
||||||
|
DEBUGF(infof(data, "RANGE from %" CURL_FORMAT_CURL_OFF_T
|
||||||
|
" getting %" CURL_FORMAT_CURL_OFF_T " bytes\n",
|
||||||
|
from, data->req.maxdownload));
|
||||||
|
}
|
||||||
|
DEBUGF(infof(data, "range-download from %" CURL_FORMAT_CURL_OFF_T
|
||||||
|
" to %" CURL_FORMAT_CURL_OFF_T ", totally %"
|
||||||
|
CURL_FORMAT_CURL_OFF_T " bytes\n",
|
||||||
|
from, to, data->req.maxdownload));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
data->req.maxdownload = -1;
|
||||||
|
return CURLE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
30
lib/curl_range.h
Normal file
30
lib/curl_range.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#ifndef HEADER_CURL_RANGE_H
|
||||||
|
#define HEADER_CURL_RANGE_H
|
||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
|
*
|
||||||
|
* This software is licensed as described in the file COPYING, which
|
||||||
|
* you should have received as part of this distribution. The terms
|
||||||
|
* are also available at https://curl.haxx.se/docs/copyright.html.
|
||||||
|
*
|
||||||
|
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||||
|
* copies of the Software, and permit persons to whom the Software is
|
||||||
|
* furnished to do so, under the terms of the COPYING file.
|
||||||
|
*
|
||||||
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||||
|
* KIND, either express or implied.
|
||||||
|
*
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include "curl_setup.h"
|
||||||
|
#include "urldata.h"
|
||||||
|
|
||||||
|
CURLcode Curl_range(struct connectdata *conn);
|
||||||
|
|
||||||
|
#endif /* HEADER_CURL_RANGE_H */
|
62
lib/file.c
62
lib/file.c
@ -61,6 +61,7 @@
|
|||||||
#include "url.h"
|
#include "url.h"
|
||||||
#include "parsedate.h" /* for the week day and month names */
|
#include "parsedate.h" /* for the week day and month names */
|
||||||
#include "warnless.h"
|
#include "warnless.h"
|
||||||
|
#include "curl_range.h"
|
||||||
/* The last 3 #include files should be in this order */
|
/* The last 3 #include files should be in this order */
|
||||||
#include "curl_printf.h"
|
#include "curl_printf.h"
|
||||||
#include "curl_memory.h"
|
#include "curl_memory.h"
|
||||||
@ -125,65 +126,6 @@ static CURLcode file_setup_connection(struct connectdata *conn)
|
|||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
Check if this is a range download, and if so, set the internal variables
|
|
||||||
properly. This code is copied from the FTP implementation and might as
|
|
||||||
well be factored out.
|
|
||||||
*/
|
|
||||||
static CURLcode file_range(struct connectdata *conn)
|
|
||||||
{
|
|
||||||
curl_off_t from, to;
|
|
||||||
curl_off_t totalsize = -1;
|
|
||||||
char *ptr;
|
|
||||||
char *ptr2;
|
|
||||||
struct Curl_easy *data = conn->data;
|
|
||||||
|
|
||||||
if(data->state.use_range && data->state.range) {
|
|
||||||
CURLofft from_t;
|
|
||||||
CURLofft to_t;
|
|
||||||
from_t = curlx_strtoofft(data->state.range, &ptr, 0, &from);
|
|
||||||
if(from_t == CURL_OFFT_FLOW)
|
|
||||||
return CURLE_RANGE_ERROR;
|
|
||||||
while(*ptr && (ISSPACE(*ptr) || (*ptr == '-')))
|
|
||||||
ptr++;
|
|
||||||
to_t = curlx_strtoofft(ptr, &ptr2, 0, &to);
|
|
||||||
if(to_t == CURL_OFFT_FLOW)
|
|
||||||
return CURLE_RANGE_ERROR;
|
|
||||||
if((to_t == CURL_OFFT_INVAL) && !from_t) {
|
|
||||||
/* X - */
|
|
||||||
data->state.resume_from = from;
|
|
||||||
DEBUGF(infof(data, "RANGE %" CURL_FORMAT_CURL_OFF_T " to end of file\n",
|
|
||||||
from));
|
|
||||||
}
|
|
||||||
else if((from_t == CURL_OFFT_INVAL) && !to_t) {
|
|
||||||
/* -Y */
|
|
||||||
data->req.maxdownload = to;
|
|
||||||
data->state.resume_from = -to;
|
|
||||||
DEBUGF(infof(data, "RANGE the last %" CURL_FORMAT_CURL_OFF_T " bytes\n",
|
|
||||||
to));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* X-Y */
|
|
||||||
totalsize = to-from;
|
|
||||||
if(totalsize == CURL_OFF_T_MAX)
|
|
||||||
/* this is too big to increase, so bail out */
|
|
||||||
return CURLE_RANGE_ERROR;
|
|
||||||
data->req.maxdownload = totalsize + 1; /* include last byte */
|
|
||||||
data->state.resume_from = from;
|
|
||||||
DEBUGF(infof(data, "RANGE from %" CURL_FORMAT_CURL_OFF_T
|
|
||||||
" getting %" CURL_FORMAT_CURL_OFF_T " bytes\n",
|
|
||||||
from, data->req.maxdownload));
|
|
||||||
}
|
|
||||||
DEBUGF(infof(data, "range-download from %" CURL_FORMAT_CURL_OFF_T
|
|
||||||
" to %" CURL_FORMAT_CURL_OFF_T ", totally %"
|
|
||||||
CURL_FORMAT_CURL_OFF_T " bytes\n",
|
|
||||||
from, to, data->req.maxdownload));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
data->req.maxdownload = -1;
|
|
||||||
return CURLE_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* file_connect() gets called from Curl_protocol_connect() to allow us to
|
* file_connect() gets called from Curl_protocol_connect() to allow us to
|
||||||
* do protocol-specific actions at connect-time. We emulate a
|
* do protocol-specific actions at connect-time. We emulate a
|
||||||
@ -514,7 +456,7 @@ static CURLcode file_do(struct connectdata *conn, bool *done)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Check whether file range has been specified */
|
/* Check whether file range has been specified */
|
||||||
file_range(conn);
|
Curl_range(conn);
|
||||||
|
|
||||||
/* Adjust the start offset in case we want to get the N last bytes
|
/* Adjust the start offset in case we want to get the N last bytes
|
||||||
* of the stream iff the filesize could be determined */
|
* of the stream iff the filesize could be determined */
|
||||||
|
65
lib/ftp.c
65
lib/ftp.c
@ -59,6 +59,7 @@
|
|||||||
#include "ftp.h"
|
#include "ftp.h"
|
||||||
#include "fileinfo.h"
|
#include "fileinfo.h"
|
||||||
#include "ftplistparser.h"
|
#include "ftplistparser.h"
|
||||||
|
#include "curl_range.h"
|
||||||
#include "curl_sec.h"
|
#include "curl_sec.h"
|
||||||
#include "strtoofft.h"
|
#include "strtoofft.h"
|
||||||
#include "strcase.h"
|
#include "strcase.h"
|
||||||
@ -3462,62 +3463,6 @@ ftp_pasv_verbose(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
Check if this is a range download, and if so, set the internal variables
|
|
||||||
properly.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static CURLcode ftp_range(struct connectdata *conn)
|
|
||||||
{
|
|
||||||
curl_off_t from, to;
|
|
||||||
char *ptr;
|
|
||||||
struct Curl_easy *data = conn->data;
|
|
||||||
struct ftp_conn *ftpc = &conn->proto.ftpc;
|
|
||||||
|
|
||||||
if(data->state.use_range && data->state.range) {
|
|
||||||
CURLofft from_t;
|
|
||||||
CURLofft to_t;
|
|
||||||
from_t = curlx_strtoofft(data->state.range, &ptr, 0, &from);
|
|
||||||
if(from_t == CURL_OFFT_FLOW)
|
|
||||||
return CURLE_RANGE_ERROR;
|
|
||||||
while(*ptr && (ISSPACE(*ptr) || (*ptr == '-')))
|
|
||||||
ptr++;
|
|
||||||
to_t = curlx_strtoofft(ptr, NULL, 0, &to);
|
|
||||||
if(to_t == CURL_OFFT_FLOW)
|
|
||||||
return CURLE_RANGE_ERROR;
|
|
||||||
if((to_t == CURL_OFFT_INVAL) && !from_t) {
|
|
||||||
/* X - */
|
|
||||||
data->state.resume_from = from;
|
|
||||||
DEBUGF(infof(conn->data, "FTP RANGE %" CURL_FORMAT_CURL_OFF_T
|
|
||||||
" to end of file\n", from));
|
|
||||||
}
|
|
||||||
else if(!to_t && (from_t == CURL_OFFT_INVAL)) {
|
|
||||||
/* -Y */
|
|
||||||
data->req.maxdownload = to;
|
|
||||||
data->state.resume_from = -to;
|
|
||||||
DEBUGF(infof(conn->data, "FTP RANGE the last %" CURL_FORMAT_CURL_OFF_T
|
|
||||||
" bytes\n", to));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* X-Y */
|
|
||||||
data->req.maxdownload = (to - from) + 1; /* include last byte */
|
|
||||||
data->state.resume_from = from;
|
|
||||||
DEBUGF(infof(conn->data, "FTP RANGE from %" CURL_FORMAT_CURL_OFF_T
|
|
||||||
" getting %" CURL_FORMAT_CURL_OFF_T " bytes\n",
|
|
||||||
from, data->req.maxdownload));
|
|
||||||
}
|
|
||||||
DEBUGF(infof(conn->data, "range-download from %" CURL_FORMAT_CURL_OFF_T
|
|
||||||
" to %" CURL_FORMAT_CURL_OFF_T ", totally %"
|
|
||||||
CURL_FORMAT_CURL_OFF_T " bytes\n",
|
|
||||||
from, to, data->req.maxdownload));
|
|
||||||
ftpc->dont_check = TRUE; /* don't check for successful transfer */
|
|
||||||
}
|
|
||||||
else
|
|
||||||
data->req.maxdownload = -1;
|
|
||||||
return CURLE_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ftp_do_more()
|
* ftp_do_more()
|
||||||
*
|
*
|
||||||
@ -3640,7 +3585,13 @@ static CURLcode ftp_do_more(struct connectdata *conn, int *completep)
|
|||||||
/* download */
|
/* download */
|
||||||
ftp->downloadsize = -1; /* unknown as of yet */
|
ftp->downloadsize = -1; /* unknown as of yet */
|
||||||
|
|
||||||
result = ftp_range(conn);
|
result = Curl_range(conn);
|
||||||
|
|
||||||
|
if(result == CURLE_OK && data->req.maxdownload >= 0) {
|
||||||
|
/* Don't check for successful transfer */
|
||||||
|
ftpc->dont_check = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
if(result)
|
if(result)
|
||||||
;
|
;
|
||||||
else if(data->set.ftp_list_only || !ftpc->file) {
|
else if(data->set.ftp_list_only || !ftpc->file) {
|
||||||
|
@ -39,7 +39,7 @@ SOURCE \
|
|||||||
asyn-ares.c asyn-thread.c curl_gssapi.c http_ntlm.c curl_ntlm_wb.c \
|
asyn-ares.c asyn-thread.c curl_gssapi.c http_ntlm.c curl_ntlm_wb.c \
|
||||||
curl_ntlm_core.c curl_sasl.c vtls/schannel.c curl_multibyte.c \
|
curl_ntlm_core.c curl_sasl.c vtls/schannel.c curl_multibyte.c \
|
||||||
vtls/darwinssl.c conncache.c curl_sasl_sspi.c smb.c curl_endian.c \
|
vtls/darwinssl.c conncache.c curl_sasl_sspi.c smb.c curl_endian.c \
|
||||||
curl_des.c system_win32.c sha256.c \
|
curl_des.c curl_range.c system_win32.c sha256.c \
|
||||||
vauth/vauth.c vauth/cleartext.c vauth/cram.c vauth/digest.c \
|
vauth/vauth.c vauth/cleartext.c vauth/cram.c vauth/digest.c \
|
||||||
vauth/digest_sspi.c vauth/krb5_gssapi.c vauth/krb5_sspi.c \
|
vauth/digest_sspi.c vauth/krb5_gssapi.c vauth/krb5_sspi.c \
|
||||||
vauth/ntlm.c vauth/ntlm_sspi.c vauth/oauth2.c vauth/spnego_gssapi.c \
|
vauth/ntlm.c vauth/ntlm_sspi.c vauth/oauth2.c vauth/spnego_gssapi.c \
|
||||||
|
Loading…
Reference in New Issue
Block a user