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