Kbase P80335: Sample for sending messages via 4GL socket to SonicMQ inbound HttpDirect
Autor |
  Progress Software Corporation - Progress |
Acesso |
  Público |
Publicação |
  09/10/2009 |
|
Status: Verified
GOAL:
Code sample sending messages via 4GL sockets to SonicMQ http direct inbound
FACT(s) (Environment):
Progress 9.x
SonicMQ 5.0.1
All Supported Operating Systems
FIX:
/* Sample application for sending a message via 4GL sockets to a SonicMQ direct inbound acceptor. This sample assumes you have configured the SonicMQ broker with an inbound HttpDirect handler and acceptor port. Within the initial screen behind -- URL -> you need to replace the text of the URL with the text of the URL for which you have defined the SonicMQ HttpDirect handler and acceptor port.
See <SonicMQ install dir>\samples\HttpDirect\DirectInboundSend\Readme.txt
for details on how to configure that acceptor. */
DEFINE VARIABLE wurl AS CHARACTER FORMAT "X(255)"
VIEW-AS FILL-IN SIZE 55 BY 1
INITIAL "http://pcrwe2:2580/httpdirect" LABEL "-- URL ->" NO-UNDO.
DEFINE VARIABLE smessage AS CHARACTER FORMAT "X(255)"
VIEW-AS EDITOR SIZE 55 BY 7
INITIAL "Text to send to SonicMQ inbound acceptor" LABEL "Message" NO-UNDO.
DEFINE VARIABLE weditor AS CHARACTER VIEW-AS EDITOR INNER-CHARS
77 INNER-LINES 22 NO-UNDO.
DEFINE BUTTON b-post LABEL "POST".
DEFINE VARIABLE vhost AS CHARACTER NO-UNDO.
DEFINE VARIABLE vport AS CHARACTER NO-UNDO.
DEFINE VARIABLE vpath AS CHARACTER NO-UNDO.
DEFINE VARIABLE vfile AS CHARACTER INITIAL "test.log" NO-UNDO. /*Log file*/
DEF VAR sbuffer AS CHAR NO-UNDO.
DEF VAR CR AS CHAR NO-UNDO.
CR = CHR(13) + CHR(10) .
SESSION:APPL-ALERT-BOXES = YES.
FORM wurl smessage b-post SKIP weditor NO-LABELS
WITH FRAME DEFAULT-FRAME THREE-D SIDE-LABELS.
ON 'RETURN':U OF wurl OR 'CHOOSE':U OF b-post
DO:
ASSIGN wurl.
ASSIGN smessage .
RUN UrlParser(INPUT wurl,
OUTPUT vhost, OUTPUT vport, OUTPUT vpath).
RUN HTTPPost(vhost, vport, vpath, vfile).
weditor:INSERT-STRING(sbuffer) .
weditor:SAVE-FILE (vfile) .
RETURN.
END.
MAIN-BLOCK:
DO ON ERROR UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK
ON END-KEY UNDO MAIN-BLOCK, LEAVE MAIN-BLOCK:
DISPLAY wurl smessage weditor WITH FRAME DEFAULT-FRAME.
ENABLE wurl smessage b-post weditor WITH FRAME DEFAULT-FRAME.
WAIT-FOR GO OF CURRENT-WINDOW.
END.
DEFINE VARIABLE vSocket AS HANDLE NO-UNDO.
DEFINE VARIABLE wstatus AS LOGICAL NO-UNDO.
DEFINE VARIABLE vStr AS CHARACTER NO-UNDO.
DEFINE VARIABLE vBuffer AS MEMPTR NO-UNDO.
PROCEDURE UrlParser:
DEFINE INPUT PARAMETER purl AS CHARACTER NO-UNDO.
DEFINE OUTPUT PARAMETER phost AS CHARACTER NO-UNDO.
DEFINE OUTPUT PARAMETER pport AS CHARACTER NO-UNDO.
DEFINE OUTPUT PARAMETER ppath AS CHARACTER NO-UNDO.
DEFINE VARIABLE vStr AS CHARACTER NO-UNDO.
IF purl BEGINS "http://" THEN DO:
vStr = SUBSTRING(purl, 8).
phost = ENTRY(1, vStr, "/").
IF NUM-ENTRIES(vStr, "/") = 1 THEN vStr = vStr + "/".
ppath = SUBSTRING(vStr, INDEX(vStr,"/")).
IF NUM-ENTRIES(phost, ":") > 1 THEN DO:
pport = ENTRY(2, phost, ":").
phost = ENTRY(1, phost, ":").
END.
ELSE DO:
pport = "80".
END.
END.
ELSE DO:
phost = "".
pport = "".
ppath = purl.
END.
END PROCEDURE.
PROCEDURE HTTPPost:
DEFINE INPUT PARAMETER phost AS CHARACTER NO-UNDO.
DEFINE INPUT PARAMETER pport AS CHARACTER NO-UNDO.
DEFINE INPUT PARAMETER ppath AS CHARACTER NO-UNDO.
DEFINE INPUT PARAMETER pfile AS CHARACTER NO-UNDO.
CREATE SOCKET vSocket.
vSocket:SET-READ-RESPONSE-PROCEDURE ("readHandler", THIS-PROCEDURE).
wstatus = vSocket:CONNECT("-H " + phost + " -S " + pport) NO-ERROR.
IF wstatus = NO THEN DO:
MESSAGE "Connection to http server:" phost "port" pport "is unavailable".
DELETE OBJECT vSocket.
RETURN.
END.
vStr = "POST " + ppath + " HTTP/1.1" + CR .
vStr = vStr + "Content-Type: text/text; charset=" + CHR(34) + "ASCII" + CHR(34) + CR.
vStr = vStr + "SampleHeader-AppName: test.p " + CR.
vStr = vStr + "SampleHeader-FileName: test.txt" + CR.
vStr = vStr + "User-Agent: Progress 9.1D08" + CR.
vStr = vStr + "Host: pcrwe2:2580" + CR .
vStr = vStr + "Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2" .+ CR .
vStr = vStr + "Connection: keep-alive" + CR .
vStr = vStr + "Content-length: " + String(Length(smessage)) + CR + CR .
vStr = vStr + smessage + CR + "~n~n~n".
sbuffer = "Sent to : " + wurl + " : " + CR + trim(vStr) + CR + CR.
SET-SIZE(vBuffer) = LENGTH(vStr) + 1.
PUT-STRING(vBuffer,1) = vStr.
vSocket:WRITE(vBuffer, 1, LENGTH(vStr)).
SET-SIZE(vBuffer) = 0.
sbuffer = sbuffer + "Got as response: " + CR.
WAIT-FOR READ-RESPONSE OF vSocket.
vSocket:DISCONNECT().
DELETE OBJECT vSocket.
END PROCEDURE.
PROCEDURE readHandler:
DEFINE VARIABLE l AS INTEGER NO-UNDO.
DEFINE VARIABLE str AS CHARACTER NO-UNDO.
DEFINE VARIABLE b AS MEMPTR NO-UNDO.
l = vSocket:GET-BYTES-AVAILABLE().
IF l > 0 THEN DO:
SET-SIZE(b) = l + 1.
vSocket:READ(b, 1, l, 1).
str = str + GET-STRING(b,1).
SET-SIZE(b) = 0.
sbuffer = sbuffer + str.
END.
ELSE DO:
vSocket:DISCONNECT().
END.
END PROCEDURE..