Function HTTP_Metrology_Services(RemainingURL) /*********************************************************************************************************************** This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written permission from SRP Computer Solutions, Inc. Name : HTTP_Metrology_Services Description : Handler program for the HTTP Metrology service module. Notes : All HTTP web services should include the HTTP_SERVICE_SETUP insert. This will provide several useful variables: APIURL - The base URL for the API entry point (e.g., api.mysite.com/v1). FullEndPointURL - The URL submitted by the client. HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.) SelfURL - The URL path representing the current service. NextSegment - The URL segment immediately following the SelfURL (if any). This could contain the name of the next service or it could contain the Item ID for the current service (aka resource). CurrentServiceHandler - The name of the currently running BASIC+ stored procedure. Parameters : RemainingURL [in] -- The remaining portion of the URL that follows the URL that launched this current service. This information is used in the HTTP_SERVICE_SETUP insert to populate other useful variables (see Notes above). Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure Metadata : @@DEFINE_SERVICES_SIGNATURE(@SERVICE, RemainingURL) @@DEFINE_UNQUOTED_OPTIONS BOOLEAN(True$, False$) History : (Date, Initials, Notes) 08/19/16 dmb Original programmer. - [IREPIOI-8] ***********************************************************************************************************************/ $insert APP_INSERTS $insert HTTP_SERVICE_SETUP $insert HTTP_INSERTS Declare subroutine RList Declare function Metrology_Services ValidMethod = True$ ; // Assume the HTTP method is valid until proven otherwise. HasGetString = HTTP_Services('GetHTTPGetString') NE '' // Some methods are restricted to authorized users only. Get their security level for cross-checking later. Username = Memory_Services('GetValue', 'Username') Security = Xlate('USERS', Username, 'ACCESS_LEVEL', 'X') Begin Case Case RemainingURL _EQC '' // This means the URL ends with /metrology. SelfURL = HTTP_Services('GetSelfURL') Begin Case Case HTTPMethod _EQC 'OPTIONS' ; GoSub Options Case HTTPMethod _EQC 'POST' ; GoSub Post Case Otherwise$ ; ValidMethod = False$ End Case Case Otherwise$ HTTP_Services('SetResponseStatus', 404, NextSegment : ' is not a valid service request within the ' : CurrentServiceHandler : ' module.') End Case If Not(ValidMethod) then HTTP_Services('SetResponseStatus', 405, HTTPMethod : ' is not valid for this service.') // These services are always allowed. HTTP_Services('SetResponseHeaderField', 'Allow', 'GET', True$) HTTP_Services('SetResponseHeaderField', 'Allow', 'OPTIONS', True$) // These services are only allowed if the service is for a specific item resource. If Len(NextSegment) then HTTP_Services('SetResponseHeaderField', 'Allow', 'POST', True$) HTTP_Services('SetResponseHeaderField', 'Allow', 'DELETE', True$) end If Not(HasGetString) AND NextSegment _EQC '' then HTTP_Services('SetResponseHeaderField', 'Allow', 'POST', True$) end end If Assigned(Response) else Response = '' Return Response //---------------------------------------------------------------------------------------------------------------------- // Options // // @@DEFINE_SERVICE(Options) // // Sets the appropriate response header fields for an OPTIONS request. //---------------------------------------------------------------------------------------------------------------------- Options: HTTP_Services('SetResponseHeaderField', 'Access-Control-Allow-Headers', 'authorization', True$) HTTP_Services('SetResponseHeaderField', 'Access-Control-Allow-Headers', 'x-authorization', True$) HTTP_Services('SetResponseHeaderField', 'Access-Control-Max-Age', 1728000) HTTP_Services('SetResponseHeaderField', 'Allow', 'OPTIONS', True$) HTTP_Services('SetResponseHeaderField', 'Allow', 'POST', True$) return //---------------------------------------------------------------------------------------------------------------------- // Post // // @@DEFINE_SERVICE(Post) // // Attempts to create the resource. //---------------------------------------------------------------------------------------------------------------------- Post: Body = HTTP_Services('GetHTTPPostString') Body = HTTP_Services('DecodePercentString', Body) // This is to allow a developer to capture the request and response in text files for external inspection. CapturePath = HTTP_Services('GetCapturePath') Declare function RTI_OS_Directory If RTI_OS_Directory('EXISTS', CapturePath) EQ True$ then FileTimeStamp = Oconv(Date(), 'DJS-') : '_' : Oconv(Time(), 'MTS-') BodyFileName = 'Body_@_' : FileTimeStamp : '.txt' OSWrite Body to CapturePath : '\' : BodyFileName end Success = Metrology_Services('ImportMetrologyRunData', Body) If Success then HTTP_Services('SetResponseStatus', 204, 'Metrology run data was successfully imported.') ResponseBody = '{"status":"204","description":"Metrology run data was successfully imported."}' HTTP_Services('SetResponseBody', ResponseBody, False$, 'text/json') end else HTTP_Services('SetResponseStatus', 500, 'Metrology run data was unsuccessfully imported.') ResponseBody = '{"status":"500","description":"Metrology run data was unsuccessfully imported."}' HTTP_Services('SetResponseBody', ResponseBody, False$, 'text/json') end * Debug return