Consultor Eletrônico



Kbase P149112: 4GL/ABL: The GET-BYTES-AVAILABLE( ) method returns 0 with SSL
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   11/23/2009
Status: Verified

SYMPTOM(s):

4GL/ABL: The GET-BYTES-AVAILABLE( ) method returns 0 with SSL

The GET-BYTES-AVAILABLE( ) method returns 0 when the -ssl connection parameter is used

The first call to the GET-BYTES-AVAILABLE( ) method in the following code sample returns 0:
DEFINE VARIABLE h AS HANDLE NO-UNDO.
CREATE SERVER-SOCKET h.
h:ENABLE-CONNECTIONS("-S 7890 -ssl").
h:SET-CONNECT-PROCEDURE("doConnect").
DO ON ERROR UNDO, LEAVE ON ENDKEY UNDO, LEAVE:
WAIT-FOR /*CONNECT OF h OR*/ CLOSE OF THIS-PROCEDURE.
END.
h:DISABLE-CONNECTIONS().
DELETE OBJECT h.
PROCEDURE doConnect:
DEFINE INPUT PARAMETER hSocket AS HANDLE.
DEFINE VARIABLE mReceived AS MEMPTR NO-UNDO.
DEFINE VARIABLE cReceived AS CHARACTER NO-UNDO.
set-size(mReceived) = hSocket:GET-BYTES-AVAILABLE() + 1.
MESSAGE hSocket:GET-BYTES-AVAILABLE()
VIEW-AS ALERT-BOX INFO BUTTONS OK TITLE "serversocket.p".

hSocket:READ(mReceived,1,hSocket:GET-BYTES-AVAILABLE()).
cReceived = GET-STRING(mReceived,1).
SET-SIZE(mReceived) = 0.
MESSAGE cReceived VIEW-AS ALERT-BOX TITLE "serversocket.p".
hSocket:DISCONNECT().
END.

FACT(s) (Environment):

The same code returns correct number of bytes when run without SSL.
The same code returns correct results if the -ssl connection parameter is removed.
All Supported Operating Systems
OpenEdge 10.x

CAUSE:

Bug# OE00113730

CAUSE:

This is a limitation of SSL that needs to be addressed in the 4GL/ABL code. The first call to the GET-BYTES-AVAILABLE( ) method in the sample code returns 0 in the SSL case because the communication is slowed down enough by SSL that the server has not received the request from the client when GET-BYTES-AVAILABLE( ) method is called.

FIX:

Add a PAUSE 1 statement before the first call to the GET-BYTES-AVAILABLE( ) method. For example:
DEFINE VARIABLE h AS HANDLE NO-UNDO.
CREATE SERVER-SOCKET h.
h:ENABLE-CONNECTIONS("-S 7890 -ssl").
h:SET-CONNECT-PROCEDURE("doConnect").
DO ON ERROR UNDO, LEAVE ON ENDKEY UNDO, LEAVE:
WAIT-FOR /*CONNECT OF h OR*/ CLOSE OF THIS-PROCEDURE.
END.
h:DISABLE-CONNECTIONS().
DELETE OBJECT h.
PROCEDURE doConnect:
DEFINE INPUT PARAMETER hSocket AS HANDLE.
DEFINE VARIABLE mReceived AS MEMPTR NO-UNDO.
DEFINE VARIABLE cReceived AS CHARACTER NO-UNDO.
PAUSE 1.
SET-SIZE(mReceived) = hSocket:GET-BYTES-AVAILABLE() + 1.
MESSAGE hSocket:GET-BYTES-AVAILABLE()
VIEW-AS ALERT-BOX INFO BUTTONS OK TITLE "serversocket.p".

hSocket:READ(mReceived,1,hSocket:GET-BYTES-AVAILABLE()).
cReceived = GET-STRING(mReceived,1).
SET-SIZE(mReceived) = 0.
MESSAGE cReceived VIEW-AS ALERT-BOX TITLE "serversocket.p".
hSocket:DISCONNECT().
END.