OpenEdge.Net.HTTP infinite Looping

Posted by CMI on 02-Jun-2015 19:33

I'm trying to actually get the response data to disk but am getting to following error:

However the code does not stop and goes into a infinite loop. Here my code below and I've been executing from the procedure editor. I don't have the fancy OE Developer IDE.

USING OpenEdge.Net.HTTP.IHttpRequest.
USING OpenEdge.Net.HTTP.IHttpResponse.
USING OpenEdge.Net.HTTP.RequestBuilder.
USING OpenEdge.Net.HTTP.ClientBuilder.
USING OpenEdge.Core.String.
USING OpenEdge.Core.WidgetHandle.
USING Progress.Lang.Object.
USING Progress.Json.ObjectModel.JsonObject.

DEFINE VARIABLE oRequest    AS IhttpRequest     NO-UNDO.
DEFINE VARIABLE oResponse   AS IhttpResponse    NO-UNDO.
DEFINE VARIABLE httpUrl     AS CHARACTER        NO-UNDO.
DEFINE VARIABLE oEntity      AS OBJECT   NO-UNDO.
DEFINE VARIABLE XMLDocument  AS HANDLE      NO-UNDO. 
DEFINE VARIABLE payload      AS LONGCHAR   NO-UNDO.

httpUrl = "http://www.progress.com".

oRequest = RequestBuilder:Get(httpUrl,oEntity):Request.

oResponse = ClientBuilder:Build():Client:Execute(oRequest).
 
MESSAGE
    oResponse:StatusCode
    oResponse:StatusReason
    view-as alert-box info.
    
CASE TRUE:

    WHEN TYPE-OF(oEntity, JsonObject) THEN
        CAST(oEntity,JsonObject):WriteFile('temp/payload.json', true).
    
    WHEN TYPE-OF(oEntity, WidgetHandle) THEN    
    DO:
        MESSAGE 'Lookes LIke an XML document'.
        XMLDocument = CAST(oEntity, WidgetHandle ):Value.
        XMLDocument:Save('file','temp/payload.xml').
    END.    
    OTHERWISE 
    DO:

        IF TYPE-OF(oEntity, String) THEN 
            payload = CAST(oEntity, String):Value.
        ELSE    
            payload = oEntity:ToString().
            
        CASE oResponse:ContentType:
            WHEN 'application/xml' THEN
                COPY-LOB payload to file 'temp/payload.xml'. 
            WHEN 'application/json' THEN
                COPY-LOB payload to file 'temp/payload.json'. 
            WHEN 'text/html' THEN
                COPY-LOB payload to file 'temp/payload.html'. 
            OTHERWISE
                COPY-LOB payload to file 'temp/payload.txt'. 
        END CASE.    
    END.
END CASE.


Posted by CMI on 02-Jun-2015 21:11

I think I figured out where I'm going wrong. The servers response is in the Response:Entity public property. See the code below for my revised version.

USING OpenEdge.Net.HTTP.*.
USING OpenEdge.Core.String.
USING OpenEdge.Core.WidgetHandle.
USING Progress.Lang.Object.
USING Progress.Json.ObjectModel.JsonObject.

DEFINE VARIABLE oRequest    AS IhttpRequest     NO-UNDO.
DEFINE VARIABLE oResponse   AS IhttpResponse    NO-UNDO.
DEFINE VARIABLE httpUrl     AS CHARACTER        NO-UNDO.
DEFINE VARIABLE oEntity      AS OBJECT   NO-UNDO.
DEFINE VARIABLE XMLDocument  AS HANDLE      NO-UNDO. 
DEFINE VARIABLE payload      AS LONGCHAR   NO-UNDO.
DEFINE VARIABLE HttpHeaders  AS CLASS HttpHeader   NO-UNDO EXTENT.


httpUrl = "http://www.progress.com".

oRequest = RequestBuilder:Get(httpUrl):Request.

oResponse = ClientBuilder:Build():Client:Execute(oRequest).
 
/** Debug HTTP Response Headers **/
DEFINE VARIABLE iNumHeaders AS INTEGER     NO-UNDO.
DEFINE VARIABLE iHeaderEntry AS INTEGER     NO-UNDO.
iNumHeaders = oResponse:GetHeaders(OUTPUT HttpHeaders).

DO iHeaderEntry = 1 TO iNumHeaders:
    MESSAGE 
        HttpHeaders[iHeaderEntry]:Name 
        HttpHeaders[iHeaderEntry]:Value.  
END.


MESSAGE
    'Status:' oResponse:StatusCode
    oResponse:StatusReason SKIP
    'Version:' oResponse:Version    SKIP
    'Character Encoding:' oResponse:CharacterEncoding SKIP
    'Transfer Encoding:' oResponse:TransferEncoding  SKIP
    'Content Length:' oResponse:ContentLength   SKIP
    'MD5' STRING(oResponse:ContentMD5)
    view-as alert-box info
    TITLE ''.
    
/** Get the payload.**/   
oEntity = oResponse:Entity.
             
CASE TRUE:

    WHEN TYPE-OF(oEntity, JsonObject) THEN
        CAST(oEntity,JsonObject):WriteFile('temp/payload.json', true).
    
    WHEN TYPE-OF(oEntity, WidgetHandle) THEN    
    DO:
        MESSAGE 'Lookes LIke an XML document'.
        XMLDocument = CAST(oEntity, WidgetHandle ):Value.
        XMLDocument:Save('file','temp/payload.xml').
    END.    
    OTHERWISE 
    DO:

        IF TYPE-OF(oEntity, String) THEN 
            payload = CAST(oEntity, String):Value.
        ELSE    
            payload = oEntity:ToString().
            
        CASE oResponse:ContentType:
            WHEN 'application/xml' THEN
                COPY-LOB payload to file 'temp/payload.xml'. 
            WHEN 'application/json' THEN
                COPY-LOB payload to file 'temp/payload.json'. 
            WHEN 'text/html' THEN
                COPY-LOB payload to file 'temp/payload.html'. 
            OTHERWISE
                COPY-LOB payload to file 'temp/payload.txt'. 
        END CASE.    
    END.
