Files
MBS/WEBSERVICES/test/validar.4gl
T

202 lines
5.3 KiB
Plaintext

IMPORT util
IMPORT com
IMPORT os
IMPORT security
IMPORT XML
CONSTANT dpy_verb=TRUE -- send messages to standard output
CONSTANT log_verb=TRUE -- send messages to the errorlog
TYPE t_sync_cmd RECORD
oper STRING,
data STRING
END RECORD
DEFINE req com.HTTPServiceRequest
DEFINE url,msg,method,headers STRING,
tout, n, x INTEGER,
start_time DATETIME YEAR TO SECOND,
b BYTE
DEFINE d0 DATETIME YEAR TO SECOND
MAIN
DEFINE k,kurl,kbodega,resp STRING,
ktrue BOOLEAN,retu INT
CALL check_utf8() RETURNING x, msg
IF x != 0 THEN
DISPLAY "ERROR: ", msg
EXIT PROGRAM 1
END IF
CALL show_verb("Starting dbsync server: ...")
-- Normally, the port is set by the GAS for load balancing
-- For standalone tests you can set FGLAPPSERVER environment variable
CALL show_verb("Listening on port : "|| NVL(fgl_getenv("FGLAPPSERVER"),"GAS"))
CALL com.WebServiceEngine.Start()
LET start_time = CURRENT
--LET tout=-1 -- timeout: infinite wait
--LET tout=5 -- timeout: 5 seconds
LET tout=-1 -- timeout: 10 seconds
IF tout=-1 THEN
LET msg="The dbsync server is listening (timeout = infinite wait)."
ELSE
LET msg="The dbsync server is listening (timeout =",tout USING "-<<<<<<&"," seconds)."
END IF
CALL show_verb(msg)
LET n=0
WHILE TRUE
LET req = com.WebServiceEngine.getHTTPServiceRequest(tout)
IF req IS NULL THEN -- timeout
CALL show_verb( SFMT("HTTP request timeout...: %1", CURRENT YEAR TO FRACTION))
CONTINUE WHILE
ELSE
CALL show_verb( SFMT("HTTP request LLEGO AL SERVICIO...: %1", CURRENT YEAR TO FRACTION))
END IF
LET url = req.getURL()
LET method = req.getMethod()
IF method IS NULL OR method != "POST" THEN
IF method = "GET" THEN
CALL req.sendTextResponse(200,NULL,"Welcome to API server for MBS PRODUCCION --Validacion-, Debes envar METODO: POST...")
END IF
EXIT WHILE
END IF
DISPLAY "URL1: ",url
DISPLAY "METODO1: ",method
{ LET headers = req.getRequestHeader("DBSync-Client")
DISPLAY "header: DBSync-Clent=> ",headers
IF headers IS NULL OR headers!= "mbs" THEN
CALL show_err(SFMT("Unexpected HTTP request header DBSync-Client: %1", headers))
DISPLAY "HEADER: ",headers
CALL req.sendTextResponse(400,NULL,"Bad request in Header DBSync-Client")
CONTINUE WHILE
END IF}
LET headers = req.getRequestHeader("accept")
DISPLAY "content: ",headers
IF headers IS NULL OR headers NOT MATCHES "application/xml" THEN -- ;Charset=UTF-8
CALL show_err(SFMT("Unexpected HTTP request header Content-Type: %1", headers))
CALL req.sendTextResponse(400,NULL,"Bad request, in Header Accept")
EXIT WHILE
END IF
IF NOT(read_request(req)) THEN
-- si el procesamiento del request da error vuelve al loop
EXIT WHILE
END IF
LET n = n + 1
LET d0 = CURRENT
EXIT WHILE
END WHILE
END MAIN
FUNCTION show_sync_err(msg)
DEFINE msg STRING
CALL fgl_winmessage(%"ERROR", msg, "exclamation")
END FUNCTION
FUNCTION b64_to_file(str_b64,f_sal)
DEFINE f_sal,str_b64,str_aux STRING
TRY
CALL security.Base64.SaveBinary(f_sal,str_b64)
CATCH
DISPLAY " data ",str_b64
LET str_aux="Unable to convert Base64 String to file :",STATUS
DISPLAY "ERROR: ",msg
# CALL fgl_winmessage("Error",str_aux,"stop")
END TRY
END FUNCTION
FUNCTION check_utf8()
IF ORD("€") == 8364 AND LENGTH("€") == 1 THEN
RETURN 0, NULL
ELSE
RETURN -1, "Application locale must be UTF-8, with char length semantics"
END IF
END FUNCTION
FUNCTION show_verb(msg)
DEFINE msg STRING
IF dpy_verb THEN
DISPLAY msg
END IF
# IF log_verb THEN
# CALL errorlog(msg CLIPPED)
# END IF
END FUNCTION
FUNCTION read_request(req)
DEFINE doc xml.DomDocument
DEFINE req com.HttpServiceRequest
DEFINE cmd STRING,
p RECORD
oper STRING,
data RECORD
usuario STRING,
clave STRING,
codigo STRING
END RECORD
END RECORD,
bfile BYTE
INITIALIZE cmd TO NULL
TRY
LET doc = req.readXmlRequest()
CALL doc.save("./recibidos/recibido.xml")
CATCH
CALL show_err(SFMT("Unexpected HTTP request read exception: %1", STATUS))
RETURN FALSE
END TRY
IF LENGTH(cmd) == 0 THEN
-- la operacion va a estar vacia y va dar error por invalida
RETURN TRUE
END IF
DISPLAY "request: ",cmd
{
TRY
CALL util.JSON.parse(cmd, r_cmd)
CATCH
CALL show_err(SFMT("JSON parse error: %1", STATUS))
RETURN FALSE
END TRY
}
RETURN TRUE
END FUNCTION
FUNCTION show_err(msg)
DEFINE msg STRING
DISPLAY "ERROR:",msg
# CALL errorlog(msg CLIPPED)
END FUNCTION