202 lines
5.3 KiB
Plaintext
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
|