USING Progress.Lang.*.
USING Progress.Json.ObjectModel.JsonObject.
ROUTINE-LEVEL ON ERROR UNDO, THROW.
DEFINE TEMP-TABLE ttRecord
FIELD requestField1 AS CHARACTER
FIELD requestField2 AS CHARACTER.
DEFINE INPUT PARAMETER TABLE FOR ttRecord.
PROCEDURE postRequest:
DEFINE VARIABLE hSocket AS HANDLE NO-UNDO.
DEFINE VARIABLE lcRequest AS LONGCHAR NO-UNDO.
DEFINE VARIABLE lcData AS LONGCHAR NO-UNDO.
DEFINE VARIABLE mRequest AS MEMPTR NO-UNDO.
DEFINE VARIABLE mCredentials AS MEMPTR NO-UNDO.
DEFINE VARIABLE cCredentials AS CHARACTER NO-UNDO
INITIAL "username:password".
SET-SIZE(mCredentials) = LENGTH(cCredentials).
PUT-STRING(mCredentials,1,LENGTH(cCredentials)) = cCredentials.
cCredentials = BASE64-ENCODE(mCredentials).
CREATE SOCKET hSocket.
hSocket:CONNECT("-H some.webservice.com -S 443 -ssl").
hSocket:SET-READ-RESPONSE-PROCEDURE('handleRestPostResponse',THIS-PROCEDURE).
FIND FIRST ttRecord NO-LOCK NO-ERROR.
IF NOT AVAILABLE ttRecord THEN LEAVE.
TEMP-TABLE ttRecord:WRITE-JSON("LONGCHAR",lcData,FALSE,?,FALSE,TRUE).
lcRequest = "POST " +
"https://some.webservice.com/app/category/resource" +
" HTTP/1.0~r~n" +
"Authorization: Basic " + cCredentials + "~r~n" +
"Content-Type: application/json~r~n" +
"Content-Length: " + STRING(LENGTH(lcData)) + "~r~n" +
"Host: some.webservice.com~r~n" +
"Connection: Keep-Alive~r~n" +
"~r~n" + lcData + "~r~n".
SET-SIZE(mRequest) = 0.
SET-SIZE(mRequest) = LENGTH(lcRequest) + 1.
PUT-STRING(mRequest,1) = lcRequest.
hSocket:WRITE(mRequest,1,LENGTH(lcRequest)).
REPEAT ON STOP UNDO, LEAVE ON QUIT UNDO, LEAVE:
IF hSocket:CONNECTED() THEN
WAIT-FOR READ-RESPONSE OF hSocket.
ELSE
LEAVE.
END.
FINALLY:
hSocket:DISCONNECT() NO-ERROR.
DELETE OBJECT hSocket NO-ERROR.
END FINALLY.
END PROCEDURE.
PROCEDURE handleRestPostResponse:
DEFINE VARIABLE lcData AS LONGCHAR NO-UNDO.
DEFINE VARIABLE mResponse AS MEMPTR NO-UNDO.
lcData = "".
/* Good practice to ensure max data on the stream */
PAUSE 2 NO-MESSAGE.
DO WHILE SELF:GET-BYTES-AVAILABLE() GT 0:
SET-SIZE(mResponse) = SELF:GET-BYTES-AVAILABLE() + 1.
SELF:READ(mResponse,1,1,SELF:GET-BYTES-AVAILABLE()) NO-ERROR.
lcData = lcData + GET-STRING(mResponse,1).
END.
FINALLY:
/* This causes the next iteration of the REPEAT with the
WAIT-FOR READ-RESPONSE to fail and bounce out of the loop */
SELF:DISCONNECT() NO-ERROR.
END FINALLY.
END PROCEDURE.