RPG-XML Suite Changelog
HTTP Communication - RXS_Transmit() and RXS_getUri()
- Enhanced RXS_TransmitDS_t data structure with new subfield FollowRedirects to control if RXS_Transmit() will automatically follow HTTP 3XX status code redirects. The default value is
RXS_YES to maintain compatibility with prior releases
- Enhanced RXS_Transmit() logfile output to indicate that SSLCertStore will use the *SYSTEM certificate store by default
- Enhanced RXS_CreateJsonDS_t with new subfield TrimVariables to control if RXS_ComposeJsonString() will trim excess whitespace from composed JSON values. The default value is
RXS_NO to maintain compatibility with prior releases
- Corrected issues that could occur when passing JSON names as fields instead of literals when composing JSON
- Corrected issue with RXS_CreateJson() that could cause an
KTA120A: RXS_CreateJson() was provided an invalid data structure parameter error when using
- Corrected issue with RXS_PutStmf() silently failing when not provided with a filepath
XML Composition APIs
- Added RXS_GetComposeBufferLen() API based on customer feedback. This API can be used to retrieve the current length of the compose buffer similar to the functionality of RXS_GetJsonStringLen()
- Corrected text description of PORT parameter on CRTRXSSVR command
- Corrected issues preventing RXS Router
-passwd flag from working correctly when the QPWDLVL system value was set to 2 or 3
- Enhanced RXS Router
-passwd flag to support passwords up to 128 characters and removed character restrictions
-passwd flag for RXS Router to support
*NOPWDCHK to allow profile swapping to IBM i user profiles with their password set to
- Enhanced RXS Router to send a message to the CGI joblog on start to show which version of RPG-XML Suite is being used
- Enhanced RXS Router debug report page to show which version of RPG-XML Suite is being used
HTTP Communication - RXS_Transmit() and RXS_getUri()
- Updated RXSURI command to internally call RXS_Transmit() instead of RXS_getUri(). The log file generated by RXSURI now reflects the RXS_Transmit() log format as a result
- Updated default values specified in the RXSURIP file used by the RXSURI command. Requests will now use HTTP 1.1 and CCSID 1208 by default. These values replace the defaults of HTTP 1.0 and CCSID 819 used in previous versions
- Corrected issue which could cause intermittent SSL timeout errors to appear in the RXS_Transmit() log file in rare cases
- Added support for AES-128, AES-192, and AES-256 encryption to RXS_Crypt()
- Corrected issue with unexpected output when using RXS_Convert() to perform URL percent encoding where multibyte characters were present
- Enhanced RXS_ConvertURLPercentDS_t with two new subfields, InputCCSID and OutputCCSID, both of which are defaulted to the CCSID of the current job
- Corrected issue which could occur rarely when using RXS_Convert() to perform CCSID conversion with empty input
- Corrected issue with how the JSON compose APIs handle CCSID conversion of some non-printable characters to UTF-8, which could result in incorrect output of multibyte characters after conversion
XML Composition APIs
- Corrected issue introduced in 3.4.0 which could cause RXS_GetComposeBuffer() to retain previously retrieved composed data
XML DOM Parsing APIs
- Corrected issue with the RXS3 DOM APIs which could prevent loading XML documents larger than 4MB
XML Event Parsing APIs
- Corrected issue introduced in 3.4.0 which caused RXS2 RXS_parse() error messages to be partially returned in an incorrect CCSID
- The minimum supported operating system version is now IBM i 7.1
- RPG-XML Suite's version number now uses the format MAJOR.MINOR.PATCH to be more in line with commonly used semantic versioning standards
- The RXS 2 and RXS 3 APIs are no longer separately versioned as they were in previous releases. Output provided by the DSPVER and DSPMCHINF commands as well as the VERRXSBASE program will now only report a single version number
- Example source code for the RXS 2 APIs is no longer provided in the included EXAMPLE source physical file. We recommend all new applications are written using the RXS 3 APIs. Example code for the RXS 3 APIs has been moved to the EXAMPLE source physical file
- Example programs are no longer provided in a compiled state during the installation. This change was made based on customer feedback
RXS 2 Copybook
- The RXSCP copybook containing the RXS 2 API prototypes, data structures, and constants which was previously located in the included RXS source physical file has been moved to the included QRPGLECPY source physical file. Existing programs using the RXS 2 APIs will continue to work without modifications, but before any future recompilation you will need to change the
/copy RXS,RXSCP line in your programs to be
HTTP Communication - RXS_Transmit() and RXS_getUri()
- Changed RXS_Transmit() and RXS_getUri() to use the IBM GSKit SSL APIs for SSL/TLS communication. This allows for SNI support and other improved capabilities. Note that this may cause RXS_TransmitDS_t.SSLVerifyPeer and RXS_TransmitDS_t.SSLVerifyHost subfields to no longer ignore missing/invalid SSL certificates in all circumstances, and you may begin receiving errors as a result after upgrading. If you do, you should install the SSL certificates for the endpoint you are calling
- Corrected issues with RXS_Transmit() which could cause a generated log file to be empty
- Enhanced the RXS_TransmitDS_t data structure to include a new LocalInterface subfield. LocalInterface can be set to an IP address. When set to an IP address, RXS_Transmit() will use this value to determine the proper network interface to use.
- Enhanced the RXS_TransmitDS_t data structure to include a new EnableIPv6 subfield. EnableIPv6 can be set to RXS_YES or RXS_NO (default: RXS_NO). When set to RXS_YES this option will allow RXS_Transmit() to resolve a host name to either the IPv4 or IPv6 address instead of being limited to only resolving to the IPv4 address.
- Corrected issue with RXS_Transmit() when performing a HTTP DELETE operation
- Corrected issue preventing RXSURI command from properly sending custom HTTP headers in some circumstances
- Enhanced JSON parsing and composing API internal code, which corrects a number of issues with memory usage and CCSID handling as well as JVM conflicts. Any existing programs that are parsing or composing JSON should perform substantially better
- Previously, the JSON APIs relied on files in the IFS stored in a /krengeltech directory. This directory is no longer required starting with RXS 3.4.0 and can be safely removed
- Calling RXS_DestroyJson() is no longer required after RXS_ParseJson(). RXS_DestroyJson() now only needs to be called on the RXS_CreateJsonDS_t that was originally used in a call to RXS_CreateJson(). Existing code which calls RXS_DestroyJson() after RXS_ParseJson() will continue to function without any changes or recompilation required, but we recommend reviewing your code to remove any unnecessary RXS_DestroyJson() calls
- Added RXS_FormatJson() API based on customer feedback. This API can be used to format a JSON document or STMF to either minify the document, or to expand it and control indentation and whitespace
- Added RXS_GetJsonStringLen() API based on customer feedback. This API will return the length of character field needed to store the JSON document composed in the provided RXS_CreateJsonDS_t
- Enhanced JSON APIs to support duplicate keys within objects per JSON RFC 7159
- Enhanced RXS_ComposeJsonString() to allow *Omit for parameter 2. *Omit is treated as equivalent to passing a 0 length empty string
- Enhanced error messages for all RXS JSON composition and parsing APIs to provide more detail
- Enhanced validation for RXS_ParseJson() settings. As a result, programs that are calling RXS_ParseJson() without specifying a parsing handler will throw a new error message
- Corrected issue when using RXS_ParseJson() to parse a JSON document which contained empty child JSON objects
XML Composition APIs
- Enhanced the RXS_ComposeDS_t data structure to include a new TrimVariables subfield. TrimVariables can be set to RXS_YES or RXS_NO (default: RXS_NO). When set to RXS_YES this option will cause RXS_ComposeVariable() to remove all leading and trailing whitespace from the passed value equivalent to if the value had been wrapped by the RPG %Trim() built-in function
- Enhanced the RXS_ComposeDS_t data structure to include a new EncodeVariables subfield. EncodeVariables can be set to RXS_YES or RXS_NO (default: RXS_NO). When set to RXS_YES this option will cause RXS_ComposeVariable() to encode all XML reserved characters (& ' " > <) with the appropriate entities (& ' " > <) in the passed value
- Enhanced RXS_ComposeVariable() to allow
*Omit to be passed for parameter 2.
*Omit is treated as equivalent to passing a 0 length empty string
- Corrected issue preventing RXS_ComposeVariable(), RXS_ComposeSection(), and RXS_GetComposeBuffer() from throwing an error when RXS_StartComposeEngine() had not previously been called
- Corrected issue when using RXS_Convert() to encode XML entities that could lead to a memory leak in certain scenarios
- Corrected issue causing RXS_Convert() to throw an error when provided with an empty character field for input
- Corrected issue preventing
*Omit from being used as the first parameter for RXS_Crypt()
- Corrected issue with RXS_Crypt() MD5 and SHA hashing memory usage and IFS file access
- Enhanced the BLDPRS command to support generating RXS 2 XML parsing code, RXS 3 XML parsing code, or JSON parsing code. BLDPRS can now also generate either mixed or column-limited full free format RPG. As part of this update, the names of some existing parameters were changed and new parameters were added
- Enhanced the BLDTPL command to provide better CCSID handling and performance. As part of this update, the names for some parameters have been changed
- Enhanced the BLDTPL command to no longer remove the XML prolog during template generation based on customer feedback
- Enhanced the CRTRPGTPL command to write a comment section in the generated template member that contains the full command used to generate the template for future reference
- Added RXS_RenameStmfDS_t as option to RXS_ProcessStmf() to allow for easier IFS file renaming
- Corrected intermittent error message caused by RXSRTR appearing in Apache job log
- Corrected issue preventing RXS_GetUrlVar() from handling empty URL variables properly
- All included commands now provide help via included *PNLGRP objects
- Internal changes to allow initial SNI support.
- Corrected an issue with ScriptAliasMatch directives when building a new httpd.conf file.
- RXS_Convert() now works properly when URL encoding/decoding strings over 64K
- RXS_GetJsonString() now works properly in all situations with JSON prettification disabled.
- RXS_RESETDS() now works correctly with RXS_CreateJsonDS_t, RXS_JsonStructureDS_t, RXS_ParseJsonDS_t
- RXS_GetEnvVar() now correctly returns an empty string for variables which do not exist
- RXS_Parse() no longer requires programs compiled under v3.31 or earlier to be recompiled to avoid a decimal data error. This affected only programs running under v3.32 after last being compiled with v3.31 or earlier.
- RXS_ResetDS() now supports: RXS_DS_TYPE_CREATEJSON, RXS_DS_TYPE_JSONSTRUCTURE and RXS_DS_TYPE_PARSEJSON
- RXS_GetStdIn() now properly handles binary output to a stream file
- Performance enhancements to RXS_Parse()
- Performance enhancements to RXS_ComposeVariable() and RXS_ComposeSection()
- Improvements to RXS_OpenDom() to prevent XML declarations from conflicting with the DOM parser's internal character set handling
- Improvements to error handling in RXS_Throw() and RXS_Catch()
- Improved memory handling and performance in RXS_Convert()
- Improvements to error reporting in RXS_OpenDom(), RXS_Parse() and RXS_Convert()
- Improvements to RXS_GetUrlVar() and RXS_GetStdIn() when processing URL encoded content
- Improved BLDTPL to output variable names that conform to RPG's naming rules
- Performance enhancements to speed licensing functions
- RXS_ParseJson() prototype changed to use Const instead of Value. All programs parsing JSON will need to be updated and recompiled.
- Improved error reporting when parsing a JSON string with incorrect syntax
- Improved error reporting when processing JSON without authority to required IFS objects
- Correction to RXS_ComposeJsonBoolean() so that composed values are correct
- Improved memory handling when composing very large XML strings
- Improved performance when parsing large stream files
- Improved support for calling non-CGI programs from RXSRTR function
- Corrected a problem with multi-byte characters in request data causing a false timeout condition when calling RXS_Transmit()
- Corrected a problem with multi-byte characters in XML data causing RXS_Validate() to fail when it should have been successful
- Changes to the Compose engine to correctly handle repeating data when using the OmitUncomposedLines option with multiple calls to RXS_ComposeSection()
- Improvement to RXS_ComposeVariable() to allow
*BLANKS to be passed on the second parameter, without composing 16MB's of blanks/spaces and instead the composed content will be the same as if a zero length value had been passed
- Corrected an issue that required programs using RXS_Transmit() to be recompiled. Recompiling is no longer needed
- Improvements to CRTRPGTPL to better handle templates that have invalid formatting or characters that are not allowed in RPG variables names
- RESTful HTTP Methods such as PUT, DELETE, HEAD, OPTIONS and PATCH (POST and GET continue to be available)
- Easy parsing of content from RESTful URI’s such as http://www.example.com/customer/53874
- Support for dynamic as well as compiled templates
- Extended length templates up to 256K
- Automatic compression of whitespace when composing from templates
- Automatic omission of uncomposed template content
- New function RXS_ResetDS() for easily initializing data structures used by the RXS3 API
- Enhanced RXS_GetStmf() to allow easy reading of stream file content in “chunks” within a loop
- Enhanced RXS_PutStdOut() for easy output of HTTP Status, Content Type and other HTTP headers
- Extended support for very large XML stream files when using the event based parser
- Improvements to CRTRPGTPL command
- Read STDIN over 16MB directly to a stream file
- Output large stream files over 16MB in size to STDOUT
- Improved logging from RXS_Transmit()
- Improved RXS_Transmit() when using Basic Authority so that only one request is made to the remote server
- Improved STMF handling to inherit authority from the host directory when creating new STMFs
- Full support for XPath 1.0 compliant Parsing
- Added DOM parsing APIs:
- Completely new RXS3 API introduced. This API has been redesigned from the ground up and hands the RPG developer an even more powerful tool.
- Full support for 16 MB in-memory variables
- Base 64 encoding
- Full UTF-8 support and improved CCSID handling
- Enhanced data security
- Minimum operating system supported is now IBM i 6.1
- Improved compatability with proxy configuration in previous versions.
- Improved availability of joblog messages in CGI jobs running via RXSRTR and also using activation groups
- Expanded number of variables allowed in one section of a template
- Allowing only IPv4 when using RXS_getUri(). IPv6 will require use of RXS_Transmit()
- Resumed support for LocalIP and LocalPort settings when calling RXS_getUri()
- Improved backwards compatability when using RXS_getUri() with HTTP Get method
- Improved support for conversion of XML entities during parsing
- Improved parsing of content that contains XML entities in combination with multi-byte character sets such as UTF-8
- New options for RXS_getUri() that allow host and peer verification to be turned off
- Improved STMF handling to inherit authority from the host directory when creating new STMF's
- Improved RXS_getUri() to handle URI's that do not start with http or https
- Improved RXS_getUri() when using Basic Authority so that only one request is made to the remote server
- Improvements to CCSID handling when outputting to existing stream files with multi-byte character sets
- Correction to template engine when outputing stream files encoded as UTF-8 or other multi-byte character sets
- Enhancements to BLDPRS command
- Ignore default namespaces in DOM parser unless DOM_INCNSATR set as an option
- Updates to HTTP client to correct output to debug files when multiple communications are transmitted
- Created RXSMENU, DSPVER, DSPLIC and APYLIC commands for menu driven version and licensing tasks
- Seperate licensing library KTLIC no longer required
- Enhancement to allow multiple members in RXSCFG to allow member names to reflect RXSRTR environment names when desired. (The RXSCFG member is the default when RXSRTR is not in use or a member matching the environment name is not found.)
- When creating Apache instances, changed logs directory authority to
- Licensing updates for certain IBM serial numbers and for BLDTPL and BLDPRS commands
- Enhancements to RXS Router allowing single library installation for simplified configuration and streamlined upgrades.
- Improved CCSID handling to support character sets outside of North America
- Various performance improvements and bug fixes
- New licensing system
- New RXS_getUri() communications client
- Correction to allow case insensitive XPath's when using the DOM parser
- Enhancements to RXS Router allowing single library installation for simplified configuration and streamlined upgrades. Improved CCSID handling to support character sets outside of North America
- Fixed bug in DOM parser to intialize storage used in previous parses
- Improved limits in DOM parser allowing increased element count in parsed XML
- Enhanced RXS Router to allow mixed case for RXSRTRCTL option switches
- Fixed bug in RXS_getUrlVar() to allow encoded ampersands to be decoded correctly (%26)
- Enhancement to RXS_getUrlVar() to decode percent encoded characters correctly when CGIConvMode is set to MIXED
- Fixed parser bug to allow UTF-8 double-byte characters in attribute data
- Fixed bug in RXS_getUrlVar() when the last variable's value in QUERY_STRING was a single character.
- Fixed bug where RXS_getUrlVar() was returning the & char in the event of an empty QUERY_STRING variable.
- Enhancement: Options used when calling RXS_DOMSetOpt() or RXS_DOMBuild() have been simplified.
- Fixed bug: Modified the template engine to ignore other forms of whitespace at the end of sections names. Previously, if invisible characters existed due to copying template code from Word or PDF documents, the section name would not be detected properly and would require the template to be modified.
- Modified RXS Router added in v2.10 to exist in base RXS library, rather than a separate library.
- Modified RXS Router command INZRXSRTR to be executable by users with authority to RXSRTRCTL and INZRXSRTR.
- Modified RXS Router httpd.conf to allow multiple types of CGI invocations. This allows you to configure URLs which bypass the router if needed.
- Fixed bug where DOM Parser functions RXS_DOMGetData() and RXS_DOMGetDataCount() would return incorrect values when using repeating elements.
- Fixed bug where sometimes during install, data area RXSBASE was not being given appropriate authority, and would falsely report that an RPG-XML Suite license key was invalid immediately after installation.
- NEW FEATURE: Added new "RPG-XML Suite Router" functionality. This will ease the offering of web services as it takes care of altering the library list and user profile before your web service is invoked.
- NEW FEATURE: RXS HTTP Command to make it easier, and safer, to end, start, and configure your Apache server instances.
- Enhancement: When processing template files (i.e. IFS .tpl files), the section names will have
*Blanks trimmed from the end of their name. Previously, if blanks existed, the template engine wouldn't consider the name and the .tpl would have to be modified.
- Enhancement: Allow RXS_getEnvVar() to be called multiple times. Normally in the case of GET based web services there has been a single URL parameter named "xml" that would contain the inbound XML. With RESTFul web services making a mark in the web services world we have expanded the RXS_getEnvVar() API to facilitate multiple calls for differently named variables.
- Enhancement: Traditionally when there were unmatched delimiters in a template file (i.e. IFS .tpl files) it would throw a MCH0603 error. Now a more informative message will be relayed to the job log.
- Enhancement: Speed improvements have been made in the RXS_DOM* based parsing API's.
- NEW FEATURE: Added DOM features for simplified parsing of XML documents. New APIs include:
- Fixed bug where RXSCFG was being read for each call to RXS_getUri() or RXS_initTplEng() and now it is just called the first time in each job and then the data is cached to better performance.
- Fixed bug that was causing issues when RXS was used in conjunction with DDM files or RPG being front ended by stored procedures. This was a bug that affected few customers in very specific usage scenarios.
- Modified RXS_getUri() to use 65535 VARYING vs. 65535 without VARYING. This addresses issues when trying to pass by reference and not having the exact same string type.
- RXSCP fields RXS_getUriOut, RXS_getUriHead, and RXS_getUriData have been deprecated and commented out. They will be physically removed from RXSCP in v1.5. If you had version 1.4 installed you will need to recompile your programs to use this latest version.
- Modified RXS_getUri() to default to port 443 if port is 0 and SSL=RXS_YES was specified.
- NEW FEATURE: RXS_setParseEnc()
- NEW FEATURE: RXS_ignElemNamSpc()
- Modified commands BLDPRS and BLDTPL to better handle long XPaths
- Modified default delimiters to be
:: for section names and
.:var:. for variable names. In previous versions they were
/$ for section names and
/%var%/ for variable names. This was changed for variety of reasons with the biggest being usage in foreign countries. By using colons and periods the code can be typed faster for manual modification of templates. If you are upgrading you should do an UPDDTA RXSCFG and change the defaults to
/$ for section begin delimiter,
/% for var begin delimiter and
%/ for var end delimiter.
- NEW FEATURE: Added RXS_addLibLE()
- NEW FEATURE: Added RXS_libLEExists()
- NEW FEATURE: Added RXS_rmvLibLE()
- NEW FEATURE: Added RXS_getBuffLen() to get a count of bytes in the Template Engine buffer to know if it is over 65535 and thus to big to retrieve with RXS_getBuffData().
- NEW FEATURE: Added RXS_getBuffData() to get the Template Engine data that is currently buffered so it can be put into a 65535 VARYING field and used on RXS_getUri().
- Changed HTTPD.txt to not use $ signs (also changed NEWENV command)
- Fixed bugs in BLDPRS that were making it not work right with long xPaths.
- Added delim fields to RXSCFG
- Changed RXS_initTplEng() to operate off of default delimiters in RXSCFG and change default delimiters in program to not be constants.
- Changed RXS_updVar() to be able to do 65535 varying, was set at 1024 at an inner level of code.
- Enhancing RXS_soapDecode() for speed and accuracy.
- Adding code to BLDPRSR and BLDTPLR to not delete user index unless it exists. It was putting messages in job log uncessarily
- Added DftTransDir to RXS_readToFile() if no path was specified.
- Added DftTransDir to RXS_outFromFile() if no path was specified.
- Added DftTransDir to RXS_deleteFile() if no path was specified.
- When using RXS_readToFile() extra spaces were sometimes added to the end of the files contents. This has been addressed to not have additional spaces.
- Change error text in RXS_cmpTransFile() to be RXSCFG instead of CONFIG.
- Added defaults for RXS_getUri():
This will save typing when using RXS_getUri() as not as many data structure fields will need to be filled.
- When a POST with zero content is sent and RXS_readToFile() is used an error was inappropriately thrown. Now no error is thrown.
- Changed RXS_readToFile() to truncate content on IFS open.
- Changed RXS_getUriOut and RXS_getUriHead from 32767 to 65535 in RXSCP (main RXS copybook)
- Added field RXS_getUriData to RXSCP in relation to new RXS_getUri() functionality
- Changed RXS_getUri() to be able to send and receive 65535 bytes of data if not using IFS files. Previous limitation was 2048.
- Added new OutType of RXS_VAR to RXS_initTplEng(). This should be used in conjunction with RXS_getBuffData().
- !!RECOMPILE!! Changed RXS_getUri() to have the second, third and newly added forth parms as
OPTIONS(*OMIT) for ease of use (so you don't have to specify them if you aren't using them)
- Added example TPLENG3 to show how to use RXS_getBuffData().
- The field RXS_GetUriHead (i.e. response HTTP Headers) will always be returned when a variable is specified vs. only being returned when SprHead (Seperate Headers) is specified. This pertains to RXS_getUri().
- Modified client app Web Service Tester to save responses to a stream file and retain URLs that have been accessed.
- Renamed RPG-XML Suite config PF, MYRXS/CONFIG, to MYRXS/RXSCFG.
- Changed RXS_parse() to
%TRIM input file name
- Changed RXS_parse() to throw an error if file to parse doesn't exist.
- Added RXS_soapDecode()
- Increased RXS_updVar() input to 65535.
- Changed RXS_initTplEng() to
%TRIM out file name
- Added example GETURI4 to show Template Engine overriding of sections/variables and also ability to override event handler type values.
- Added RXS_charToTimestamp()
- Added RXS_timestampToChar()
- Added RXS_charToBln()
- Modified RXS_charToNbr() to have default value parameter.
- Added parsing code generator BLDPRS(Build RPG Parsing Subprocedure)
- Added template generator BLDTPL (Build Template)
- Added RXS_getUri() PUser and PPW (Proxy User and Proxy Password)
- Added DSPMCHINF for ease of displaying machine information.
- Changed RXS_loadTpl() to allow overriding abilities for section and variable delimiters. For internationalization purposes.
- Changed RXS_parse() to allow the passing of handler event type value overrides (i.e. ELEMBEGIN, ELEMCONTENT, ELEMEND, ATTR). For internationalization purposes.
- Added example RXS6 to show Template Engine overriding of sections/variables and also ability to override event handler type values.
- Modified install *SAVF to be V5R1 instead of V5R3