v1.00b - Original
v1.01b - Changed size of data parameter from 256 to 2048 characters.
v1.02b - Added option to specify *STMF for data parameter and use
a stream file to send the request data parameters.
v1.03b - Added parameters to specify userid and password for
v1.04b - Changed command to not show password in job log.
Internal processing updates.
v1.05b - HOST parameter wasn't being used. Fixed.
Authentication was adding an extra line feed causing errors
when making requests to some systems. Fixed.
v1.06b - Added ability to include Cookie: header. See parameter help
for location of RFC and formatting of this data.
v1.07b - Added SSL Timeout parameter to specify a timeout value for
the SSL Handshake operation
v1.08b - Added DEBUG paramter. When specified as *YES, the HTTP
header used will be written to the stream file
v1.09b - Changed the length of the cookie parameter from 1024 to
4096, the max specified in the RFC.
v1.10b - When doing a POST and specifying the URI data in a stream
file, size was limited to 32k. Changed this to be
unlimited. GET is still limited to 32k.
v1.11 - Removed beta status. Added REFERER parameter that allows
a user to specify a Referer that will be placed in the
HTTP header request.
v1.12 - Added timeout functionality. There is now a TIMEOUT
parameter on the GETURI command. The default is 30 seconds.
A special thanks to Paul Nicolay for assistance with
this portion of the utility.
v1.13 - Fixed Accept parameter. GETURI was always using text/html
and ignoring this parameter.
v2.00b - Beta version. Please be sure to test this version if you
were using a previous version in production for
compatibility with your applications.
Added ability to simulate an HTML form file upload.
Specify UPFILE(*YES) and you will be prompted with fields
to fill in the qualified file name located in the IFS to
upload, the form file field name, and the file content
Fixed debug file so that it won't be garbage if emailed or
Added CONNECTION parameter. This is used to specify a
Connection: value such as Keep-Alive in the header.
Added CLOSE parameter. This parameter allows you to specify
if the connection/socket should be closed after GETURI
v2.01b - Added ability to specify content-type.
Added ability to specify a SOAPAction header.
Removed extra CRLFs from POST actions.
Added a warning message that if the socket read times out
after 1 or more successful reads. The command will still
complete normally, but a warning message will be issued.
v2.02b - Added user defined header/data parmeters. With these you can enter
up to 20 user defined HTTP headers and associated data parameters.
Removed SOAPAction parameter. If you were using this previously
you can use the new user defined header section to include this
Minimum release level is now V4R5.
v3.00b - Added *HEAD as an option for request method.
Added API interface. See documentation for more information on this at:
v3.10b - Added Certificate Password parameter.
Added error checking so errors don't result in a hard halt from the
v3.20b - Added SSL Application ID parameter. This parameter is to assign
the GETURI application a unique ID that can be used when assigning
trusted certificates to certain applications.
v3.21b - Bug fix on using SSL Application ID parameter. Was allocating storage
incorrectly. Fixed to allocate a default of 4096 bytes using malloc().
v3.22b - Added EBCDIC to ASCII translation table parameter (EATABLE) and
ASCII to EBCDIC translation table parameter (AETABLE).
v3.23b - Increased size of storage allocated for application certificate from
4k to 32k.
v3.24 - Changed program to use the defaults QTCPASC for EATABLE and
QEBCDIC for the AETABLE values if left blank when using the API
Added parameters LOCIP and LOCPORT which allow you to specify a local
IP address and Port to bind the request to.
v3.25 - Updated application to set defaults for GI_CStore to *SYSTEM and
GI_Close to *YES if left blank.
v3.30 - **NOTE**
Updated registration to use Serial Number and Model number.
Removed display to screen only limit from unregistered version. Instead,
temporary keys will be issued to allow unlimited testing for a period of time.
-- Current Users --
Email me a note with your serial number(s) and model number(s) before you
install this version so I can get you a new key.
-- New Users --
Email me and I will get you a temporary key. This temporary key will allow you
to use GETURI with all functionality for a limited period of time. You
need a temporary key or a permanent key to use GETURI.
v3.31 - Fixed small problem with temporary registration key processing.
v3.32 - Fixed bug when errors exist and files aren't closed.
v3.33 - Fixed small bug when using *RETURN in the GETURIRG API
v3.34 - Added SPRHEAD parameter which can be used to supress the HTTP headers from
the result. This option is only valid with output type of *STMF or
*RETURN. If SPRHEAD(*YES) is specified and *STMF is the output type,
the headers will be placed in a file named "xxxxx.hdr" where "xxxxx" is the
file name specified for the output file name. If the API is used there is
now a 3rd parameter to the GETURIRG API call that will contain the headers
if the Supress Headers option is used.
v3.35 - Added UPNAME parameter. This is used when uploading a file (UPFILE(*YES)) and
allows you to name the file that is being uploaded anything you want. If
left as the default of *UPSTMF the stream file used, along with the entire path,
will be used as the filename (same as before this update).
v3.36 - Added CCSID parameter to be used for EBCDIC to ASCII and ASCII to EBCDIC
translations. This was added so the conversion functionality was more like
the TCPIP servers on the iSeries. When left as the default of *TBL, the
EBCDIC and ASCII tables specified will be used instead of the CCSID.
v3.37 - Fixed small bug when supressing headers and using SSL.
v3.38 - Added HTTPHEAD parameter. When specifying *NO no HTTP headers will be sent,
only the data. When *USRHDR is specifyied, only the user specified headers
will be used. Defaults to *YES which will perform as normal.
When specifying *NO or *USRHDR, the POST method must be used.
v3.39 - Fixed small bug where in rare cases when using API the returned data would
be shifted over on 2nd - nth calls.
v3.40 - Fixed bug when using API interface. The Content-length header was not
getting sent in some cases.
v3.41 - Forced Non-Blocking sockets.
Changed HOST parm default to *DFT which will use the domain name in the
request as the host name.
v3.42 - Changed URI parameter length from 128 to 256.
v3.43 - Updated to handle HTTP 1.1 chunked data and content length.
v3.44 - Fixed bug when using GET method and *STMF for input. Was putting data
in the URL and in standard input.
v3.45 - When specifying *DFT for HOST parmater added port to the string if it wasn't
a default port used.
v3.46 - Changed the maximum number of user headers from 20 to 50
v3.47 - Added the DEBUGF parmater in order to allow the user to name the debuf file
whatever they want. This value still defaults to /tmp/geturidebug.txt
and should not cause any conflicts with previous versions.
The new parameter added to the API interface is GI_DebugFile.
v3.48 - Internal updates for RXS.
v3.49 - Updates that possibly closed non-GETURI sockets causing issues with
v3.50 - Clean up closing stream files which may have also closed other sockets
v3.51 - Updated return variables for GETURI API from 32767 bytes to
v4.00 - Registration changes. See installation notes.
v4.01 - Fix to registration. If you received new permanent keys for v4.00, please
email us for a new key before installing.
Changed processing so if specifying a proxy and using basic authentication user
id and password it would use the Proxy-Authorization header for proxy
v4.02 - Bug in registration when using GETURI command. API still worked fine, but using
command showed unregistered message after upgrading to v4.00 or v4.01 and
installing new keys.
v4.03 - Added new parameters for Proxy Authentication so they are separate from the Basic
v4.04 - (SP061212) Updated GETURI to handle requests without HTTP headers.
(SP070102) Updated GETURI so Content-Length value is always started
back at zero.
Added *NONE options for HOST and CONTTYPE parameters. When used on either of
these parameters, the header specified as *NONE will not be sent.
v4.05 - Added new parms to GETURIRG API interface. They are as follows:
GetUri_Data - Parameter used to pass up to 65k of data instead of using the
GI_Data parm or a Stream file. To use this, the GI_Data parm must contain
the value of *PARM and the request method must be POST.
GetUri_MsgCd - Message code returned from the GETURIRG API.
C=Completed, D=Diagnostic Messages, E=Error
GetUri_Msg - Message text returned from the GETURIRG API. This is the same
message that is sent to the job log.
These new parms are included in the updated version of the GETURICOPY member.
Added error checking for blank URI.
Fixed bug when content length was zero it wasn't using a zero, instead a blank.
Updated application so that the HTTP headers are always returned in the
GETURI_Head paramater, not just when headers are supressed.
v4.06 - (v4.05 SP) Updated GETURI to throw error when no server is specified
instead of a STRING error.
(v4.05 SP) Added option of *OFF for the DEBUG parameter which will tell
GETURI to not send any messages during the running of the
(v4.05 SP) Changed SSLInitDS to a specific size of 64 bytes (per IBM)
(v4.05 SP) Updated Base64 encoding for userid and password when using
Basic Authentication. Base64 routine was automatically
adding CRLF to strings over 64bytes causing problems
Added new option to use the special value of *STMF for user header (USRHDR)
and a path to an IFS file for the user header data. This will import custom
headers larger that the parameters allow to be entered. Example:
v4.07 - (v4.06 SP) Fixed bug in GETURI when sending a diagnostic error it wasn't
closing files, sockets, etc.
(v4.06 SP) Allowed the value SOCKET to be used for the PROTO (GI_Proto)
parameter to be used when working directly with sockets.
(v4.06 SP) Allowed for parm value of *RETNC on the GI_OutType parm which
stands for "Return by no Translation". This means the data
will be returned without being converted to EBCDIC.
(v4.06 SP) Fixed issue when a colon was part of the URI but after the
server name (ie server.com/pgm:path)
Fixed bug when uploading some files was erroring out. Still having issues
with some files (like zip files) when uploaded.
v4.08 - (v4.07 SP) Added ability when using the GETURIRG API to specify a very long
URI in the GetURI_Head parameter. This is done by specifying the
special value of *GETURI_HEAD as the GI_URI parm and then
specifying the long URI in the GetURI_Head parameter.
(v4.07 SP) Updated application so when using a proxy with SSL that it would
use proper methods for communicating with the proxy.
(v4.07 SP) Updated debug file processing where it would error out if code page
1208 was used and the debug file would be blank.
(v4.07 SP) Fixed bug when converted data resulted in DBCS data
(v4.07 SP) Fixed bug when domain name started with a number.
(v4.07 SP) Added more debugging to conversion routines to put error number and
text in job log should an error be encountered.
(v4.07 SP) Fixed bug when converting 1208 to EBCDIC.
(v4.07 SP) Fixed bug when sending zero bytes on a POST.
(v4.07 SP) Fixed bug when sending no headers, an extra CRLF was being added to
the beginning of the data.
(v4.07 SP) Added SOCKET2 value for protocol to treat it more like an older
type socket where it reads until zero bytes are returned.
(v4.07 SP) Added debugging for reads from sockets when DEBUG(*YES).
(v4.07 SP) Fixed processing for protocol type SOCKET. It was stopping reading
if the size of the data returned was less than the size of the
receiver variable. It didn't do this before and was causing
issues with some existing processes.
(v4.07 SP) Added new debugging when DEBUG(*YES) is specified. This will create
a new file with the same name as the debug file, only with the added
extension of log (ie /tmp/geturidebug.txt.log). This file will
show all the processes such as opening files and sockets, closing
files and sockets as well as the values of the parameters passed in.
(v4.07 SP) Update debug file. Bytes read for stream file was incorrect, added
logging for select().
(v4.07 SP) Fixed issue with debug log files getting code page of 37 instead of
code page specified on command.
(v4.07 SP) Fixed bug when reading HTTP 1.1 chunked data. The CRLF at the end of
the data was being included in the results. Also added some more
info on chunked data to the geturidebug.txt.log file.
(v4.07 SP) Error when convering data to 1208 code page and conversion was made
to a DBCS piece of data. Fixed.
(v4.07 SP) Fixed bug when using *PARM data and length was > 32k.
(v4.07 SP) Fixed bug when using CCSID, data was getting converted incorrectly. This
bug only affected those who installed SP120426 which wasn't ever
available to the public.
Updated user header data field size from 128 bytes to 1024 bytes.
SP120812 - Fixed bug when 1 byte of data would get dropped randomly.
Bug when specifying CCSID and user headers, only first user
header would get used. Fixed.
Fixed bug when data started with space.
SP140830 - Fixed issue when not using a proxy and a port was included in
Fixed issue when CLOSE was set to *NO. It wasn't resusing sockets.
When using this option if you're specifying HTTP 1.1 by default the
socket will stay open. If you're using HTTP 1.0 you need to specify
keep-alive for the connection and even then not all servers will
work with this.
v4.09 - Added the option to specify *MULTIPARM when using the GETURIRG API for
the GI_Data parameter. This value will allow you to specify data in the
GetUri_Data parameter to be used in a multi-part POST.
Added parameters GI_PContType and GI_PContType to the Geturi_In variable.
these parameters allow you to specify the Content-Type value for the
parameter data and the stream file data, respectivley, when specifying
*MULTIPARM for the GI_Data parameter.
v4.10 - Updated background processing to use unique ID instead of timestamp for
SP141204 - Updated application so that when stream files are created
"other" users would get RWX authority to the files and not
SP150424 - Updated application to remove 100 character file name limit.
SP150609 - Updated application so the value of data area GU002DA will contain
the SSL protocol version to use. See
for protocol versions.
SP150701 - Updated application for CCSID conversions to be more efficient and faster.
SP150903 - Compressed debugging info for reading of header information.
v5.00 - Added licensing by date (SaaS) option.
SP151004 - Updated application so when retrieving to a PF the buffer
length was the same as the record length of the file
SP151123 - Fixed issue when reading chunked lengths for HTTP 1.1 data.
SP151201 - Found issue when trying to use GETURI and not send HTTP
headers. Wasn't recognizing *POST as POST method.
SP151221 - Fixed issue when CCSID of input data file was 1208. Would
return error Conversion error. RC(0) errno(3490). Fixed.
v5.10 - Changed all defaults for CCSID and Code Page to 1208.
Updated Base64 processing to use apr_base64_encode API.
v6.00 - If you are using the GETURIRG API you WILL need to recompile
any programs to make sure the new /COPY member GETURICOPY
is brought into your programs.
Increased User Defined Header (GI_UsrHdr) from 30 to
Increased User Defined Header Data (GI_UsrHdrDta) size
from 1024 to 2048 bytes.
Reduced maximum number of user headers from 50 to 20
v6.10 - Added PATCH request method.
v6.20 - Updated GI_BUser and GI_BPW from 64 to 128 bytes.
v7.00 - Added the ability to turn off SSL Strict Validation. This is done
by changing the value of data area GUSSL01DA to *NO. Any other
value in this data area, or if the data area is deleted,
will result in SSL Strict Validation.
Added new feature that in debug and when you specify SSL(*YES)
the SSL certificate used by the host you are connecting to will
be saved in the IFS as /tmp/<debugfilename>.cer.
v7.01 - Updated to grab content length of data stream file using API.
Updated trace file so loading content length was just a couple lines.
Added more info to trace file such as if it ends abnormally the
total bytes sent vs the total bytes of the file.
v7.10 - Added data area GU003DA that holds the buffer size to use for
reading and writing to and from stream files and sockets.
v8.00 - Fixed issue when using GETURIRG API where GI_CCSID wasn't defaulting
Updated to min OS version of V7R1.
v8.10 - Updated so when EWOULDBLOCK error (errno 3406) was encountered during
HTTP 1.1/SSL connections we would wait until socket was ready.
v8.20 - Updated so when reading non-chunked data and content-length is zero
v8.21 - Updated process for blocking to reset error count for each successful
v8.30 - Fixed small bug when reading chunked data and system would report a not
v8.31 - Fixed issue when using HTTP 1.1 and the data is NOT chunked and the size
was greater than the buffer.
v10.00 - Added option to use GSKit for SSL communications. This is done by setting
the SSLMODE parameter to *GSKIT for the command, or setting GI_SSLMode to
*GSKIT for the API. The default for this parameter is *DFT but in the
future it may change to *GSKIT as IBM seems to be moving away from
supporting the "legacy" SSL APIs.
Added SNI support. GETURI will by default use the host name as the SNI
parameter on SSL connections. This can be overridden using the SNI
parameter on the command or the GI_SNI field in the API. This field is
only valid with using *GSKIT for SSL.
v10.01 - Added data area GUSSL02DA that can be used to tell the system which SSL
APIs to use. The value of *GSKIT will use the GSKit APIs and anything else
will use the standard IBM SSL APIs. This value can also be overridden on the
GETURI command by specifying *IBM for the IBM SSL APIs, or *GSKIT for the
GSKit SSL APIs.
v10.02 - Added code so that if GI_SSLMode isn't passed in it will default to *DFT.
Changed default of data area GUSSL02DA from *DFT to *GSKIT so the GSKit will
be used by default for SSL connections.
SP191004 - Fixed bug when reading chunked data and the 2nd to last
byte read was part of the ending CRLF of the chunked data.
Added more debugging/verification to chunked data reading
to log file.
SP200225 - Fixed issue when sending requests without a path on the URI
and sending query string data.
SP200505 - When using option *STMF data will also be returned in the
GetUri_Out parameter on the call to GETURIRG.
SP200506 - Added code to make sure PF is closed if *FILE output type
is used. Also added logging to the debug file for opening
and closing the PF.
v10.10 - Added F.GETURI service program that contains ILE function used to
SP200827 - Added check for GSK_WOULD_BLOCK error to reading chunk length.
Added more debugging messages so operations are more clear
as to when errors happen.
v10.11 - Updated to work with files > 2GB.
Updated DEBUG paramter to include the option *ALL. This option
will function as *YES did in previous versions displaying
verbose debugging. The value *YES will now skip most read, write
and stat() function calls to reduce the size of the debug file and
make it easier to read.
SP200911 - Changed HTTP headers Content-type and Content-length to
Content-Type and Content-Length because apparently one server
is looking for headers as case sensitive. *tsk tsk*
SP200928- Updated to accept Content-Type header values using HTTP 1.1
larger than 2GB (updated field size to 64 bit int).
v11.00 - Change of parmeter sizes and types to Varying. This now allows returning
up to 1MB of data into your application. If you are using the GETURIRG
API this will require recompilation (at the very least) of your
It is STRONGLY encouraged that all new development is done using the ILE
functions included in the F.GETURI service program as well as converting
existing applications to use the same.
Removed EBCDIC to ASCII translation using tables and QDXLATE
GI_URI increased to 65535 bytes.
GI_UsrHdr increased to 2048 bytes.
GI_UsrHdrDta increased to 65535 bytes.
GI_Data increased to 65535 bytes.
Changed default of PROTOV from 1.0 to 1.1.
Allowed any method on command. (Already allowed in API and ILE functions).
Change display of data when using * as return type on GETURI command to
use a stream file instead of a PF.
Changed PORT parameter default from 80 to *DFT which will automatically use
port 80 if SSL is set to *NO or 443 if SSL is set to *YES.
Removed proxy support. This will not be added back in unless for some reason
proxy technologies are updated and used as normal vs NAT.
Any port specified on the URI will be igored.
Added more debug details to trace files.
Added #geturi_getHeader() function to F.GETURI to allow retrieval of HTTP header
Added #geturi_getResponseCode() to F.GETURI to allow retrieval of HTTP
response code (and optionally the response text).
Removed use of data area GU003DA for stream file read buffer size. Defaults
to the size of the buffer in the application now.
Removed COOKIE paramter. Use User Defined Headers for this if required.
Added source PF QRPGLESRC to GETURI library which includes a small sample program
that uses the ILE functions included in the F.GETURI service program.
SP210120 - Updated #geturi_resetValues() to initialize all variables
not just the GetUri_In data structure.
SP210713 - Updated Content-Type to be set with the content type specified
when upload file (gi_upfile) is *YES.
Increased size of Upload File Content Type (gi_upcont) from 64 to
SP211119 - Changed METHOD on GETURI command to 10 characters and added
*DELETE as an option.
SP211121 - Added option *ALL to Suppress Headers (SPHREAD) so that when
your output is a stream file the .hdr file is not created.
v11.10 - Added option of *STMFRAW for the DATA parameter (or GI_Data) so that when
using a stream file for the POST data it will read and write the data from
the stream file as raw and not do any conversions.
v12.00 - Removed the # from the beginning of all ILE function names for better
compatibility in different code pages.
SP220106 - Updated GET requests so data wouldn't be corrupted.
Allow blank or *NONE for ACCEPT parameter. If so, this header
will not be used.
SP220201 - Fixed issue where if debug wasn't *ON or *ALL error messages
wouldn't be reported when using the GETURI command. Changed
it back to previous behavior where it will send an error
message unless debug is set to *OFF. The value of *NO will
still send errors as well.