206 lines
6.2 KiB
Plaintext
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 |