101 lines
2.9 KiB
Rexx
101 lines
2.9 KiB
Rexx
/*
|
|
* Rexx/CURL sample program to mimic getright; a download program
|
|
* with RESUME support
|
|
* Arguments:
|
|
* source: protocol://location/file.ext
|
|
* destination: directory
|
|
*/
|
|
Call RxFuncAdd 'CurlLoadFuncs', 'rexxcurl', 'CurlLoadFuncs'
|
|
Call CurlLoadFuncs
|
|
|
|
Parse Arg url dir
|
|
If dir = '' Then
|
|
Do
|
|
Say 'No directory supplied'
|
|
Exit 1
|
|
End
|
|
|
|
pos = Lastpos( '/', url )
|
|
fname = Substr( url, pos+1 )
|
|
If Right( dir, 1 ) \= !REXXCURL.!DIRSEP Then dir = dir||!REXXCURL.!DIRSEP
|
|
dest = dir||fname
|
|
size = Stream( dest, 'C', 'QUERY SIZE' )
|
|
say Stream( dest, 'C', 'QUERY EXISTS' )
|
|
|
|
capath = ''
|
|
Parse Source os . prog
|
|
Select
|
|
When os = 'WIN32' | os = 'WIN64' | os = 'OS2' | os = 'OS/2' Then
|
|
Do
|
|
capath = 'e:\etc\pki\tls\certs'
|
|
End
|
|
Otherwise Nop
|
|
End
|
|
curl = CurlInit()
|
|
If curl \= '' Then
|
|
Do
|
|
msg = 'We are running' CurlVariable('VERSION')
|
|
Say Copies( '*', Length( msg ) )
|
|
Say msg
|
|
Say Copies( '*', Length( msg ) )
|
|
Say
|
|
|
|
Call CurlSetopt curl, 'URL', url
|
|
If curlerror.intcode \= 0 Then Call Abort 'Error setting URL option'
|
|
|
|
append = 'OVERWRITE'
|
|
If size \= '' Then
|
|
Do
|
|
Call CurlSetopt curl, 'RESUMEFROM', size
|
|
If curlerror.intcode \= 0 Then Call Abort 'Error setting RESUMEFROM option'
|
|
append = 'APPEND'
|
|
End
|
|
|
|
Call CurlSetopt curl, 'OUTFILE', dest, append
|
|
If curlerror.intcode \= 0 Then Call Abort 'Error setting OUTFILE option'
|
|
|
|
Call CurlSetopt curl, 'PROGRESSFUNCTION', 'progresscallback'
|
|
If curlerror.intcode \= 0 Then Call Abort 'Error setting PROGRESSFUNCTION option'
|
|
|
|
Call CurlSetopt curl, 'SSLVERIFYPEER', 0
|
|
If curlerror.intcode \= 0 Then Call Abort 'Error setting SSLVERIFYPEER option'
|
|
|
|
Call CurlSetopt curl, 'SSLVERIFYHOST', 0
|
|
If curlerror.intcode \= 0 Then Call Abort 'Error setting SSLVERIFYHOST option'
|
|
|
|
Call CurlSetopt curl, 'FOLLOWLOCATION', 1
|
|
If curlerror.intcode \= 0 Then Call Abort 'Error setting FOLLOWLOCATION option'
|
|
|
|
If capath \= '' Then
|
|
Do
|
|
Call CurlSetopt curl, 'CAPATH', capath
|
|
If curlerror.intcode \= 0 Then Call Abort 'Error setting CAPATH option'
|
|
End
|
|
|
|
Call CurlPerform curl
|
|
If curlerror.intcode \= 0 Then Call Abort 'Error getting source of' url
|
|
/*
|
|
* Cleanup the connection
|
|
*/
|
|
Call CurlCLeanup curl
|
|
End
|
|
--Call CurlDropFuncs 'UNLOAD'
|
|
Return 0
|
|
|
|
ProgressCallback:
|
|
Parse Arg dltotal, dlnow, .
|
|
dltotal = dltotal + 0
|
|
dlnow = dlnow + 0
|
|
If dltotal = 0 | dlnow = 0 Then Return 0
|
|
Say 'Downloaded:' dlnow 'of' dltotal';' dlnow / dltotal * 100'%'
|
|
Return 0
|
|
|
|
Abort: Procedure Expose curlerror. curl
|
|
Parse Arg msg
|
|
Say msg
|
|
If curlerror.curlcode \= 0 Then Say 'cURL error:' curlerror.curlcode '-' curlerror.curlerrm
|
|
Else Say 'RexxCURL error:' curlerror.intcode '-' curlerror.interrm
|
|
Call CurlCLeanup curl
|
|
--Call CurlDropFuncs 'UNLOAD'
|
|
Exit 1
|