For OpenEdge versions 11.7.x - 12.x - 12.5
Create a class named HttpClient\ConnectCSCP.cls with the below code:
/*------------------------------------------------------------------------
File : ConnectCSCP
Description : Connection Parameters with the Connect Timeout
Notes : Save this as HttpClient/ConnectCSCP.cls
----------------------------------------------------------------------*/
BLOCK-LEVEL ON ERROR UNDO, THROW.
USING OpenEdge.Core.Assert.
USING OpenEdge.Net.ServerConnection.ClientSocketConnectionParameters.
USING OpenEdge.Net.URI.
CLASS HttpClient.ConnectCSCP INHERITS ClientSocketConnectionParameters:
/* The timeout for the socket CONNECT, in milliseconds */
DEFINE PUBLIC PROPERTY ConnectTimeout AS INTEGER NO-UNDO
GET.
SET(INPUT pTimeout AS INTEGER):
Assert:NotNull(pTimeout, 'Connect timeout').
THIS-OBJECT:ConnectTimeout = pTimeout.
END SET.
CONSTRUCTOR PUBLIC ConnectCSCP ( ):
SUPER ().
END CONSTRUCTOR.
CONSTRUCTOR PUBLIC ConnectCSCP ( INPUT pScheme AS CHARACTER,
INPUT pHost AS CHARACTER,
INPUT pPort AS INTEGER ):
SUPER (INPUT pScheme, INPUT pHost, INPUT pPort).
END CONSTRUCTOR.
CONSTRUCTOR PUBLIC ConnectCSCP ( INPUT poURI AS URI ):
SUPER (INPUT poURI).
END CONSTRUCTOR.
METHOD OVERRIDE PUBLIC CHARACTER GetConnectionString():
DEFINE VARIABLE cConnectionParams AS CHARACTER NO-UNDO.
cConnectionParams = SUPER:GetConnectionString().
IF THIS-OBJECT:ConnectTimeout GT 0 THEN
cConnectionParams = SUBSTITUTE('&1 -clientConnectTimeout &2':u,
cConnectionParams, ConnectTimeout).
RETURN cConnectionParams.
END METHOD.
END CLASS.
Call the timeout code from your application. Below is an example:
/*------------------------------------------------------------------------
File : set_connect_timeout.p
Purpose : Shows how to set a timeout (in milliseconds) for the HTTP Client's CONNECT
----------------------------------------------------------------------*/
BLOCK-LEVEL ON ERROR UNDO, THROW.
USING HttpClient.ConnectCSCP.
USING OpenEdge.Net.HTTP.ClientBuilder.
USING OpenEdge.Net.HTTP.IHttpClient.
USING OpenEdge.Net.HTTP.IHttpClientLibrary.
USING OpenEdge.Net.HTTP.Lib.ClientLibraryBuilder.
USING OpenEdge.Net.HTTP.RequestBuilder.
USING OpenEdge.Net.ServerConnection.ClientSocket.
USING OpenEdge.Net.ServerConnection.ClientSocketConnectionParameters.
/* *************************** Settings *************************** */
SESSION:ERROR-STACK-TRACE = TRUE.
/* *************************** Main Block *************************** */
DEFINE VARIABLE oClient AS IHttpClient NO-UNDO.
DEFINE VARIABLE oLib AS IHttpClientLibrary NO-UNDO.
DEFINE VARIABLE oSocket AS ClientSocket NO-UNDO.
DEFINE VARIABLE oCSCP AS HttpClient.ConnectCSCP NO-UNDO.
// create a custom connection param with connect-timeout
ASSIGN oCSCP = NEW HttpClient.ConnectCSCP()
oCSCP:ConnectTimeout = 1000
// tell the abl-socket-library to use the new connection params
oLib = ClientLibraryBuilder:Build()
// use the custom ConnectionParameters
:Option(GET-CLASS(ClientSocketConnectionParameters):TypeName,
oCSCP)
:Library
// tell the client to use the custom library
oClient = ClientBuilder:Build()
:UsingLibrary(oLib)
:Client.
// there's no server here
oClient:Execute(RequestBuilder:Get('http://localhost:9999'):Request).
CATCH oError AS Progress.Lang.Error :
MESSAGE oError:GetMessage(1) SKIP(2)
oError:CallStack
VIEW-AS ALERT-BOX.
END CATCH.
NOTE: Please be aware that above code does not work for https connections.
For the solution please refer to the article Missing -clientConnectTimeout option in the ABL http client
For OpenEdge versions 12.6 - Later
BLOCK-LEVEL ON ERROR UNDO, THROW.
USING OpenEdge.Net.HTTP.ClientBuilder.
USING OpenEdge.Net.HTTP.IHttpClient.
USING OpenEdge.Net.HTTP.IHttpClientLibrary.
USING OpenEdge.Net.HTTP.Lib.ClientLibraryBuilder.
USING OpenEdge.Net.HTTP.RequestBuilder.
USING OpenEdge.Net.ServerConnection.*.
/* *************************** Settings *************************** */
SESSION:ERROR-STACK-TRACE = TRUE.
/* *************************** Main Block *************************** */
DEFINE VARIABLE oClient AS IHttpClient NO-UNDO.
DEFINE VARIABLE oLib AS IHttpClientLibrary NO-UNDO.
DEFINE VARIABLE oCSCP AS ClientSocketConnectionParameters.
// create a custom connection param with connect-timeout
ASSIGN oCSCP = NEW ClientSocketConnectionParameters()
oCSCP:ConnectTimeout = 5000
// tell the abl-socket-library to use the new connection params
oLib = ClientLibraryBuilder:Build()
// use the custom ConnectionParameters
:Option(GET-CLASS(ClientSocketConnectionParameters):TypeName,oCSCP)
:Library
// tell the client to use the custom library
oClient = ClientBuilder:Build()
:UsingLibrary(oLib)
:Client.
// there's no server here
oClient:Execute(RequestBuilder:Get('http://localhost:9999'):Request).
CATCH oError AS Progress.Lang.Error :
MESSAGE oError:GetMessage(1) SKIP(2)
oError:CallStack SKIP (2)
VIEW-AS ALERT-BOX.
END CATCH.
In OE 12.6 and later the ClientSocketConnectionParameters Class has new methods, including ConnectTimeout Method.