114 lines
3.8 KiB
Plaintext
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
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
///////////////////////////////////////////////////////////////////////////////
|