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.