Files
MBS/PROYECTO/wservice/lowapis/lowapiserver.4gl
T

206 lines
6.2 KiB
Plaintext

IMPORT util
IMPORT com
CONSTANT ERR_METHOD = "Method not supported"
TYPE TYP_status RECORD
code INTEGER,
desc STRING
END RECORD
TYPE reqInfoTyp RECORD
method STRING,
ctype STRING, # check the Content-Type
informat STRING, # short word for Content Type
caccept STRING, # check which format the client accepts
outformat STRING, # short word for Accept
path STRING,
query STRING, # the query string
items DYNAMIC ARRAY OF RECORD
name STRING,
value STRING
END RECORD
END RECORD
DEFINE m_reqInfo reqInfoTyp
DEFINE err TYP_status
MAIN
DEFINE ret INTEGER
DEFINE req com.HttpServiceRequest
DEFINE method,url,acc,resp STRING
DEFINE idx,rcode INT
DEFER INTERRUPT
# Start the server
DISPLAY "Starting server..."
# Starts the server on the port number specified by the FGLAPPSERVER environment variable
# (EX: FGLAPPSERVER=8090)
CALL com.WebServiceEngine.Start()
DISPLAY "The server is listening."
# create the server
WHILE TRUE
TRY
LET req = com.WebServiceEngine.GetHTTPServiceRequest(10)
CALL getReqInfo(req)
# Get the type of method
LET method = m_reqInfo.method
# Get the request path
LET url = m_reqInfo.path
# Get the output format
LET acc = m_reqInfo.outformat
DISPLAY "Processing request... ", method, " ", url
# parse the url, retrieve the operation and the operand
DISPLAY method
CASE method
WHEN "GET"
IF url.getIndexOf("/recepcion",1) > 0 THEN
DISPLAY "URL AQUI:",url
ELSE
CALL req.sendTextResponse(400,"Url no es valida","Url no es valida")
END IF
IF url.getIndexOf("/aprobacioncomercial",1) > 0 THEN
DISPLAY "URL AQUI:",url
ELSE
CALL req.sendTextResponse(400,"Url no es valida","Url no es valida")
END IF
EXIT CASE
WHEN "POST"
IF url.getIndexOf("/recepcion",1) > 0 THEN
DISPLAY "entre a ejecutar"
CALL recepcion(req,url) RETURNING rcode, resp
CALL req.sendTextResponse(rcode,"Respuesta",resp)
EXIT WHILE
ELSE
IF url.getIndexOf("/aprobacioncomercial",1) > 0 THEN
DISPLAY "Aprobacion Comercial"
CALL aprobacion(req) RETURNING rcode, resp
CALL req.sendTextResponse(rcode,"Respuesta",resp)
EXIT WHILE
ELSE
CALL req.sendTextResponse(400,"Respuesta","No se ha enviado correcto la URL")
END IF
END IF
EXIT WHILE
OTHERWISE
CALL setError("Unknown request:\n" || url || "\n" || method)
LET err.code = -3
LET err.desc = ERR_METHOD
CALL req.sendTextResponse(200,"OK",util.JSON.stringify(err))
END CASE
CATCH
LET ret = status
CASE ret
WHEN -15565
DISPLAY "Server process has been stopped by Ctrl-C"
EXIT WHILE
WHEN -15575
DISPLAY "Server process has been disconnected by the GAS"
EXIT WHILE
OTHERWISE
DISPLAY "[ERROR] " || ret
EXIT WHILE
END CASE
IF int_flag<>0 THEN
LET int_flag = 0
EXIT WHILE
END IF
END TRY
END WHILE
END MAIN
FUNCTION getReqInfo(req)
DEFINE req com.HTTPServiceRequest
DEFINE str, val base.StringTokenizer
DEFINE token STRING
DEFINE i INT
INITIALIZE m_reqInfo TO NULL
LET m_reqInfo.ctype = getHeaderByName(req,"Content-Type")
IF m_reqInfo.ctype.getIndexOf("/xml",1) THEN
LET m_reqInfo.informat = "XML"
ELSE
LET m_reqInfo.informat = "JSON"
END IF
LET m_reqInfo.caccept = getHeaderByName(req,"Accept")
IF m_reqInfo.caccept.getIndexOf("/xml",1) THEN
LET m_reqInfo.outformat = "XML"
ELSE
LET m_reqInfo.outformat = "JSON"
END IF
LET m_reqInfo.method = req.getMethod()
CALL parseUrl(req.getUrl()) RETURNING m_reqInfo.path, m_reqInfo.query
LET str = base.StringTokenizer.create(m_reqInfo.query,"&")
LET i=1
CALL m_reqInfo.items.clear()
WHILE str.hasMoreTokens()
LET token = str.nextToken()
LET val = base.StringTokenizer.create(token,"=")
IF val.hasMoreTokens() THEN LET m_reqInfo.items[i].name = val.nextToken() END IF
IF val.hasMoreTokens() THEN LET m_reqInfo.items[i].value = val.nextToken() END IF
LET i=i+1
END WHILE
END FUNCTION
FUNCTION getHeaderByName(areq,hname)
DEFINE areq com.HTTPServiceRequest
DEFINE hname STRING
DEFINE aname STRING
DEFINE iname STRING
DEFINE i INT
DEFINE n INT
LET aname = hname.toLowerCase()
TRY
LET n = areq.getRequestHeaderCount()
FOR i=1 TO n
LET iname = areq.getRequestHeaderName(i)
IF aname.equals(iname.toLowerCase()) THEN
RETURN areq.getRequestHeaderValue(i)
END IF
END FOR
CATCH
RETURN NULL
END TRY
RETURN NULL
END FUNCTION
FUNCTION parseUrl(url)
DEFINE url STRING
DEFINE i INT
LET i = url.getIndexOf("?",1)
IF i = 0 THEN
RETURN url, NULL
ELSE
RETURN url.subString(1,i), url.subString(i+1,url.getLength())
END IF
END FUNCTION
FUNCTION setError(s)
DEFINE s STRING
DISPLAY s
END FUNCTION