END CASE.


All Replies

Posted by CMI on 02-Jun-2015 21:11

I think I figured out where I'm going wrong. The servers response is in the Response:Entity public property. See the code below for my revised version.

USING OpenEdge.Net.HTTP.*.
USING OpenEdge.Core.String.
USING OpenEdge.Core.WidgetHandle.
USING Progress.Lang.Object.
USING Progress.Json.ObjectModel.JsonObject.

DEFINE VARIABLE oRequest    AS IhttpRequest     NO-UNDO.
DEFINE VARIABLE oResponse   AS IhttpResponse    NO-UNDO.
DEFINE VARIABLE httpUrl     AS CHARACTER        NO-UNDO.
DEFINE VARIABLE oEntity      AS OBJECT   NO-UNDO.
DEFINE VARIABLE XMLDocument  AS HANDLE      NO-UNDO. 
DEFINE VARIABLE payload      AS LONGCHAR   NO-UNDO.
DEFINE VARIABLE HttpHeaders  AS CLASS HttpHeader   NO-UNDO EXTENT.


httpUrl = "http://www.progress.com".

oRequest = RequestBuilder:Get(httpUrl):Request.

oResponse = ClientBuilder:Build():Client:Execute(oRequest).
 
/** Debug HTTP Response Headers **/
DEFINE VARIABLE iNumHeaders AS INTEGER     NO-UNDO.
DEFINE VARIABLE iHeaderEntry AS INTEGER     NO-UNDO.
iNumHeaders = oResponse:GetHeaders(OUTPUT HttpHeaders).

DO iHeaderEntry = 1 TO iNumHeaders:
    MESSAGE 
        HttpHeaders[iHeaderEntry]:Name 
        HttpHeaders[iHeaderEntry]:Value.  
END.


MESSAGE
    'Status:' oResponse:StatusCode
    oResponse:StatusReason SKIP
    'Version:' oResponse:Version    SKIP
    'Character Encoding:' oResponse:CharacterEncoding SKIP
    'Transfer Encoding:' oResponse:TransferEncoding  SKIP
    'Content Length:' oResponse:ContentLength   SKIP
    'MD5' STRING(oResponse:ContentMD5)
    view-as alert-box info
    TITLE ''.
    
/** Get the payload.**/   
oEntity = oResponse:Entity.
             
CASE TRUE:

    WHEN TYPE-OF(oEntity, JsonObject) THEN
        CAST(oEntity,JsonObject):WriteFile('temp/payload.json', true).
    
    WHEN TYPE-OF(oEntity, WidgetHandle) THEN    
    DO:
        MESSAGE 'Lookes LIke an XML document'.
        XMLDocument = CAST(oEntity, WidgetHandle ):Value.
        XMLDocument:Save('file','temp/payload.xml').
    END.    
    OTHERWISE 
    DO:

        IF TYPE-OF(oEntity, String) THEN 
            payload = CAST(oEntity, String):Value.
        ELSE    
            payload = oEntity:ToString().
            
        CASE oResponse:ContentType:
            WHEN 'application/xml' THEN
                COPY-LOB payload to file 'temp/payload.xml'. 
            WHEN 'application/json' THEN
                COPY-LOB payload to file 'temp/payload.json'. 
            WHEN 'text/html' THEN
                COPY-LOB payload to file 'temp/payload.html'. 
            OTHERWISE
                COPY-LOB payload to file 'temp/payload.txt'. 
        END CASE.    
    END.
END CASE.


Posted by Peter Judge on 03-Jun-2015 07:52

The line

   /** Get the payload.**/  

   oEntity = oResponse:Entity.

was missing from the earlier whitepaper, but should have been in the doc. I'll make sure it appears there if it doesn't already ....

dammit I thought we'd fixed that. Sorry 'bout that. Will see about getting it updated in the 11.5.1 "New Information" doc.

[ "earlier" means the doc/whitepaper that was provided as part of the 11.5.0 tech preview for this feature ]

Posted by CMI on 03-Jun-2015 16:40

Hay, it's not a problem. I'm just slowly going through each of the class files making up my own documentation (until the official 11.6 comes out) highlighting all the public properties & methods.

Posted by CMI on 03-Jun-2015 16:47

On another note, should to code go into a retry loop if there was an error. If this a happened on a AppServer or WebSpeed agent it would be constantly locked/busy. Is this a possible issue/bug or should the developer have better error handling when utilising the OpenEdge.Net.HTTP classes?

Posted by Peter Judge on 04-Jun-2015 07:56

Are you talking about error handling on the calling code, if which the doc is an example?
 
-- peter
 
[collapse]
From: CMI [mailto:bounce-CMI@community.progress.com]
Sent: Wednesday, 03 June, 2015 17:48
To: TU.OE.Development@community.progress.com
Subject: RE: [Technical Users - OE Development] OpenEdge.Net.HTTP infinite Looping
 
Reply by CMI

On another note, should to code go into a retry loop if there was an error. If this a happened on a AppServer or WebSpeed agent it would be constantly locked/busy. Is this a possible issue/bug or should the developer have better error handling when utilising the OpenEdge.Net.HTTP classes?

Stop receiving emails on this subject.

Flag this post as spam/abuse.

[/collapse]

This thread is closed