Page 1 of 1

ommSSL_read: timeout

Posted: Thu Jul 10, 2025 6:54 pm
by rwillis2916
I'm trying to call a REST API and the call to http_string gets stuck for about 60 seconds, then it returns error ommSSL_read: timeout. Any ideas if I may be doing something wrong?

I have setup a call to the API via the Postman website and it works fine. So I think I have the parms correct.

The API requires bearer authentication. So I make the call below with UserID blank and field password set to the access token.

http_setAuth( HTTP_AUTH_BEARER
: %trim(Userid)
: %trim(Password) );

I only have one form parm;

form_data = 'include=All';

There's one URL parm of "subscription-key" (I changed the key below for security).

url = 'https://apis-sandbox.paycor.com/v1/lega ... hlmnopqrst';

then I call the API;

response = http_string('POST': url : %trim(form_data) :
'application/x-www-form-urlencoded')

That's where it gets stuck and when it finally returns control to my program field htttpccode = "ommSSL_read: timeout".

I used debug to step into the http_string procedure. It calls http_req with type set to POST.

rc = http_req(Type: URL: *omit: Output: *omit: SendStr: ct );

then it gets stuck on the call to http_persist_req and variable rc = 0 on return.

Here's the values passed to the http_persist_req procedure.

Type POST
comm SPP:D70893993402ACC0
URL https://apis-sandbox.paycor.com/….....
sndFd -1
sndProc SPP:*NULL
SendPtr SPP:E2CE24E5B6016784
SendLen 11
rcvFd -1
rcvProc PRP:D48ABF2F160126C8
global.timeout 60
global.userAgent http-api/1.52
ct application/x-www-form-urlencoded
soapAction null
global.modTime 0001-01-01-00.00.00.000000
sendLen64 ); 0

Re: ommSSL_read: timeout

Posted: Thu Jul 10, 2025 7:11 pm
by rwillis2916
FYI - My HTTPAPI_VERSION = '1.52'

I have http_debug(*on:'/tmp/paycor-diagnostic-log.txt');

But it doesn't create a log file.

I have another RPG program that calls the same website, for another API, but the API doesn't require authentication. It works fine.

I just load the form data;

Code: Select all

form_data =  'grant_type=refresh_token'         
      + '&' + 'refresh_token=' + %Trim(REFRESH) 
      + '&' + 'client_id=' + %Trim(CLIENT_ID)   
      + '&' + 'client_secret=' + %Trim(SECRET); 
Set the URL;

Code: Select all

url = 'https://apis-sandbox.paycor.com/sts/v1/common/token?subscription-key=abcdefghijkl'
And call http_string;

Code: Select all

response = http_string('POST': url : %trim(form_data) :       
                         'application/x-www-form-urlencoded');
this API returns the access token which I'm using in my problem program for authentication. The access token is good for 30 minutes.

Re: ommSSL_read: timeout

Posted: Fri Jul 11, 2025 3:57 pm
by rwillis2916
Correction on my statement "But it doesn't create a log file."

A log file is being created, but it doesn't show much other than the error "CommSSL_read: timeout!". I tried to attach the log file as .txt, but it doesn't allow .txt attachments. So I pasted most of the log as code below. I changed some key values for security.

While debugging, I see that the Refill procedure is called in COMMSSLR4. Refill calls gsk_secure_soc_read which returns a value of 502. Then it gets stuck for 60 seconds on procedure poll. After which it returns a value of 0 and that's when the error is recorded.

If it matters, my iSeries is on v7r5 and I my CUMe PTF level is 24312.

Code: Select all

Common Name: *.paycor.com
Country: US
State/Province: Ohio
Locality: Cincinnati
Org Unit: Paycor, Inc
Issuer CN: Entrust Certification Authority - L1K
Issuer Country: US
Issuer Org: Entrust, Inc.
Issuer Org Unit: (c) 2012 Entrust, Inc. - for authorized use only, OU=See www.entrust.net/legal-terms
Version: 3
not before: 20240827103336
Unknown Field: 10:33:36 27-08-2024
not after: 20250927103335
Unknown Field: 10:33:35 27-09-2025
pub key alg: 1.2.840.113549.1.1.1
signature algorithm: 1.2.840.113549.1.1.11
Unknown Field: 0382010F003082010A0282010100E34DBED5FFF6FCD80DC285FA8C2D3BF4F64B65C3B9F68622D82D4B28808A0C0433F01E55A28876A3C821092BD9407EF00D689AFF55C0E384E49422B9E7D2D3ED169B248049774DBB0C9E1FC529404D3A647B795E4972B004739E78D812E79DAD1A17F88C74EC520727125EEEE98A73831EAF953A697D97A3797A824AE16770AF647FE25267DC0CFA406B711979D64444944901CBF806B0D13604EA8476FB394136A29C935BD6FC985369E4D106ACFC84A8478A62ECF1FEB96150BB20881E3C68BC457D2B7E18D57C45A92155867C19500576EA3288007314BD32E0BB7899885CF477A983AFC4733CC6F0499FFD11A31CA9495F0103A80F6E31ACEEE334EA67230203010001
Unknown Field: 2048
Unknown Field: C367D23966423B29BFC84EEF353E7D84
Unknown Field: 1.2.840.113549.2.5
Unknown Field: 4CB7E5BB09511F7B03283F649BF427D88EBB75A4
Unknown Field: 8D694B56B5380C2582CDF735D6198F4978A6711F55B72620F3E591653C31CA41
Unknown Field: 5
Unknown Field: paycor.com
Unknown Field: *.paycor.com
Unknown Field: 0
Unknown Field: 1.3.6.1.5.5.7.3.2
Unknown Field: 1.3.6.1.5.5.7.3.1
Unknown Field: 2.23.140.1.2.2
Unknown Field: http://crl.entrust.net/level1k.crl
Unknown Field: http://aia.entrust.net/l1k-chain256.cer
Unknown Field: http://ocsp.entrust.net

