108 lines
3.2 KiB
Plaintext
108 lines
3.2 KiB
Plaintext
IMPORT COM
|
|
IMPORT XML
|
|
IMPORT FGL WSHelper
|
|
|
|
PRIVATE CONSTANT C_BASEURL = "/ws/r/qa-test/MyService/"
|
|
PRIVATE CONSTANT C_X_FOURJS_ENVIRONEMENT_ = "X-FourJs-Environment-"
|
|
PRIVATE CONSTANT C_GENERO_INTERNAL_DELEGATE = "_GENERO_INTERNAL_DELEGATE_"
|
|
|
|
MAIN
|
|
DEFINE req com.HttpServiceRequest
|
|
DEFINE methd STRING
|
|
DEFINE url STRING
|
|
DEFINE path STRING
|
|
DEFINE ind INTEGER
|
|
DEFINE operation STRING
|
|
|
|
CALL com.WebServiceEngine.Start()
|
|
|
|
WHILE TRUE
|
|
TRY
|
|
LET req = com.WebServiceEngine.GetHttpServiceRequest(-1)
|
|
IF req IS NULL THEN
|
|
EXIT WHILE
|
|
ELSE
|
|
LET url = req.getUrl()
|
|
LET methd = req.getMethod()
|
|
LET path = req.getUrlPath()
|
|
DISPLAY "Incoming request: ",methd," path=",path
|
|
LET ind = path.getIndexOf(C_BASEURL,1)
|
|
IF ind<1 THEN
|
|
CALL req.sendResponse(400,"Invalid request")
|
|
ELSE
|
|
# Dispatch request based on operation name (ex : /ws/r/qa-test/MyService/operation1)
|
|
LET operation = path.subString(ind+C_BASEURL.getLength(),path.getLength())
|
|
CALL DispatchService(req,operation)
|
|
END IF
|
|
DISPLAY "Response sent"
|
|
END IF
|
|
CATCH
|
|
EXIT WHILE
|
|
END TRY
|
|
END WHILE
|
|
END MAIN
|
|
|
|
FUNCTION DispatchService(req,operation)
|
|
DEFINE req com.HttpServiceRequest
|
|
DEFINE operation STRING
|
|
DEFINE ind INTEGER
|
|
LET ind = operation.getIndexOf("/",1)
|
|
IF ind>0 THEN
|
|
CALL req.sendResponse(400,"invalid operation")
|
|
ELSE
|
|
CASE operation
|
|
WHEN "Delegate" # Handle a dispatcher delegate service
|
|
CALL DelegateWA(req)
|
|
WHEN "producto"
|
|
CALL productos_display(req)
|
|
OTHERWISE
|
|
CALL req.sendResponse(400,"unknown service '"||operation||"'.");
|
|
END CASE
|
|
END IF
|
|
END FUNCTION
|
|
|
|
#
|
|
# Delegate WA service
|
|
# If browser URL doesn't contain 'ByPass' in query string then return a 404 error,
|
|
# otherwise start GWC application
|
|
#
|
|
FUNCTION DelegateWA(req)
|
|
DEFINE req com.HttpServiceRequest
|
|
DEFINE q WSHelper.WSQueryType
|
|
DEFINE url STRING
|
|
DEFINE ind INTEGER
|
|
DEFINE ByPass BOOLEAN
|
|
|
|
# Decode Delegate query
|
|
CALL req.getURLQuery(q)
|
|
IF q.getLength()==0 THEN
|
|
CALL req.sendResponse(400,"no query string")
|
|
RETURN
|
|
ELSE
|
|
IF q[1].name=="url" THEN
|
|
LET url = q[1].value
|
|
CALL q.deleteElement(1)
|
|
# Valid delegate request with original URL as key parameter
|
|
ELSE
|
|
CALL req.sendResponse(400,"no valid delegate request")
|
|
RETURN
|
|
END IF
|
|
END IF
|
|
# Process Delegate request
|
|
LET ByPass = FALSE
|
|
# Check if user-agent query string has a ByPass string ?
|
|
FOR ind=1 TO q.getLength()
|
|
IF q[ind].name="ByPass" THEN
|
|
LET ByPass = TRUE
|
|
END IF
|
|
END FOR
|
|
IF NOT ByPass THEN
|
|
# return error
|
|
CALL req.sendResponse(404,"ByPass is missing")
|
|
ELSE
|
|
# Set parameter for the web client application via environment variable: ACCESS=OK
|
|
CALL req.setResponseHeader(C_X_FOURJS_ENVIRONEMENT_||"ACCESS","OK")
|
|
# Start application with HTTP code 307
|
|
CALL req.sendResponse(307,C_GENERO_INTERNAL_DELEGATE)
|
|
END IF
|
|
END FUNCTION |