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

114 lines
3.8 KiB
Plaintext

compile function rti_Run_HTTPServer_Request( httpServer, requestID, requestHeaders )
/*
****************************************************************************
** IF YOU WANT TO MODIFY THIS FOR YOUR OWN APPLICATIONS PLEASE USE A COPY **
** DO NOT CHANGE THIS PROGRAM AS IT MAY BE OVERWRITTEN BY FUTURE UPDATES! **
****************************************************************************
** Copyright (C) 2012-2022 Revelation Software Inc. All Rights Reserved **
Author : Mr C
Date : March 2021 - Lockdown 3 (still)
Purpose : Core handler for running HTTPSERVER requests
Comments
========
This is basically an analog of RUN_OECGI_REQUEST and is intended to be
called from the HTTPREQUEST event of an HTTPSERVER control.
Assumptions:
1) This proc is always in EventContext from an HTTPREQUEST event, and
2) This proc is called as a quick event
This has error-handling implications due to the fact that:
1) The promoted handler forwards the event to a QE handler and then
checks EventStatus() to see if it should continue.
2) If so then it executes a SENDRESPONSE method to return content to the
client.
We don't want to stop that last step otherwise the client will time out, so
_this_ proc will _not_ set the EventStatus() if it encounters an error -
instead it will raise an HTTPERROR event on the server and ensure that
the SP Status is also cleared.
If the handler proc wants to issue it's own send and set the EventStatus then
it is free to do so.
Amended Date Reason
======= ==== ======
*/
#pragma precomp event_precomp
declare function rti_Convert, rti_Verify_Proc, rti_UC, rti_ErrorText
$insert ps_HTTPServer_Equates
$insert rti_SSP_Equates
$insert rti_Text_Equates
$insert logical
equ HTTPSVR_PREFIX$ to "HTTPSVR_"
errStat = FALSE$
errInfo = ""
retVal = TRUE$
procID = rti_UC( requestHeaders<PS_HSVR_REQHDR_PATHINFO$> )[-1, "B/"]
if ( procID[1,8] != HTTPSVR_PREFIX$ ) then
procID = HTTPSVR_PREFIX$ : procID
end
call set_Status( SETSTAT_OK$ )
if rti_Verify_Proc( procID, FALSE$, 3, "" ) else
// Not a valid HTTPSVR_ proc ...
call get_status( errInfo ) ; goSub setHTTPError
@httpServer->SetResponseStatus( requestID, 404 ) ; // HTTP 404 - not found
return FALSE$
end
call @procID( httpServer, requestID, requestHeaders )
if get_Status( errInfo ) then
// Something got away from the handler? Make a note and then let it
// through.
call set_Status( SETSTAT_OK$ )
goSub setHTTPError
return FALSE$
end
return TRUE$
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// setHTTPError subroutine
//
// This subroutine raises an HTTPERROR event for each error string contained
// in the errInfo var.
//
// ----------------------------------------------------------------------------
// [i] errInfo : @fm'd list of errors to report
// ----------------------------------------------------------------------------
setHTTPError:
errInfo = rti_ErrorText( "SP", errInfo )
pos = 1
loop
tmp = errInfo[pos,@fm,TRUE$]; pos += bCol2()+1
if bLen( tmp ) then
@httpServer->postEvent( "HTTPERROR", requestID, errInfo )
end
while ( pos < bLen( errInfo ) )
repeat
return
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////