open-insight/SYSPROG/STPROC/RTI_HTTP_DOWNLOAD.txt
2024-03-25 15:17:34 -07:00

264 lines
9.2 KiB
Plaintext

compile function rti_HTTP_Download( uiParams, url, method, payload, credentials, headers, timeoutInfo, responseFile )
/*
** Copyright (C) 2013-2019 Revelation Software Inc. All Rights Reserved **
Author : Mr C
Date : June 2019
Purpose : Stored procedure to initiate an asynchronous HTTP download
Parameters
==========
uiParams - [required] This is an @fm delimited array of UI info for the
download process:
<1> Parent Window [optional]
ID of the parent window for the download dialog. If not
specified the caller must provide a CallBackID to receive
the returned response content.
<2> Modal Flag [optional]. If TRUE then the parent window
will be disabled for the duration of the download.
<3> EndDialogAsyncID [optional]
Callback token for the download to return to the parent
window's ENDDIALOG event as the AsyncID parameter.
<4> CallbackProc [optional]
Name of a stored procedure to call with the response data
if EndDialogAsyncID is not specified. The Callback
proc must support the following interface:
proc( callbackID, responseContent )
<5> CallbackID [optional, required for CallbackProc]
If a CallBackProc is specified this field contains a
token returned to the CallBackProc with the response
content
<6> Info text [optional]
Contains text to display in the dialog - defaults to
the URL
<7> Show Progress in Taskbar [optional]
If TRUE$ then sync the progress bar to the parent
window's task bar icon. Defaults to FALSE$.
<8> Hide UI [optional]
If TRUE$ then don't show the progress dialog.
url - [required] Contains the URL to download from
method - [optional] HTTP verb (GET,POST,HEAD,DELETE etc). Defaults
to "GET
payload - [optional] Content to send to the server as part of the
request
credentials - [optional] Username and password to send to the server
<1> Username
<2> Password>
headers - [optional] - Dynamic array of request headers to send to
the server in the format:
<1> @vm'd list of header names
<2> @vm'd list of header values
timeoutInfo - [optional] Timeout in milliseconds.
responseFile- [optional] Name of a file to download the response
content to
Returns
=======
TRUE$ if the download was started sucessfully, or FALSE$ otherwise.
Error information is returned via Get/Set_Status().
Comments
========
This function is designed to mimic the existing OLE_GETWEBPAGE stored proc
and provide an example of how to use the HTTPCLIENT control to provide
a UI for a download. As such the arguments passed have been kept to the
same format as much as possible.
Changes from OLE_GETWEBPAGE are:
1) "parentID" has been added so we can specify a parent window for the
progress dialog
2) "timeoutInfo" only supports a single value - the HTTPCLIENT control
does not have separate timeout parameters for different states
3) "responseBody" has been removed - the actual response content is
returned directly from this this proc - there is no separate
responseText property as per the XMLHTTPRequest object
Amended Date Reason
======= ==== ======
Mr C 09 Mar 22 Implemented HDL_UIPARAM_POS_HIDEUI$ uiParam option
*/
#pragma precomp event_precomp
declare function get_Property, set_Property, exec_Method, get_Status
declare function rti_UC, start_Window
$insert rti_HTTP_Download_Equates
$insert ps_HttpClient_Equates
$insert msWin_ShowWindow_Equates
$insert rti_Get_Proc_Info_Equates
$insert rti_SSP_Equates
$insert logical
if assigned( uiParams ) else uiParams = ""
if assigned( url ) else url = ""
if assigned( method ) else method = ""
if assigned( payload ) else payload = ""
if assigned( credentials ) else credentials = ""
if assigned( headers ) else headers = ""
if assigned( timeoutInfo ) else timeoutInfo = ""
if assigned( responseFile ) else responseFile = ""
if bLen( url ) else
call set_Status( TRUE$, "No URL passed to the RTI_HTTP_DOWNLOAD procedure" )
return FALSE$
end
if bLen( method ) else
method = "GET"
end
parentID = uiParams<HDL_UIPARAM_POS_PARENTWIN$>
if bLen( parentID ) then
if get_Property( parentID, "HANDLE" ) else
call set_Status( TRUE$, "Invalid parent ID " : quote( parentID ) : " passed to the RTI_HTTP_DOWNLOAD procedure" )
return FALSE$
end
end
procID = uiParams<HDL_UIPARAM_POS_CALLBACKPROC$>
if blen( procID ) then
procInfo = rti_Get_Proc_Info( procID )
if get_Status() then
return FALSE$
end
if ( procInfo<GPI_ARGCOUNT$> < 2 ) then
call set_Status( TRUE$, "Invalid proc ID " : quote( procID ) : " passed to the RTI_HTTP_DOWNLOAD procedure [Invalid interface]" )
return FALSE$
end
end
call set_Status( FALSE$ )
winID = start_Window( "RTI_HTTP_DOWNLOAD_UI", parentID, uiParams )
if bLen( winID ) else
// Error information is in SSP status
return FALSE$
end
objxArray = winID : ".HCL_DOWNLOAD"
propArray = "URL"
dataArray = url
objxArray := @rm : winID : ".HCL_DOWNLOAD"
propArray := @rm : "VERB"
dataArray := @rm : rti_UC( method : "" )
if bLen( credentials ) then
objxArray := @rm : winID : ".HCL_DOWNLOAD"
propArray := @rm : "USERNAME"
dataArray := @rm : credentials<1>
objxArray := @rm : winID : ".HCL_DOWNLOAD"
propArray := @rm : "PASSWORD"
dataArray := @rm : credentials<2>
end
if bLen( headers ) then
// This is in "ARRAY" format - the control wants this in
// "LIST" format
objxArray := @rm : winID : ".HCL_DOWNLOAD"
propArray := @rm : "REQUESTHEADERS"
dataArray := @rm : exec_Method( "SYSTEM", "ARRAY2LIST", headers )
end
if bLen( timeoutInfo ) then
objxArray := @rm : winID : ".HCL_DOWNLOAD"
propArray := @rm : "TIMEOUT"
dataArray := @rm : timeoutInfo<1>
end
if bLen( responseFile ) then
objxArray := @rm : winID : ".HCL_DOWNLOAD"
propArray := @rm : "RESPONSEFILE"
dataArray := @rm : responseFile
end
tmp = uiParams<HDL_UIPARAM_POS_DOWNLOADTEXT$>
if blen( tmp ) else
tmp = get_Property( winID : ".TXT_DOWNLOAD", "TEXT" )
end
swap "%1%" with url in tmp
call set_Property_Only( winID : ".TXT_DOWNLOAD", "TEXT", tmp )
if uiParams<HDL_UIPARAM_POS_HIDEUI$> else
objxArray := @rm : winID
propArray := @rm : "VISIBLE"
dataArray := @rm : SW_SHOWNORMAL$
end
call set_Property( objxArray, propArray, dataArray )
bVal = exec_Method( winID : ".HCL_DOWNLOAD", "OPEN" )
if bVal else
errorText = trim( get_Property( winID : ".HCL_DOWNLOAD", "ERRORTEXT" ) )
call exec_Method( winID, "CLOSE" )
if bLen( errorText ) else
errorText = "Unknown HTTPCLIENT OPEN error"
end
call set_Status( TRUE$, errorText )
return FALSE$
end
bVal = exec_Method( winID : ".HCL_DOWNLOAD", "SEND", payload )
if bVal else
errorText = trim( get_Property( winID : ".HCL_DOWNLOAD", "ERRORTEXT" ) )
call exec_Method( winID, "CLOSE" )
if bLen( errorText ) else
errorText = "Unknown HTTPCLIENT SEND error"
end
call set_Status( TRUE$, errorText )
return FALSE$
end
return TRUE$
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////