Protocol Used: TLS Version 1.2
http_persist_req(POST) entered.
http_long_ParseURL(): entered
http_long_ParseURL(): entered
do_oper(POST): entered
There are 0 cookies in the cache
POST /v1/tenants/400782/employees?subscription-key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx HTTP/1.1
Host: apis-sandbox.paycor.com
User-Agent: http-api/1.52
Content-Type: application/x-www-form-urlencoded
Content-Length: 11
Authorization: Bearer 
xxxxxxxxxxxxxxxxxxxxxxx.......................
senddoc(): entered
include=All
recvresp(): entered
SetError() #43: CommSSL_read: timeout!
recvresp(): end with timeout
http_close(): entered

Re: ommSSL_read: timeout

Posted: Fri Jul 11, 2025 8:56 pm
by rwillis2916
I've made some program changes, but I'm still getting error ommSSL_read: timeout.

Here's some of my relevant code.

Code: Select all

userid   = *blanks; 
password = Access;  // Load the access token into the password input field.                
                                                                                           
http_setAuth( HTTP_AUTH_BEARER                                                             
            : %trim(Userid)                                                                
            : %trim(Password) );                                                           
                                                                                           
form_data =  'include=All'; 

http_setOption('local-ccsid': '0');   
http_setOption('network-ccsid': '1208');  
http_setOption('content-type': 'application/x-www-form-urlencoded');
http_setOption('accept': 'application/json');  

url = 'https://apis-sandbox.paycor.com/v1/legalentities/377552/employees?' + 
      'subscription-key=' + %Trim(APIM); // app subscription key  

rc = http_req( 'POST'      
             : url         
             : *omit       
             : response    
             : *omit       
             : form_Data );
Here's the CURL statement that works just fine on the Postman website;

Code: Select all

curl --location --request GET 'https://apis-sandbox.paycor.com/v1/legalentities/377552/employees?subscription-key=<[i]key removed for security'[/i]>' \
--header 'Authorization: Bearer <[i]key removed for security[/i]>' \
--form 'include="All"'
Here's the CURL statement on the Paycor website that allows you to test the API. This works also.

Code: Select all

curl -X 'GET' \
  'https://apis-sandbox.paycor.com/v1/legalentities/377552/employees?include=All' \
  -H 'accept: application/json' \
  -H 'Authorization: bearer <[i]key removed for security[/i]' \
  -H 'Ocp-Apim-Subscription-Key: <key removed for security'
Both CURL statements return a JSON result set. Example;

Code: Select all

{
  "hasMoreResults": false,
  "continuationToken": null,
  "additionalResultsUrl": null,
  "records": [
    {
      "positionData": {
        "jobTitle": "Accountant",
        "jobCode": "CPA",
        "effectiveStartDate": null,
        "effectiveEndDate": null,
        "payGroupId": "f691705f-6792-0000-0000-0000d0c20500",
        "manager": {
          "id": "5d9dcfda-3af4-0000-0000-0000d0c20500",
          "employeeNumber": "78",
          "employee": {
            "id": "5d9dcfda-3af4-0000-0000-0000d0c20500",
            "url": "/v1/employees/5d9dcfda-3af4-0000-0000-0000d0c20500"
          }
        }
      },

Re: ommSSL_read: timeout

Posted: Wed Jul 16, 2025 10:21 pm
by Scott Klement
Most of what you've provided here doesn't seem relevant to the problem.

What is happening is that you are sending an HTTP request, and it is timing out getting a response from the request.

Possible causes:
  • An improper use of the HTTP_POINT_ADDL_HEADER exit point can send an improperly formatted request so that the server doesn't realize the request has completed, and it gets stuck waiting.
  • Some other data misformatted in the request is causing the same. (Possibly the subscription key, since you are not URL encoding it.)
  • The program on the server-side is crashing or getting stuck on an error and timing out
Comparing your curl statement to your HTTPAPI -- they are not the same at all. Your HTTPAPI is using a POST request, the CURL is a GET request. The CURL statement is doing an 'accept: application/json'. The HTTPAPI statement is apparently trying to do the same with the HTTP_setOption -- but this doesn't appear to be working as I don't see an accept: in your log. You are passing include="All" (with quotes) in the curl example as a parameter. But in HTTPAPI you are sending it without quotes and sending it as a request body (there is no request body at all in the Curl example since you are using GET).

Re: ommSSL_read: timeout

Posted: Thu Jul 17, 2025 8:20 pm
by rwillis2916
I was doing a post instead of a get. Rookie mistake because I coped code. But still didn't fix my problem The Get works on my on-premise development box running v7r3, but not on our IBM cloud PowerVS running v7r5. I suspect the problem is related to the VPN / firewall. I'm continuing to test on my development box, but eventually I'll have to open a case with IBM to run a trace and see why my get request is being blocked.