[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
RE: Ftpapi Digest, Vol 62, Issue 20
Thanks for the advise on activating the http log, Thomas.
Now then, I suspect the problems occur in the parsing and/or presentation of the response from the web service. Given that it's not a publicly accessible server, I guess the next step is for me to share the stub, caller, and log data, and hope someone knows what to make of it. The Northbound Interface shows a fairly extensive set of key/value pairs returned for this request. It appears from the returned xml in the log that there are indeed many, many key/value pairs. I would have figured the Stub would return a data structure much like the one sent to the service (e.g., comprised of an integer to indicate the number of pairs, and an array of key/value pairs). But the Stub does not reflect that. Perhaps from a failing in the WSDL itself?
We run version 6.1, with WSDL2RPG 1.14 beta 11. Httpapi is version 1.24. Expat was loaded with Httpapi, and appears to be circa 05/2007.
Provided below are the stub, caller, and httplog data.
If I don't see a reply before 6 PM (US-Eastern), I'll be back at it on Monday.
Thanks.
Michael
__________________________________
The Stub source (modified to imbed log on credentials in the URL) is as follows:
/IF NOT DEFINED(PROTOTYPE_TSTINVEN01)
*======================================================================
* Generated by WSDL2RPG 1.14beta11 / 23.07.2011
* Built on Aug 18, 2011 (13:20:52)
* Built for V6R1M0
* Based on WS_STUB v1.14
*======================================================================
*
* Please search for 'INFO:' to get basic information how to call
* the web service.
*
* Default attachment handling (for demonstration) was added to
* WS_STUB but is disabled by default.
*
* In order to enable or disable default attachment handling you have
* to define or undefine the following compiler condition name:
* DEFAULT_ATTACHMENT_HANDLING
/UNDEFINE DEFAULT_ATTACHMENT_HANDLING
*
* By default attachments are stored in folder:
* '/tmp/attachments'
*
* You can change the default attachment folder by calling the
* following procedure before calling the web service:
* Inventory_setAttachmentFolder()
*
* Default attachment handling was added to demonstrate how
* to manage attachments. Please search the generate stub
* module for 'TODO:' to see what code belongs to attachment
* support.
*
* Log4rpg:
/UNDEFINE LOGGING_SERVICE
*
*======================================================================
* Pre-Compiler tags used by STRPREPRC to retrieve creation
* commands from the source member.
* ---------------------------------------------------------------------
* >>PRE-COMPILER<<
* >>CRTCMD<< CRTRPGMOD MODULE(&LI/&OB) +
* SRCFILE(&SL/&SF) +
* SRCMBR(&SM);
* >>COMPILE<<
* >>PARM<< TRUNCNBR(*NO);
* >>PARM<< DBGVIEW(*LIST);
* >>END-COMPILE<<
* >>EXECUTE<<
* >>CMD<< CRTSRVPGM +
* SRVPGM(&LI/&OB) +
* MODULE(&LI/&OB) +
* EXPORT(*ALL) +
* BNDSRVPGM(*LIBL/WSDL2RPGRT +
* *LIBL/MIME +
* *LIBL/HTTPMIME +
* *LIBL/BASICS1) +
* TEXT('+
* Web Service: getProfiles()+
* ') +
* DETAIL(*BASIC);
* >>END-PRE-COMPILER<<
*======================================================================
H NOMAIN
H DEBUG
H BNDDIR('HTTPAPI' : 'QC2LE' : 'TFSUTILS')
H OPTION(*SRCSTMT : *NODEBUGIO)
H EXTBININT(*YES)
/ENDIF
*
* INFO:
* This is the procedure you call to consume the Web Service:
* ----------------------------------------------------------
* Operation: impl:getProfiles
* Returns : impl_getProfilesRpc
*
* INFO:
* Include fields in your test/production programs referring to the *_t
* type templates used in this prototype, using a LIKE(*_t) or LIKEDS(*_t).
* These fields will be your request and response messages.
*
D Inventory_getProfiles...
D PR likeds(impl_getProfilesRpc_t)
D extproc('Inventory_getProfiles')
D i_in0 likeds(apachesoap_Map_t)
D o_msg like(wsdl_errText_t )
*
* Array dimensions:
D DIM_A1 C 256
D DIM_A2 C 256
*
* Types:
*
D apachesoap_mapItem_t...
D DS template
D qualified
D key 4096A varying
D value 4096A varying
*
*
D apachesoap_Map_t...
D DS template
D qualified
D item likeds(apachesoap_RpgArrayOfItem_t)
*
*
D apachesoap_RpgArrayOfItem_t...
D DS template
D qualified
D x 10I 0
D mapItem likeds(apachesoap_mapItem_t)
D dim(DIM_A2)
*
*
D impl_getProfilesRpc_t...
D DS template
D qualified
D getProfilesReturn...
D likeds(impl_RpgArrayOfArrayOf_xsd_...
D anyType_t)
*
D impl_item_of_anyType_t...
D S 4096A varying
D template
*
D impl_RpgArrayOfArrayOf_xsd_anyType_t...
D DS template
D qualified
D x 10I 0
D item like(impl_item_of_anyType_t)
D dim(DIM_A1)
/IF DEFINED(LOGGING_SERVICE)
*
* Starts the Log4rpg logging service.
D Inventory_startLoggingService...
D PR
D extproc('+
D Inventory+
D _startLoggingService+
D ')
D i_path const like(LOG4RPG_path_t )
D options(*nopass)
D i_waitMinutes 10I 0 const options(*nopass)
D i_unit 10A const options(*nopass)
/ENDIF
*
* Web service: Enables/disables the debug log of HTTP API
D Inventory_setHttpDebug...
D PR
D extproc('+
D Inventory+
D _setHttpDebug+
D ')
D i_status N const
D i_fileName 500A const varying options(*nopass)
*
* Web service: Sets the proxy server to use for the connection
D Inventory_setProxy...
D PR
D extproc('+
D Inventory+
D _setProxy+
D ')
D i_server 256A const
D i_port 10I 0 const
*
* Web service: Returns the endpoint of the Web service
D Inventory_getEndpoint...
D PR 32767A varying
D extproc('+
D Inventory+
D _getEndpoint+
D ')
*
* Web service: Sets the endpoint of the Web service
D Inventory_setEndpoint...
D PR
D extproc('+
D Inventory+
D _setEndpoint+
D ')
D i_url 32767A const varying options(*varsize)
*
* Web service: Returns the host name of the Web Service endpoint
D Inventory_getHost...
D PR 32767A varying
D extproc('+
D Inventory+
D _getHost+
D ')
*
* Web service: Sets the host name of the Web service endpoint
D Inventory_setHost...
D PR
D extproc('+
D Inventory+
D _setHost+
D ')
D i_url 32767A const varying options(*varsize)
*
* Web service: Returns the port of the Web Service endpoint
D Inventory_getPort...
D PR 10I 0
D extproc('+
D Inventory+
D _getPort+
D ')
*
* Web service: Sets the port of the Web service endpoint
D Inventory_setPort...
D PR
D extproc('+
D Inventory+
D _setPort+
D ')
D i_port 10I 0 const
*
* Registers an user callback procedure, that is called whenever
* a web service requires user authentification.
D Inventory_registerLoginCallback...
D PR
D extproc('+
D Inventory+
D _registerLoginCallback+
D ')
D i_pLoginProc * value procptr
*
* Http: Returns cTrue in case of an error, else cFalse.
D Inventory_isError...
D PR N
D extproc('+
D Inventory+
D _isError+
D ')
*
* Http: Returns the last HTTP error (code) that occurred.
D Inventory_HttpError_getCode...
D PR like(wsdl_http_ErrorNo_t )
D extproc('+
D Inventory+
D _HttpError_getCode+
D ')
*
* Http: Returns the last HTTP error (text) that occurred.
D Inventory_HttpError_getText...
D PR like(wsdl_http_ErrorText_t)
D extproc('+
D Inventory+
D _HttpError_getText+
D ')
*
* Soap: Returns the last SOAP error (code) that occurred.
D Inventory_SoapError_getCode...
D PR like(wsdl_soap_faultcode_t )
D extproc('+
D Inventory+
D _SoapError_getCode+
D ')
*
* Soap: Returns the last SOAP error (text) that occurred.
D Inventory_SoapError_getText...
D PR like(wsdl_soap_faultstring_t)
D extproc('+
D Inventory+
D _SoapError_getText+
D ')
*
* Soap: Returns the last XML error (code) that occurred.
D Inventory_XmlError_getCode...
D PR like(wsdl_xml_errorNo_t )
D extproc('+
D Inventory+
D _XmlError_getCode+
D ')
*
* Soap: Returns the last XML error (text) that occurred.
D Inventory_XmlError_getText...
D PR like(wsdl_xml_ErrorText_t )
D extproc('+
D Inventory+
D _XmlError_getText+
D ')
*
* Returns the file name of the attachment that is associated to
* a given content ID.
D Inventory_Attachments_get...
D PR like(wsdl_path_t )
D extproc('+
D Inventory+
D _Attachments_get+
D ')
D i_attachmentID...
D const like(wsdl_attachmentID_t )
*
* Returns the file name of the attachment that is associated to
* a given index.
D Inventory_Attachments_getAtPos...
D PR likeds(wsdl_attachment_t )
D extproc('+
D Inventory+
D _Attachments_getAtPos+
D ')
D i_index 10I 0 const
*
* Returns the number of attachments that were downloaded with the
* last call to the web service.
D Inventory_Attachments_getNumE...
D PR 10I 0
D extproc('+
D Inventory+
D _Attachments_getNumE+
D ')
*
* Removes all attachments from the list of attachments of this web service.
D Inventory_Attachments_removeAll...
D PR
D extproc('+
D Inventory+
D _Attachments_removeAll+
D ')
*
* Enables/disables a workaround for Web services that are driven
* by Axis and that are affected by the AXIS-2095 bug.
D Inventory_enableAxis2095...
D PR
D extproc('+
D Inventory+
D _enableAxis2095+
D ')
D i_isEnabled N const
*
* User callback to supply login information
* Returns WSDL_SUCCESS if successful, WSDL_ERROR upon error.
*
* Parameter description:
* i_authType Authentication type:
* WSDL_AUTH_TYPE_HTTP - HTTP server.
* WSDL_AUTH_TYPE_PROXY - Proxy server.
* i_realm Authentication realm.
* i_numAttempts Number of login attempts.
* o_user UserName to use.
* o_password Password to use.
*
D Inventory_supplyLoginData...
D PR 10I 0
D extproc('+
D Inventory+
D _supplyLoginData+
D ')
D i_authType 14A const varying
D i_realm 126A const varying
D i_numAttempts 10I 0 const
D o_user 50A varying
D o_password 50A varying
*
* Specifies the name of the folder where to put attachments in.
D Inventory_setAttachmentFolder...
D PR
D extproc('+
D Inventory+
D _setAttachmentFolder+
D ')
D i_folder 1024A const varying options(*varsize)
*
CPY /COPY QWSDL2RPG,TYPES_H
*
/IF DEFINED(PROTOTYPE_TSTINVEN01)
/EOF
/ENDIF
* ---------------------------------------------------------------------
*
CPY /COPY QBASICS1,PBASICS1 Tools/400 Runtime Library
CPY /COPY QMIME,PMIME Tools/400 MIME Parser
CPY /COPY QMIME,HTTPMIME_H Tools/400 MIME Parser to HTTP API adapter
CPY /COPY QRPGLESRC,HTTPAPI_H HTTP-API Service Program
CPY /COPY QWSDL2RPG,PWSDL2R70 WSDL2RPG: HTTP API Header Extensions
CPY /COPY QWSDL2RPG,PWSDL2R71 WSDL2RPG: HTTP Debug Log
CPY /COPY QWSDL2RPG,PWSDL2R86 WSDL2RPG: Stream
CPY /COPY QWSDL2RPG,PWSDL2R87 WSDL2RPG: ManagedMemoryDataSource
CPY /COPY QWSDL2RPG,PWSDL2R89 WSDL2RPG: List of attachments
CPY /COPY QWSDL2RPG,PWSDL2R90 WSDL2RPG: AppMsg
CPY /COPY QWSDL2RPG,PWSDL2R94 WSDL2RPG: MultiRef
CPY /COPY QWSDL2RPG,PWSDL2R97 WSDL2RPG: eXpat Adapter
CPY /COPY QWSDL2RPG,PWSDL2R98 WSDL2RPG: UnMarshaller/Marshaller
CPY /COPY QWSDL2RPG,PWSDL2R42 WSDL2RPG: User name and password
*
/IF DEFINED(LOGGING_SERVICE)
CPY /COPY QWSDL2RPG,PLOG4RPG Log4rpg: The Log4rpg service program
CPY /COPY QWSDL2RPG,PLOG4RPG00 Log4rpg: The Log4rpg stub module
/ENDIF
*
* ------------------------------------
* Internal prototypes
* ------------------------------------
*
* Reopens a given input stream in order to send it over
* the wire again.
D reOpenInputStream...
D PR like(wsdl_hStream_t )
D extproc('+
D reOpenInputStream+
D ')
D i_hDataSource const like(wsdl_hDataSource_t)
D i_hInpStream value like(wsdl_hStream_t )
*
* Login in to proxy server or http server.
D login...
D PR 10I 0
D extproc('+
D login+
D ')
D i_http_err 10I 0 value
D i_numAttempts 10I 0 value
*
* Sets the content type and the SOAP action of the POST message.
D HTTP_setContentTypeAndSOAPAction...
D PR
D extproc('+
D HTTP_setContentTypeAndSOAPAction+
D ')
D o_addlHdrs 1024A varying
D i_pUserData * value
*
D impl_getProfilesRpcStart...
D PR
D extproc('impl_getProfilesRpcStart')
D userdata * value
D depth 10I 0 value
D namespace 1024A varying const
D name 1024A varying const
D path 24576A varying const
D attrs * dim(32767)
D const options(*varsize)
D impl_getProfilesRpcEnd...
D PR
D extproc('impl_getProfilesRpcEnd')
D userdata * value
D depth 10I 0 value
D namespace 1024A varying const
D name 1024A varying const
D path 24576A varying const
D value 65535A varying
D attrs * dim(32767)
D const options(*varsize)
D impl_item_of_anyTypeStart_of_impl_getProfilesRpc...
D PR
D extproc('impl_item_of_anyTypeStart_o+
D f_impl_getProfilesRpc')
D userdata * value
D depth 10I 0 value
D namespace 1024A varying const
D name 1024A varying const
D path 24576A varying const
D attrs * dim(32767)
D const options(*varsize)
D impl_item_of_anyTypeEnd_of_impl_getProfilesRpc...
D PR
D extproc('impl_item_of_anyTypeEnd_of_+
D impl_getProfilesRpc')
D userdata * value
D depth 10I 0 value
D namespace 1024A varying const
D name 1024A varying const
D path 24576A varying const
D value 65535A varying
D attrs * dim(32767)
D const options(*varsize)
*
* Receice response of HTTP post operation.
D HTTP_receiveResponse...
D PR 10I 0 extproc('+
D HTTP_receiveResponse+
D ')
D i_hStream 10I 0 value
D i_data * value
D i_length 10I 0 value
*
* SOAP message: Envelope
D SOAPMessage_Envelope...
D PR extproc('+
D SOAPMessage_Envelope+
D ')
D userdata * value
D depth 10I 0 value
D namespace 1024A varying const
D name 1024A varying const
D path 24576A varying const
D attrs * dim(32767)
D const options(*varsize)
*
* SOAP message: fault information
D SOAPMessage_FaultStart...
D PR extproc('+
D SOAPMessage_FaultStart+
D ')
D userdata * value
D depth 10I 0 value
D namespace 1024A varying const
D name 1024A varying const
D path 24576A varying const
D attrs * dim(32767)
D const options(*varsize)
*
* SOAP message: fault information
D SOAPMessage_FaultEnd...
D PR extproc('+
D SOAPMessage_FaultEnd+
D ')
D userdata * value
D depth 10I 0 value
D namespace 1024A varying const
D name 1024A varying const
D path 24576A varying const
D value 65535A varying const
D attrs * dim(32767)
D const options(*varsize)
*
* SOAP message: fault details
D SOAPMessage_FaultDetailStart...
D PR extproc('+
D SOAPMessage_FaultDetailStart+
D ')
D userdata * value
D depth 10I 0 value
D namespace 1024A varying const
D name 1024A varying const
D path 24576A varying const
D attrs * dim(32767)
D const options(*varsize)
*
* SOAP message: fault details
D SOAPMessage_FaultDetailEnd...
D PR extproc('+
D SOAPMessage_FaultDetailEnd+
D ')
D userdata * value
D depth 10I 0 value
D namespace 1024A varying const
D name 1024A varying const
D path 24576A varying const
D value 65535A varying const
D attrs * dim(32767)
D const options(*varsize)
*
* SOAP message: NULL callback procedure
D SOAPMessage_unexpectedElementStart...
D PR
D extproc('+
D SOAPMessage_unexpectedElementStart+
D ')
D userdata * value
D depth 10I 0 value
D namespace 1024A varying const
D name 1024A varying const
D path 24576A varying const
D attrs * dim(32767)
D const options(*varsize)
*
* SOAP message: NULL callback procedure
D SOAPMessage_unexpectedElementEnd...
D PR
D extproc('+
D SOAPMessage_unexpectedElementEnd+
D ')
D userdata * value
D depth 10I 0 value
D namespace 1024A varying const
D name 1024A varying const
D path 24576A varying const
D value 65535A varying const
D attrs * dim(32767)
D const options(*varsize)
*
D ignoreUnexpectedSoapHeader...
D PR N
D extproc('+
D ignoreUnexpectedSoapHeader+
D ')
* DataEast customizations
mk * Set the URL based on data in the EPequipmnt 'DSLAM' record
mk D BuildURLfromEPequipmnt...
mk D PR 32767a varying
mk D extproc('DSLAM_URL')
mk D WebServiceName 256a varying
mk D const
mk D LoginNeeded n const
* ------------------------------------
* Global fields & constants
* ------------------------------------
*
* Web service port name
D cWEB_SERVICE_PORT...
D C 'Inventory'
*
* UUID of the web service as generated by WSDL2RPG
D cSERVICE_UUID C '30A56001C640194DA35A0004AC101091'
*
* SOAP response header
*
* Reference to the 'respSoapHeader' field.
D g_pRespSoapHeader...
D S * inz
*
* XMLSAXParser handle
D g_hSAXParser S like(xmlSaxParser_handle_t) inz
*
* MIME parser
D g_hMIMEParser S like(mime_hMime_t ) inz
*
* MIME message indicator
D g_isMimeMessage...
D S N inz(cFalse)
*
* Content ID of the SOAP message part
D g_SOAPMessageID...
D S 512A varying inz
*
* Indicator "parse SOAP message"
D g_doParseSOAPMessage...
D S N inz(cFalse)
*
* Indicator "SOAP message parsed"
D g_SOAPMessage_done...
D S N inz(cFalse)
*
* Body part counter
D g_BodyPart_counter...
D S 10I 0 inz
*
* Default and current attachment folder
D cATTACHMENT_FOLDER...
D C '/tmp/attachments/'
*
D g_attachmentFolder...
D S 1024A varying inz(cATTACHMENT_FOLDER)
*
* HTTP response "initialized" indicator
D g_HTTP_isInit...
D S N inz(cFalse)
*
* POST data CCSID (1208 = UTF-8)
D g_post_ccsid...
D S 10I 0 inz(1208)
*
* HTTP debug log settings
D g_httpDebug DS qualified
D status N inz
D fileName 500A inz varying
*
* Proxy server to use
D g_proxy DS qualified
D server 256A inz
D port 10I 0 inz
*
* Switch for AXIS bug AXIS-2095
D g_isAXIS_2095 S N inz(cFalse)
*
* Error information
D g_errors DS likeds(wsdl_errors_t ) inz
*
* User callback to supply login information
* Returns WSDL_SUCCESS if successful, WSDL_ERROR upon error.
D g_getLoginDataImpl...
D S * procptr inz
*
D getLoginDataImpl...
D PR 10I 0
D extproc(g_getLoginDataImpl)
D i_authType 14A const varying
D i_realm 126A const varying
D i_numAttempts 10I 0 const
D o_user 50A varying
D o_password 50A varying
*
* Web service endpoint as specified in the WSDL file.
D cURL C 'http://192.168.41.252:9090/axis/ser+
D vices/Inventory'
*
* Web service endpoint
D g_url S 32767A varying inz(cURL)
*
* -------------------------------------------
* TODO: Added to implement default
* attachment handling.
* -------------------------------------------
/IF DEFINED(DEFAULT_ATTACHMENT_HANDLING)
CPY /COPY QWSDL2RPG,CLIB C Runtime Library
*
* User data scoped to the current part
D partUserData_t...
D DS qualified based(pDummy)
D FD 10i 0
*
/ENDIF
* =====================================================================
* Operation: impl:getProfiles
* Returns : impl_getProfilesRpc
* =====================================================================
P Inventory_getProfiles...
P B export
D Inventory_getProfiles...
D PI likeds(impl_getProfilesRpc_t)
D i_in0 likeds(apachesoap_Map_t)
D o_msg 128A varying
*
* Return value
D rtnValue DS likeds(impl_getProfilesRpc_t)
D inz
*
* Local fields
D isUnexpectedError...
D S N inz(cFalse)
D isRedirect S N inz(cFalse)
D request S 65535A varying inz
D url S like(g_url) inz
D rc S 10I 0 inz
D rcvm0200 DS likeds(rcvm0200_t ) inz
D msg DS likeds(msg_t ) inz
D headers DS likeds(headers_t ) inz
*
D hDataSource S like(wsdl_hDataSource_t ) inz
D hOutStream S like(wsdl_hStream_t ) inz
D hSAXParser S like(xmlSaxParser_handle_t) inz
D hMIMEParser S like(mime_hMime_t ) inz
D hInpStream S like(wsdl_hStream_t ) inz
D contentType S like(wsdl_contentType_t ) inz
*
* Login helper fields
D err S 10I 0 inz
D lastErr S 10I 0 inz(-1)
D numAttempts S 10I 0 inz
*
* Array iterator fields
D X_A1 S 10I 0 inz
D X_A2 S 10I 0 inz
*
D curItem_of_anyType_A1...
D S like(impl_item_of_anyType_t)
D inz
*
D curMapItem_A2 DS likeds(apachesoap_mapItem_t)
D inz
*
D userData DS likeds(impl_getProfilesRpc_t)
D inz
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
// Set url to include login credentials
mk g_url = BuildURLfromEPequipmnt('Inventory' : cTrue);
mk if g_url = 'ERROR';
mk // unable to build the URL from the EPequipmnt record.
mk // Use the default value in the cURL constant;
mk g_url = cURL;
mk endif;
// ---- End DataEast custom code...
o_msg = '';
monitor;
// Initialize map to manage <multiRef> elements
MultiRef_new();
// Remove all attachments of this service from the list of attachments
Attachments_removeAll(Attachments_theInstance(): cSERVICE_UUID);
// Enable/disable HTTP debug log
B01 if (g_httpDebug.status = *ON);
B02 if (g_httpDebug.fileName <> '');
http_debug(*ON: g_httpDebug.fileName);
X02 else;
http_debug(*ON);
E02 endif;
X01 else;
http_debug(*OFF);
E01 endif;
// Set proxy server to use
B01 if (g_proxy.server <> '');
http_setproxy(g_proxy.server: g_proxy.port);
X01 else;
http_setproxy('': 0);
E01 endif;
// Set CCSID for POST data according
// to the encoding of the SOAP envelope
HTTP_SetCCSIDs(g_post_ccsid: HTTP_EBCDIC);
// Create and open data source to store the request message
hDataSource = ManagedMemoryDataSource_new();
contentType = 'text/xml';
hOutStream = ManagedMemoryDataSource_OutputStream_open(
hDataSource: contentType: g_post_ccsid);
// Produce SOAP request message
request =
'<?xml version="1.0" encoding="UTF-8"?>' +
'<soapenv:Envelope' +
' xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"' +
' xmlns:apachesoap="http://xml.apache.org/xml-soap"' +
' xmlns:impl="urn:Inventory"' +
' xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"' +
' xmlns:xsd="http://www.w3.org/2001/XMLSchema"' +
' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
'>' +
'<soapenv:Body>' +
'';
if (%len(request) > 0);
// Add previous bytes of request message to output stream
ManagedMemoryDataSource_OutputStream_write(hOutStream: %addr(requ...
est: *DATA): %len(request));
clear request;
endif;
request = request +
'<impl:getProfiles' +
' soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/e+
ncoding/"' +
'>' +
'<in0' +
' xsi:type="apachesoap:Map"' +
'>' +
'';
if (%len(request) > 0);
// Add previous bytes of request message to output stream
ManagedMemoryDataSource_OutputStream_write(hOutStream: %addr(requ...
est: *DATA): %len(request));
clear request;
endif;
for X_A2 = 1 to i_in0.item.x;
curMapItem_A2 = i_in0.item.mapItem(X_A2);
request = request +
'<item' +
' xsi:type="apachesoap:mapItem"' +
'>' +
'<key>' +
'';
if (%len(request) > 0);
// Add previous bytes of request message to output stream
ManagedMemoryDataSource_OutputStream_write(hOutStream: %addr(
request: *DATA): %len(request));
clear request;
endif;
Marshaller_toAnyTypeV6(
%addr(curMapItem_A2.key)
: %addr(curMapItem_A2.key: *DATA)
: %len(curMapItem_A2.key)
: hOutStream);
request = request +
'</key>' +
'<value>' +
'';
if (%len(request) > 0);
// Add previous bytes of request message to output stream
ManagedMemoryDataSource_OutputStream_write(hOutStream: %addr(
request: *DATA): %len(request));
clear request;
endif;
Marshaller_toAnyTypeV6(
%addr(curMapItem_A2.value)
: %addr(curMapItem_A2.value: *DATA)
: %len(curMapItem_A2.value)
: hOutStream);
request = request +
'</value>' +
'</item>' +
'';
if (%len(request) > 0);
// Add previous bytes of request message to output stream
ManagedMemoryDataSource_OutputStream_write(hOutStream: %addr(
request: *DATA): %len(request));
clear request;
endif;
endfor;
request = request +
'</in0>' +
'</impl:getProfiles>' +
'</soapenv:Body>' +
'</soapenv:Envelope>';
// Add remaining bytes of request message to output stream
B01 if (%len(request) > 0);
ManagedMemoryDataSource_OutputStream_write(
hOutStream: %addr(request) + 2: %len(request));
E01 endif;
// Close output stream and finish the request message
ManagedMemoryDataSource_OutputStream_close(hOutStream);
// Open input stream
hInpStream = ManagedMemoryDataSource_InputStream_open(hDataSource);
// Clear error code
clear g_errors;
g_errors.errType = WSDL_HTTP_SUCCESS;
// HTTPAPI: Enables additional headers
http_xproc(HTTP_POINT_ADDL_HEADER
: %paddr('HTTP_setContentTypeAndSOAPAction')
: %addr(headers));
headers.contentType =
ManagedMemoryDataSource_getContentType(hDataSource);
headers.soapAction = '';
// ---------------------------------------
// Post request and parse response
// ---------------------------------------
// Create parser (callbacks style: HTTP API)
XMLSAXParser_new(hSAXParser: cTrue);
XMLSAXParser_setDoNamespaces(hSAXParser: cTrue);
XMLSAXParser_registerCallback(hSAXParser
: cXML_CB_SAX_STARTELEMENT
: %paddr('SOAPMessage_Envelope'));
XMLSAXParser_prepareParse(hSAXParser: %addr(userData));
// Create MIME parser in case we need it
hMIMEParser = MIMEParser_new();
MIMEParser_setDecodeData(hMIMEParser: cTrue);
http_mime_DataSink_initialize(hMIMEParser
: *NULL
: %paddr('HTTPDataSink_startPart')
: %paddr('HTTPDataSink_bodyData')
: %paddr('HTTPDataSink_endPart'));
// Make parser available for HTTP_receiveResponse()
g_hSAXParser = hSAXParser;
g_hMIMEParser = hMIMEParser;
g_isMimeMessage = cFalse;
g_HTTP_isInit = cFalse;
g_SOAPMessageID = '';
g_doParseSOAPMessage = cFalse;
g_SOAPMessage_done = cFalse;
g_BodyPart_counter = 0;
// Make SOAP response header available to SOAPMessage_Envelope
g_pRespSoapHeader = *NULL;
// eXpat: Post request and parse response
url = Inventory_getEndpoint();
B01 dou (err <> HTTP_NDAUTH and err <> HTTP_PXNDAUTH);
// Get document from server and handle http redirects
// 301 Moved Permanently
// 302 Found
// 303 See Other
// 307 Temporary Redirect
B02 dou (not isRedirect);
rc = http_url_post_raw2(
url
: hInpStream
: %paddr(
'WSDL2R87_ManagedMemoryDataSource_InputStream_read')
: ManagedMemoryDataSource_getSize(hDataSource)
: 0
: %paddr('HTTP_receiveResponse')
: HTTP_TIMEOUT
: HTTP_USERAGENT
: '');
B03 if (rc = 301 or rc = 302 or rc = 303 or rc = 307);
url = http_redir_loc();
// Reopen data stream
hInpStream = reOpenInputStream(hDataSource: hInpStream);
isRedirect = cTrue;
X03 else;
isRedirect = cFalse;
E03 endif;
E02 enddo;
// The first time we request a document that requires user/password
// it will return a HTTP_NDAUTH error.
B02 if (rc <> 1);
http_error(err);
B03 if (err = HTTP_NDAUTH or err = HTTP_PXNDAUTH);
B04 if (g_getLoginDataImpl = *NULL);
leave;
E04 endif;
B04 if (err <> lastErr);
lastErr = err;
numAttempts = 0;
E04 endif;
numAttempts = numAttempts + 1;
B04 if (login(err: numAttempts) <> 1);
leave;
E04 endif;
// Reopen data stream
hInpStream = reOpenInputStream(hDataSource: hInpStream);
E03 endif;
X02 else;
MultiRef_finalize();
err = 0;
E02 endif;
E01 enddo;
// Preserve parser error code and message text
B01 if (err = HTTP_RDWERR);
g_errors.xmlError.code = XMLToolkit_getError(
hSAXParser
: g_errors.xmlError.text
: g_errors.xmlError.line
: g_errors.xmlError.column);
E01 endif;
XMLSAXParser_endParse(hSAXParser);
B01 if (g_isMimeMessage);
MIMEParser_endParse(hMIMEParser);
g_isMimeMessage = cFalse;
E01 endif;
g_HTTP_isInit = cFalse;
on-error;
isUnexpectedError = cTrue;
rcvm0200 = f_rcvPgmMsg(cMsg_Any: *: cMsg_Act_Same: 0
: cMsg_Same: cMsg_ToMyself);
http_DebugLog_appendRcvMsg(rcvm0200);
msg = f_cvtRcvMsgToMsg(rcvm0200);
g_errors.errType = WSDL_HTTP_ERROR_UNEXPECTED;
g_errors.httpError.no = WSDL_HTTP_ERROR_UNEXPECTED;
g_errors.httpError.text = f_rtvMsgText(msg);
rc = g_errors.httpError.no;
o_msg = g_errors.httpError.text;
endmon;
g_hSAXParser = *NULL;
g_hMIMEParser = *NULL;
B01 if (not isUnexpectedError);
B02 if (err <> 0);
g_errors.errType = WSDL_HTTP_ERROR;
// Set http error code and message text
g_errors.httpError.no = err;
g_errors.httpError.text = http_error();
// Return error message text to caller
B03 if (g_errors.httpError.text <> '');
o_msg = g_errors.httpError.text;
X03 else;
o_msg = Inventory_SoapError_getText();
E03 endif;
clear rtnValue;
else;
o_msg = '';
rtnValue = userData;
endif;
E02 endif;
B02 if (not XMLSAXParser_isNull(hSAXParser));
XMLSAXParser_delete(hSAXParser);
E02 endif;
B02 if (not MIMEParser_isNull(hMIMEParser));
MIMEParser_delete(hMIMEParser);
E02 endif;
B02 if (not ManagedMemoryDataSource_isNull(hDataSource));
B03 if (ManagedMemoryDataSource_Stream_isOpen(hInpStream));
ManagedMemoryDataSource_InputStream_close(hInpStream);
E03 endif;
B03 if (ManagedMemoryDataSource_Stream_isOpen(hOutStream));
ManagedMemoryDataSource_OutputStream_close(hOutStream);
E03 endif;
ManagedMemoryDataSource_delete(hDataSource);
E02 endif;
B02 if (not MultiRef_isNull());
MultiRef_delete();
E02 endif;
B02 if (http_DebugLog_isOpen());
http_DebugLog_close();
E02 endif;
return rtnValue;
/end-free
*
P Inventory_getProfiles...
P E
*
*
* ==================================================================
* Return value: impl:getProfilesRpc
* ==================================================================
P impl_getProfilesRpcStart...
P B
D impl_getProfilesRpcStart...
D PI
D userdata * value
D depth 10I 0 value
D namespace 1024A varying const
D name 1024A varying const
D path 24576A varying const
D attrs * dim(32767)
D const options(*varsize)
*
D currentItem DS likeds(impl_getProfilesRpc_t)
D based(pCurrentItem)
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
// Get access to current item
pCurrentItem = userdata;
select;
when (depth = 1
and
name = 'getProfilesRpc');
if (MultiRef_isReference(attrs));
MultiRef_put(
attrs
: XMLSAXParser_getUserData()
: depth
: namespace
: name
: path
: XMLSAXParser_getStartCallback()
: XMLSAXParser_getEndCallback()
: *omit
: %addr(currentItem)
: %size(currentItem)
);
endif;
return;
when (depth = 2
and
name = 'getProfilesReturn'
and
namespace = '');
XMLSAXParser_delegateElementProcessing(
%addr(currentItem.getProfilesReturn)
: %paddr('impl_item_of_anyTypeStart_of_impl_getProfilesRpc')
: %paddr('impl_item_of_anyTypeEnd_of_impl_getProfilesRpc')
);
return;
endsl;
return;
/end-free
*
P impl_getProfilesRpcStart...
P E
*
* ==================================================================
* Return value: impl:getProfilesRpc
* ==================================================================
P impl_getProfilesRpcEnd...
P B
D impl_getProfilesRpcEnd...
D PI
D userdata * value
D depth 10I 0 value
D namespace 1024A varying const
D name 1024A varying const
D path 24576A varying const
D value 65535A varying
D attrs * dim(32767)
D const options(*varsize)
*
D currentItem DS likeds(impl_getProfilesRpc_t)
D based(pCurrentItem)
*
D itemValue DS likeds(wsdl_fullElementData_t)
D inz
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
// Get access to current item
pCurrentItem = userdata;
// Get full element data
itemValue = XMLSAXParser_getFullElementData();
select;
endsl;
return;
/end-free
*
P impl_getProfilesRpcEnd...
P E
*
* ==================================================================
* Return value: impl:getProfilesReturn
* ==================================================================
P impl_item_of_anyTypeStart_of_impl_getProfilesRpc...
P B
D impl_item_of_anyTypeStart_of_impl_getProfilesRpc...
D PI
D userdata * value
D depth 10I 0 value
D namespace 1024A varying const
D name 1024A varying const
D path 24576A varying const
D attrs * dim(32767)
D const options(*varsize)
*
D x S 10I 0 inz
*
D impl_getProfilesReturn...
D DS likeds(impl_RpgArrayOfArrayOf_xsd_...
D anyType_t)
D based(userdata)
*
D currentItem S like(impl_item_of_anyType_t)
D based(pCurrentItem)
*
D emptyItem S like(impl_item_of_anyType_t)
D inz
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
// Return to caller if array is SOAP encoded.
// Depth=1 indicates that we are at the top
// of the array but not on item level.
if (depth = 1);
if (MultiRef_isReference(attrs));
MultiRef_put(
attrs
: XMLSAXParser_getUserData()
: depth
: namespace
: name
: path
: XMLSAXParser_getStartCallback()
: XMLSAXParser_getEndCallback()
: *omit
: %addr(impl_getProfilesReturn)
: %size(impl_getProfilesReturn)
);
endif;
return;
endif;
// Get access to current array item
if (MultiRef_doCaptureData() and MultiRef_hasItemIndex());
x = MultiRef_getItemIndex();
else;
if (depth = 2);
impl_getProfilesReturn.x = impl_getProfilesReturn.x + 1;
endif;
x = impl_getProfilesReturn.x;
endif;
pCurrentItem = %addr(impl_getProfilesReturn.item(x));
select;
when (depth = 2);
if (MultiRef_isReference(attrs));
MultiRef_put(
attrs
: XMLSAXParser_getUserData()
: depth
: namespace
: name
: path
: XMLSAXParser_getStartCallback()
: XMLSAXParser_getEndCallback()
: x
: %addr(currentItem)
: %size(currentItem)
);
endif;
return;
endsl;
return;
/end-free
*
P impl_item_of_anyTypeStart_of_impl_getProfilesRpc...
P E
*
* ==================================================================
* Return value: impl:getProfilesReturn
* ==================================================================
P impl_item_of_anyTypeEnd_of_impl_getProfilesRpc...
P B
D impl_item_of_anyTypeEnd_of_impl_getProfilesRpc...
D PI
D userdata * value
D depth 10I 0 value
D namespace 1024A varying const
D name 1024A varying const
D path 24576A varying const
D value 65535A varying
D attrs * dim(32767)
D const options(*varsize)
*
D x S 10I 0 inz
*
D impl_getProfilesReturn...
D DS likeds(impl_RpgArrayOfArrayOf_xsd_...
D anyType_t)
D based(userdata)
*
D currentItem S like(impl_item_of_anyType_t)
D based(pCurrentItem)
*
D itemValue DS likeds(wsdl_fullElementData_t)
D inz
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
// Return to caller if array is SOAP encoded.
// Depth=1 indicates that we are at the top
// of the array but not on item level.
if (depth = 1);
return;
endif;
// Get access to current array item
if (MultiRef_doCaptureData() and MultiRef_hasItemIndex());
x = MultiRef_getItemIndex();
else;
x = impl_getProfilesReturn.x;
endif;
pCurrentItem = %addr(impl_getProfilesReturn.item(x));
// Get full element data
itemValue = XMLSAXParser_getFullElementData();
select;
when (depth = 2);
if (not Value_isNil(attrs));
UnMarshaller_toStringV6(
%addr(currentItem)
: %addr(currentItem: *DATA)
: %size(currentItem)
: itemValue.pData
: itemValue.size);
endif;
endsl;
return;
/end-free
*
P impl_item_of_anyTypeEnd_of_impl_getProfilesRpc...
P E
*
* =====================================================================
* Reopens a given input stream in order to send it over
* the wire again.
* =====================================================================
P reOpenInputStream...
ERR P B
*
D reOpenInputStream...
D PI like(wsdl_hStream_t )
D i_hDataSource const like(wsdl_hDataSource_t)
D i_hInpStream value like(wsdl_hStream_t )
*
* Return value
D hInpStream S like(wsdl_hStream_t ) inz
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
ManagedMemoryDataSource_InputStream_close(i_hInpStream);
hInpStream =
ManagedMemoryDataSource_InputStream_open(i_hDataSource);
return hInpStream;
/end-free
*
P reOpenInputStream...
P E
*
* =====================================================================
* Login in to proxy server or http server.
* =====================================================================
P login...
P B
*
D login...
D PI 10I 0
D i_http_err 10I 0 value
D i_numAttempts 10I 0 value
*
* Return value
D rc S 10I 0 inz
*
* Helper fields
D basic S N inz
D digest S N inz
D realm S 124A inz
D authType S 14A inz varying
D userid S 50A inz varying
D password S 50A inz varying
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
if (i_http_err = HTTP_NDAUTH);
http_getauth(basic: digest: realm);
authType = WSDL_AUTH_TYPE_HTTP;
else;
http_proxy_getauth(basic: realm);
authType = WSDL_AUTH_TYPE_PROXY;
endif;
rc = getLoginDataImpl(authType: realm
: i_numAttempts: userid: password);
if (rc <> 1);
userid = '';
password = '';
return rc;
endif;
if (i_http_err = HTTP_NDAUTH);
if (digest);
http_setAuth(HTTP_AUTH_MD5_DIGEST
: userid: password);
else;
http_setAuth(HTTP_AUTH_BASIC
: userid: password);
endif;
else;
if (digest);
http_proxy_setAuth(HTTP_AUTH_MD5_DIGEST
: userid: password);
else;
http_proxy_setAuth(HTTP_AUTH_BASIC
: userid: password);
endif;
endif;
userid = '';
password = '';
return rc;
/end-free
*
P login...
P E
*
* =====================================================================
* Sets the content type and the SOAP action of the POST message.
* =====================================================================
P HTTP_setContentTypeAndSOAPAction...
P B
*
D HTTP_setContentTypeAndSOAPAction...
D PI
D o_addlHdrs 1024A varying
D i_pUserData * value
*
* User Data
D headers DS likeds(headers_t) based(i_pUserData)
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
o_addlHdrs = cHTTP_HEADER_CONTENT_TYPE + ': ' +
headers.contentType + cEBCDIC_CRLF +
cHTTP_HEADER_SOAP_ACTION + ': ' +
headers.soapAction + cEBCDIC_CRLF;
/end-free
*
P HTTP_setContentTypeAndSOAPAction...
P E
*
* =====================================================================
* Receice response of HTTP post operation.
* =====================================================================
P HTTP_receiveResponse...
P B
*
D HTTP_receiveResponse...
D PI 10I 0
D i_hStream 10I 0 value
D i_data * value
D i_length 10I 0 value
*
D contentType S 1024A inz
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
if (not g_HTTP_isInit);
select;
when (http_getContentType() = 'text');
if (http_getContentSubType() = 'html');
if (f_exist('WSDL2RPG': '*LIBL': '*MSGF'));
clear USR0030;
USR00301 = cWEB_SERVICE_PORT;
AppMsg_sendCancelMsg(AppMsg_newError('USR0030': USR0030));
else;
AppMsg_sendCancelMsg(
f_newMsg('CPF9898'
: 'Unexpected HTML data received from web service'
: '*ESCAPE'
: 'QCPFMSG'));
endif;
endif;
when (http_getContentType() = 'multipart');
contentType = %trim(http_header('content-type'));
MIMEParser_beginParse(g_hMIMEParser);
MIMEParser_setContentType(g_hMIMEParser: contentType);
g_SOAPMessageID = http_getContentTypeAttr('start': cTrue);
g_isMimeMessage = cTrue;
endsl;
g_HTTP_isInit = cTrue;
endif;
if (g_isMimeMessage);
if (MIMEParser_parse(g_hMIMEParser: i_data: i_length) = cTrue);
return i_length;
else;
return -1;
endif;
else;
if (XMLSAXParser_parse(g_hSAXParser: i_data: i_length) = cTrue);
return i_length;
else;
return -1;
// return i_length;
endif;
endif;
/end-free
*
P HTTP_receiveResponse...
P E
*
* =====================================================================
* Starts a MIME body part.
* This procedure is called whenever a new part is started.
* =====================================================================
* Parameters:
* i_pPart Handle of the current part.
* i_pUserData Pointer to user data as specified at
* http_mime_DataSink_initialize().
* =====================================================================
P HTTPDataSink_startPart...
P B
*
D HTTPDataSink_startPart...
D PI
D i_pPart * const
D i_pUserData * const
*
D contentID S 512A varying inz
D contentSubType S 16A varying inz
*
* -------------------------------------------
* TODO: Add fields to open
* the file and to store the
* file descriptor.
* -------------------------------------------
/IF DEFINED(DEFAULT_ATTACHMENT_HANDLING)
D contentType S 10I 0 inz
D fileName S 1024A varying inz
D fileExt S 10A varying inz
*
D partUserData DS likeds(partUserData_t )
D based(pPartUserData)
/ENDIF
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
if (http_mime_Part_getType(i_pPart) <> cMIME_BASICPART);
return;
endif;
g_BodyPart_counter = g_BodyPart_counter + 1;
contentID = http_mime_Part_getContentID(i_pPart);
contentSubType = http_mime_Part_getContentSubType(i_pPart);
if (not g_SOAPMessage_done);
if (g_SOAPMessageID <> '');
if (contentSubType = 'xml' and contentID = g_SOAPMessageID);
g_doParseSOAPMessage = cTrue;
return;
endif;
else;
if (g_BodyPart_counter = 1);
g_doParseSOAPMessage = cTrue;
return;
endif;
endif;
endif;
// -----------------------------------------
// TODO:
// Add your code to handle attachments here|
// E.g.: Open output file.
// -----------------------------------------
/IF DEFINED(DEFAULT_ATTACHMENT_HANDLING)
// Ignore all attachments that are not a BasicPart
if (http_mime_Part_getType(i_pPart) <> cMIME_BASICPART);
return;
endif;
fileName = http_mime_Part_getFileName(i_pPart);
contentID = http_mime_Part_getContentID(i_pPart);
contentType = http_mime_Part_getContentType(i_pPart);
contentSubType = http_mime_Part_getContentSubType(i_pPart);
if (contentType = cMIME_TYPE_TEXT);
fileExt = 'txt';
else;
fileExt = contentSubType;
endif;
fileName = g_attachmentFolder +
%char(%timestamp()) + '_' + contentID + '_' +
fileName + '.' + fileExt;
fileName = %xlate(':<>': '___': fileName);
// Assign filename to content-ID and put it into the list of attachments
Attachments_put(Attachments_theInstance()
: cSERVICE_UUID
: contentID
: fileName);
// Produce the user data of that Part to
// store the file descriptor of the open file.
pPartUserData = %alloc(%size(partUserData_t));
clear partUserData;
partUserData.FD = open(fileName
: O_CREAT + O_EXCL +
O_SHARE_RDONLY + O_WRONLY + O_CCSID
: S_IRWXU + S_IRWXG + S_IRWXO
: 819); // CCSID does not matter because
// we write binary data
// Set user data of the current Part.
http_mime_Part_setUserData(i_pPart: pPartUserData);
/ENDIF
return;
/end-free
*
P HTTPDataSink_startPart...
P E
*
* =====================================================================
* Receices MIME part body data.
* This procedure is called whenever new body data is available.
* =====================================================================
* Parameters:
* i_pPart Handle of the current part.
* i_pUserData Pointer to user data as specified at
* http_mime_DataSink_initialize().
* i_data Pointer to decoded body data.
* i_size Size of decoded body data.
* =====================================================================
P HTTPDataSink_bodyData...
P B
*
D HTTPDataSink_bodyData...
D PI
D i_pPart * const
D i_pUserData * const
D i_data * const
D i_size 10I 0 const
*
* -------------------------------------------
* TODO: Add fields to write
* the attachment to the file
* opened in HTTPDataSink_startPart().
* -------------------------------------------
/IF DEFINED(DEFAULT_ATTACHMENT_HANDLING)
D rc S 10I 0 inz
*
D partUserData DS likeds(partUserData_t )
D based(pPartUserData)
/ENDIF
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
if (g_doParseSOAPMessage);
XMLSAXParser_parse(g_hSAXParser: i_data: i_size);
return;
endif;
// -----------------------------------------
// TODO:
// Add your code to handle attachments here|
// E.g.: Write received data to output file.
// -----------------------------------------
/IF DEFINED(DEFAULT_ATTACHMENT_HANDLING)
// Gain access to the user data of the current Part.
pPartUserData = http_mime_Part_getUserData(i_pPart);
if (pPartUserData = *NULL);
return;
endif;
// Return to caller if no file is open.
if (partUserData.FD <= 0);
return;
endif;
// Append attachment data to the file.
rc = write(partUserData.FD: i_data: i_size);
/ENDIF
return;
/end-free
*
P HTTPDataSink_bodyData...
P E
*
* =====================================================================
* Ends a MIME body part.
* This procedure is called whenever a new part ends.
* =====================================================================
* Parameters:
* i_pPart Handle of the current part.
* i_pUserData Pointer to user data as specified at
* http_mime_DataSink_initialize().
* =====================================================================
P HTTPDataSink_endPart...
P B
*
D HTTPDataSink_endPart...
D PI
D i_pPart * const
D i_pUserData * const
*
* -------------------------------------------
* TODO: Add fields to close the file
* opened in HTTPDataSink_startPart().
* -------------------------------------------
/IF DEFINED(DEFAULT_ATTACHMENT_HANDLING)
D rc S 10I 0 inz
*
D partUserData DS likeds(partUserData_t )
D based(pPartUserData)
/ENDIF
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
if (http_mime_Part_getType(i_pPart) <> cMIME_BASICPART);
return;
endif;
if (g_doParseSOAPMessage);
g_doParseSOAPMessage = cFalse;
g_SOAPMessage_done = cTrue;
return;
endif;
// -----------------------------------------
// TODO:
// Add your code to handle attachments here|
// E.g.: Close output file.
// -----------------------------------------
/IF DEFINED(DEFAULT_ATTACHMENT_HANDLING)
// Gain access to the user data of the current Part.
pPartUserData = http_mime_Part_getUserData(i_pPart);
if (pPartUserData = *NULL);
return;
endif;
// Return to caller if no file is open.
if (partUserData.FD <= 0);
return;
endif;
// Close the file.
callp close(partUserData.FD);
partUserData.FD = 0;
// Free memory allocated in HTTPDataSink_startPart()
dealloc(N) pPartUserData;
/ENDIF
return;
/end-free
*
P HTTPDataSink_endPart...
P E
*
* =====================================================================
* SOAP message: Envelope
* =====================================================================
P SOAPMessage_Envelope...
P B
*
D SOAPMessage_Envelope...
D PI
D userdata * value
D depth 10I 0 value
D namespace 1024A varying const
D name 1024A varying const
D path 24576A varying const
D attrs * dim(32767)
D const options(*varsize)
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
if (depth = 1 and f_lcase(name) = 'html');
if (f_exist('WSDL2RPG': '*LIBL': '*MSGF'));
clear USR0030;
USR00301 = cWEB_SERVICE_PORT;
AppMsg_sendCancelMsg(AppMsg_newError('USR0030': USR0030));
else;
AppMsg_sendCancelMsg(
f_newMsg('CPF9898'
: 'Unexpected HTML data received from web service'
: '*ESCAPE'
: 'QCPFMSG'));
endif;
endif;
select;
when (path = '/Envelope/Header');
XMLSAXParser_delegateElementProcessing(
g_pRespSoapHeader
: %paddr('SOAPMessage_unexpectedElementStart')
: %paddr('SOAPMessage_unexpectedElementEnd'));
return;
when (path = '/Envelope/Body');
select;
when (name = 'Fault');
XMLSAXParser_delegateElementProcessing(
%addr(g_errors.soapFault)
: %paddr('SOAPMessage_FaultStart')
: %paddr('SOAPMessage_FaultEnd'));
return;
when (MultiRef_isData(attrs));
XMLSAXParser_delegateElementProcessing(
*NULL
: MultiRef_getStartCallback()
: MultiRef_getEndCallback());
return;
other;
XMLSAXParser_delegateElementProcessing(
userdata
: %paddr('impl_getProfilesRpcStart')
: %paddr('impl_getProfilesRpcEnd'));
return;
endsl;
endsl;
return;
/end-free
*
P SOAPMessage_Envelope...
P E
*
* =====================================================================
* SOAP message: fault information
* =====================================================================
P SOAPMessage_FaultStart...
P B
*
D SOAPMessage_FaultStart...
D PI
D userdata * value
D depth 10I 0 value
D namespace 1024A varying const
D name 1024A varying const
D path 24576A varying const
D attrs * dim(32767)
D const options(*varsize)
*
D fault...
D DS based(userdata)
D likeds(wsdl_soapFault_t )
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
if (depth = 1);
return;
endif;
select;
when (name = 'detail');
XMLSAXParser_delegateElementProcessing(
%addr(fault.detail)
: %paddr('SOAPMessage_FaultDetailStart')
: %paddr('SOAPMessage_FaultDetailEnd'));
endsl;
/end-free
*
P SOAPMessage_FaultStart...
P E
*
* =====================================================================
* SOAP message: fault information
* =====================================================================
P SOAPMessage_FaultEnd...
P B
*
D SOAPMessage_FaultEnd...
D PI
D userdata * value
D depth 10I 0 value
D namespace 1024A varying const
D name 1024A varying const
D path 24576A varying const
D value 65535A varying const
D attrs * dim(32767)
D const options(*varsize)
*
D fault...
D DS based(userdata)
D likeds(wsdl_soapFault_t )
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
if (depth = 1);
return;
endif;
select;
when (name = 'faultcode');
fault.code = value;
when (name = 'faultstring');
fault.string = value;
endsl;
/end-free
*
P SOAPMessage_FaultEnd...
P E
*
* =====================================================================
* SOAP message: fault details
* =====================================================================
P SOAPMessage_FaultDetailStart...
P B
*
D SOAPMessage_FaultDetailStart...
D PI
D userdata * value
D depth 10I 0 value
D namespace 1024A varying const
D name 1024A varying const
D path 24576A varying const
D attrs * dim(32767)
D const options(*varsize)
*
D detail...
D DS based(userdata)
D likeds(wsdl_soap_faultDetail_t)
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
if (depth = 1);
return;
endif;
select;
endsl;
/end-free
*
P SOAPMessage_FaultDetailStart...
P E
*
* =====================================================================
* SOAP message: fault details
* =====================================================================
P SOAPMessage_FaultDetailEnd...
P B
*
D SOAPMessage_FaultDetailEnd...
D PI
D userdata * value
D depth 10I 0 value
D namespace 1024A varying const
D name 1024A varying const
D path 24576A varying const
D value 65535A varying const
D attrs * dim(32767)
D const options(*varsize)
*
D detail...
D DS based(userdata)
D likeds(wsdl_soap_faultDetail_t)
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
if (depth = 1);
return;
endif;
select;
when (name = 'hostname');
detail.hostname = value;
endsl;
/end-free
*
P SOAPMessage_FaultDetailEnd...
P E
*
* =====================================================================
* SOAP message: NULL callback procedure
* =====================================================================
P SOAPMessage_unexpectedElementStart...
P B
*
D SOAPMessage_unexpectedElementStart...
D PI
D userdata * value
D depth 10I 0 value
D namespace 1024A varying const
D name 1024A varying const
D path 24576A varying const
D attrs * dim(32767)
D const options(*varsize)
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
if (ignoreUnexpectedSoapHeader());
http_DebugLog_appendText(
'Warning: Received unexpected Soap header: <' + name + '>');
return;
endif;
if (f_exist('WSDL2RPG': '*LIBL': '*MSGF'));
clear USR0042;
USR00421 = 'SOAPMessage_unexpectedElementStart';
USR00422 = 'SOAPMessage_unexpectedElementEnd';
AppMsg_sendCancelMsg(AppMsg_newError('USR0042': USR0042));
else;
AppMsg_sendCancelMsg(
f_newMsg('CPF9898'
: 'Unexpected Soap element received from web service.'
: '*ESCAPE'
: 'QCPFMSG'));
endif;
return;
/end-free
*
P SOAPMessage_unexpectedElementStart...
P E
*
* =====================================================================
* SOAP message: NULL callback procedure
* =====================================================================
P SOAPMessage_unexpectedElementEnd...
P B
*
D SOAPMessage_unexpectedElementEnd...
D PI
D userdata * value
D depth 10I 0 value
D namespace 1024A varying const
D name 1024A varying const
D path 24576A varying const
D value 65535A varying const
D attrs * dim(32767)
D const options(*varsize)
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
if (ignoreUnexpectedSoapHeader());
http_DebugLog_appendText(
'Warning: Received unexpected Soap header: ' + value);
http_DebugLog_appendText(
'Warning: Received unexpected Soap header: </' + name + '>');
return;
endif;
if (f_exist('WSDL2RPG': '*LIBL': '*MSGF'));
clear USR0042;
USR00421 = 'SOAPMessage_unexpectedElementStart';
USR00422 = 'SOAPMessage_unexpectedElementEnd';
AppMsg_sendCancelMsg(AppMsg_newError('USR0042': USR0042));
else;
AppMsg_sendCancelMsg(
f_newMsg('CPF9898'
: 'Unexpected Soap element received from web service.'
: '*ESCAPE'
: 'QCPFMSG'));
endif;
return;
/end-free
*
P SOAPMessage_unexpectedElementEnd...
P E
*
* =====================================================================
* Specifies, whether unexpected Soap headers are ignored or not.
* =====================================================================
P ignoreUnexpectedSoapHeader...
P B
*
D ignoreUnexpectedSoapHeader...
D PI N
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
return cFalse;
/end-free
*
P ignoreUnexpectedSoapHeader...
P E
*
* =====================================================================
* Registers an user callback procedure, that is called whenever
* a web service requires user authentification.
* =====================================================================
P Inventory_registerLoginCallback...
P B export
*
D Inventory_registerLoginCallback...
D PI
D D i_pLoginProc * value procptr
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
g_getLoginDataImpl = i_pLoginProc;
return;
/end-free
*
P Inventory_registerLoginCallback...
P E
*
* =====================================================================
* Http: Returns the last HTTP error (code) that occurred.
* =====================================================================
P Inventory_isError...
P B export
*
D Inventory_isError...
D PI N
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
if (g_errors.errType = WSDL_HTTP_SUCCESS);
return cFalse;
else;
return cTrue;
endif;
/end-free
*
P Inventory_isError...
P E
*
* =====================================================================
* Http: Returns the last HTTP error (code) that occurred.
* =====================================================================
P Inventory_HttpError_getCode...
P B export
*
D Inventory_HttpError_getCode...
D PI like(wsdl_http_ErrorNo_t )
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
return g_errors.httpError.no;
/end-free
*
P Inventory_HttpError_getCode...
P E
*
* =====================================================================
* Http: Returns the last HTTP error (text) that occurred.
* =====================================================================
P Inventory_HttpError_getText...
P B export
*
D Inventory_HttpError_getText...
D PI like(wsdl_http_ErrorText_t)
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
return g_errors.httpError.text;
/end-free
*
P Inventory_HttpError_getText...
P E
*
* =====================================================================
* Soap: Returns the last SOAP error (code) that occurred.
* =====================================================================
P Inventory_SoapError_getCode...
P B export
*
D Inventory_SoapError_getCode...
D PI like(wsdl_soap_faultcode_t )
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
return g_errors.soapFault.code;
/end-free
*
P Inventory_SoapError_getCode...
P E
*
* =====================================================================
* Soap: Returns the last SOAP error (text) that occurred.
* =====================================================================
P Inventory_SoapError_getText...
P B export
*
D Inventory_SoapError_getText...
D PI like(wsdl_soap_faultstring_t)
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
return g_errors.soapFault.string;
/end-free
*
P Inventory_SoapError_getText...
P E
*
* =====================================================================
* XML: Returns the last XML error (code) that occurred.
* =====================================================================
P Inventory_XmlError_getCode...
P B export
*
D Inventory_XmlError_getCode...
D PI like(wsdl_xml_ErrorNo_t )
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
return g_errors.xmlError.code;
/end-free
*
P Inventory_XmlError_getCode...
P E
*
* =====================================================================
* XML: Returns the last XML error (text) that occurred.
* =====================================================================
P Inventory_XmlError_getText...
P B export
*
D Inventory_XmlError_getText...
D PI like(wsdl_xml_ErrorText_t )
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
return g_errors.xmlError.text;
/end-free
*
P Inventory_XmlError_getText...
P E
*
* =====================================================================
* Returns the file name of the attachment that is associated to
* a given content ID.
* =====================================================================
P Inventory_Attachments_get...
P B export
*
D Inventory_Attachments_get...
D PI like(wsdl_path_t )
D i_attachmentID...
D const like(wsdl_attachmentID_t )
*
D fileName S like(wsdl_path_t ) inz
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
fileName = Attachments_get(Attachments_theInstance()
: cSERVICE_UUID
: i_attachmentID);
return fileName;
/end-free
*
P Inventory_Attachments_get...
P E
*
* =====================================================================
* Returns the file name of the attachment that is associated to
* a given index.
* =====================================================================
P Inventory_Attachments_getAtPos...
P B export
*
D Inventory_Attachments_getAtPos...
D PI likeds(wsdl_attachment_t )
D i_index 10I 0 const
*
D attachment DS likeds(wsdl_attachment_t ) inz
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
attachment = Attachments_getAtPos(Attachments_theInstance()
: cSERVICE_UUID
: i_index);
return attachment;
/end-free
*
P Inventory_Attachments_getAtPos...
P E
*
* =====================================================================
* Returns the number of attachments that were downloaded with
* the last call of the web service.
* =====================================================================
P Inventory_Attachments_getNumE...
P B export
*
D Inventory_Attachments_getNumE...
D PI 10I 0
*
D numE S 10I 0 inz
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
numE = Attachments_getNumAttachments(Attachments_theInstance()
: cSERVICE_UUID);
return numE;
/end-free
*
P Inventory_Attachments_getNumE...
P E
*
* =====================================================================
* Removes all attachments from the list of attachments of
* this web service.
* =====================================================================
P Inventory_Attachments_removeAll...
P B export
*
D Inventory_Attachments_removeAll...
D PI
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
Attachments_removeAll(Attachments_theInstance()
: cSERVICE_UUID);
return;
/end-free
*
P Inventory_Attachments_removeAll...
P E
*
* =====================================================================
R * *** private/experimental ***
* Enables/disables a workaround for Web services that are driven
* by Axis and that are affected by the AXIS-2095 bug.
* Export this procedure if you really need it.
* =====================================================================
P Inventory_enableAxis2095...
P B
*
D Inventory_enableAxis2095...
D PI
D i_isEnabled N const
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
deprecated();
g_isAXIS_2095 = i_isEnabled;
return;
/end-free
*
P Inventory_enableAxis2095...
P E
*
* =====================================================================
* Specifies the name of the folder where to put attachments in.
* =====================================================================
P Inventory_setAttachmentFolder...
P B export
*
D Inventory_setAttachmentFolder...
D PI
D i_folder 1024A const varying options(*varsize)
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
g_attachmentFolder = i_folder;
g_attachmentFolder = %trimR(%xlate('Ö': '/': g_attachmentFolder));
if (not f_endsWith('/': g_attachmentFolder));
g_attachmentFolder = g_attachmentFolder + '/';
endif;
return;
/end-free
*
P Inventory_setAttachmentFolder...
P E
/IF DEFINED(LOGGING_SERVICE)
*
* =====================================================================
* Starts the Log4rpg logging service.
* =====================================================================
P Inventory_startLoggingService...
P B export
*
D Inventory_startLoggingService...
D PI
D i_path const like(LOG4RPG_path_t )
D options(*nopass)
D i_waitMinutes 10I 0 const options(*nopass)
D i_unit 10A const options(*nopass)
*
* Parameter positions
D p_path C 1
D p_waitMinutes C 2
D p_unit C 3
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
LoggerStub_loadSrvPgm();
select;
when (%parms() >= p_unit);
Configurator_loadAndWatchPropertiesConfiguration(
i_path: i_waitMinutes: i_unit);
when (%parms() >= p_waitMinutes);
Configurator_loadAndWatchPropertiesConfiguration(
i_path: i_waitMinutes);
when (%parms() >= p_path);
Configurator_loadPropertiesConfiguration(i_path);
other;
Configurator_loadDefaultConfiguration();
endsl;
return;
/end-free
*
P Inventory_startLoggingService...
P E
/ENDIF
*
* =====================================================================
* Web service: Enables/disables the debug log of HTTP API
* =====================================================================
P Inventory_setHttpDebug...
P B export
*
D Inventory_setHttpDebug...
D PI
D i_status N const
D i_fileName 500A const varying options(*nopass)
*
* Parameter positions
D p_fileName C 2
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
g_httpDebug.status = i_status;
if (%parms() >= p_fileName);
g_httpDebug.fileName = i_fileName;
else;
g_httpDebug.fileName = HTTP_API_DEFAULT_LOG_FILE;
endif;
if (i_status);
http_DebugLog_open(g_httpDebug.fileName);
else;
http_DebugLog_close();
endif;
return;
/end-free
*
P Inventory_setHttpDebug...
P E
*
* =====================================================================
* Web service: Sets the proxy server to use for the connection
* =====================================================================
P Inventory_setProxy...
P B export
*
D Inventory_setProxy...
D PI
D i_server 256A const
D i_port 10I 0 const
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
g_proxy.server = i_server;
g_proxy.port = i_port;
return;
/end-free
*
P Inventory_setProxy...
P E
*
* =====================================================================
* Web service: Returns the endpoint of the Web service
* =====================================================================
P Inventory_getEndpoint...
P B export
*
D Inventory_getEndpoint...
D PI 32767A varying
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
return g_url;
/end-free
*
P Inventory_getEndpoint...
P E
*
* =====================================================================
* Web service: Sets the endpoint of the Web service
* =====================================================================
P Inventory_setEndpoint...
P B export
*
D Inventory_setEndpoint...
D PI
D i_url 32767A const varying options(*varsize)
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
g_url = %subst(i_url: 1: %len(i_url));
return;
/end-free
*
P Inventory_setEndpoint...
P E
*
* =====================================================================
* Web service: Returns the host name of the Web Service endpoint
* =====================================================================
P Inventory_getHost...
P B export
*
D Inventory_getHost...
D PI 32767A varying
*
D tmpUrl S like(url_t ) inz
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
tmpUrl = URL_new(g_url);
return URL_getHost(tmpUrl);
/end-free
*
P Inventory_getHost...
P E
*
* =====================================================================
* Web service: Sets the host name of the Web service endpoint
* =====================================================================
P Inventory_setHost...
P B export
*
D Inventory_setHost...
D PI
D i_host 32767A const varying options(*varsize)
*
D tmpUrl S like(url_t ) inz
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
tmpUrl = URL_new(g_url);
URL_setHost(tmpUrl: %subst(i_host: 1: %len(i_host)));
g_url = URL_toString(tmpUrl);
return;
/end-free
*
P Inventory_setHost...
P E
*
* =====================================================================
* Web service: Returns the port of the Web Service endpoint
* =====================================================================
P Inventory_getPort...
P B export
*
D Inventory_getPort...
D PI 10I 0
*
D tmpUrl S like(url_t ) inz
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
tmpUrl = URL_new(g_url);
return URL_getPort(tmpUrl);
/end-free
*
P Inventory_getPort...
P E
*
* =====================================================================
* Web service: Sets the port of the Web service endpoint
* =====================================================================
P Inventory_setPort...
P B export
*
D Inventory_setPort...
D PI
D i_port 10I 0 const
*
D tmpUrl S like(url_t ) inz
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
tmpUrl = URL_new(g_url);
URL_setPort(tmpUrl: i_port);
g_url = URL_toString(tmpUrl);
return;
/end-free
*
P Inventory_setPort...
P E
*
__________________________________
The Caller, modified to include the input parms and to show the result via DSPLY is as follows:
* =====================================================================
* Generated by WSDL2RPG 1.14beta11 / 23.07.2011
* Built on Aug 18, 2011 (13:26:18)
* Built for V6R1M0
* Based on WS_PGM v1.14
* =====================================================================
* Sample program to show how to call the
* Inventory_getProfiles()
* Web service.
* =====================================================================
* Log4rpg Logging Service
/UNDEFINE LOGGING_SERVICE
* =====================================================================
* Pre-Compiler tags used by STRPREPRC to retrieve creation
* commands from the source member.
* ---------------------------------------------------------------------
* >>PRE-COMPILER<<
* >>CRTCMD<< CRTRPGMOD MODULE(&LI/&OB) +
* SRCFILE(&SL/&SF) +
* SRCMBR(&SM);
* >>COMPILE<<
* >>PARM<< TRUNCNBR(*NO);
* >>PARM<< DBGVIEW(*LIST);
* >>END-COMPILE<<
* >>EXECUTE<<
* >>CMD<< CRTPGM PGM(&LI/&OB) +
* MODULE(*PGM) +
* BNDSRVPGM(*LIBL/TSTINVEN01 +
* ) +
* DETAIL(*BASIC) +
* ACTGRP(*NEW);
* >>END-PRE-COMPILER<<
* =====================================================================
H DEBUG
H OPTION(*SRCSTMT : *NODEBUGIO)
H EXTBININT(*YES)
*
* Include generated web service stub module to
* define the prototype of the web service procedure
* and the required type definitions (aka reference fields).
/DEFINE PROTOTYPE_TSTINVEN01
CPY /COPY MKOESTER/QRPGLESRC,TSTINVEN01
/UNDEFINE PROTOTYPE_TSTINVEN01
*
/IF DEFINED(LOGGING_SERVICE)
CPY /COPY QWSDL2RPG,PLOG4RPG Log4rpg: The Log4rpg service program
CPY /COPY QWSDL2RPG,PLOG4RPG00 Log4rpg: The Log4rpg stub module
/ENDIF
*
* Program entry point
D TSTGETPROF...
D PR
*
* Sends a message to the command line.
D sndMsg...
D PR extproc('sndMsg')
D i_text 128A value varying
*
* =====================================================================
* Program entry point
* =====================================================================
D TSTGETPROF...
D PI
*
* Web service error message text
D errText S like(wsdl_errText_t ) inz
*
* Request message
* These fields needs to be filled with reasonable values
* right before calling the web service.
D in0 DS likeds(apachesoap_Map_t)
D inz
*
* Response message
* This structure contains the result values returned by
* the web service.
D getProfilesRpc DS likeds(impl_getProfilesRpc_t)
D inz
*
* Text of messages sent to the command line
D text S 128A varying inz
mk D DisplayThis s 40a
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
/if defined(LOGGING_SERVICE)
// Enable Log4rpg, in order to debug WSDL2RPG
// (Enable Log4rpg when you are ask for it by the developer)
Inventory_startLoggingService(
'mbr:QWSDL2RPG.LOG4RPG');
/endif
// Enable/disable http api debug log
// (Enable the http api debug log in case of problems with the web service)
Inventory_setHttpDebug(
*ON: '/tmp/httpapi_debug.txt'); // Default path of http api
// Specify a proxy server if your network requires it.
// Inventory_setProxy(
// 'your.proxy.server': 8080);
// Set the paramater values of the request message
// of the web service.
// assign values here
// Set number of array items:
mk in0.item.x = 1;
// Set array item values:
in0.item.mapItem(in0.item.x).key = 'profileName';
in0.item.mapItem(in0.item.x).value = 'A_646MOD Bridged';
// Now let's call the web service.
getProfilesRpc =
Inventory_getProfiles(
in0:
errText);
// If the Web service finished successfully ...
B01 if (not Inventory_isError());
// ... get response data from response data structure
mk DisplayThis = %editc(GetProfilesRpc.getProfilesReturn.x : '1');
mk DSPLY (%trim(DisplayThis));
mk DisplayThis = %trim(getProfilesRpc.getProfilesReturn.item(1));
mk DSPLY (%trim(DisplayThis));
X01 else;
// ... else show error messages ordered by priority:
// 1. HTTP error information
text = %char(
Inventory_HttpError_getCode()
) + ': ' +
Inventory_HttpError_getText()
;
sndMsg(text);
// 2. SOAP error information
B02 if (Inventory_SoapError_getCode()
<> '');
text = Inventory_SoapError_getCode()
+ ': ' +
Inventory_SoapError_getText()
;
sndMsg(text);
E02 endif;
// 3. XML parser error information
B02 if (Inventory_XmlError_getCode()
<> 0);
text = %char(Inventory_XmlError_getCode())
+ ': ' +
Inventory_XmlError_getText()
;
sndMsg(text);
E02 endif;
E01 endif;
*inlr = *on;
/end-free
*
* =====================================================================
* *** private ***
* Sends a message to the command line.
* =====================================================================
P sndMsg...
P B
*
D sndMsg...
D PI
D i_text 128A value varying
*
* Local fields
D msgKey S 4A inz
*
* Qualified message file name
D qMsgF DS qualified inz
D name 10A
D lib 10A
*
* API error code
D errCode DS qualified inz
D bytPrv 10I 0
D bytAvl 10I 0
D excID 7A
D reserved 1A
D excDta 256A
*
* Send Program Message (QMHSNDPM) API
D QMHSNDPM PR extpgm('QMHSNDPM')
D i_msgID 7A const
D i_qMsgF 20A const
D i_msgData 32767A const options(*varsize )
D i_length 10I 0 const
D i_msgType 10A const
D i_callStkE 32767A const options(*varsize )
D i_callStkC 10I 0 const
D o_msgKey 4A
D io_ErrCode 32767A options(*varsize )
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/free
clear qMsgF;
qMsgF.name = 'QCPFMSG';
qMsgF.lib = '*LIBL';
clear errCode;
errCode.bytPrv = %size(errCode);
QMHSNDPM('CPF9897': qMsgF: i_text: %len(i_text): '*INFO'
: '*CTLBDY': 1: msgKey: errCode);
return;
/end-free
*
P sndMsg...
P E
__________________________________
HTTPAPI Ver 1.24beta11 released 2010-09-09
OS/400 Ver V6R1M0
New iconv() objects set, PostRem=1208. PostLoc=0. ProtRem=819. ProtLoc=0
http_persist_open(): entered
http_long_ParseURL(): entered
DNS resolver retrans: 2
DNS resolver retry : 2
DNS resolver options: x'00000136'
DNS default domain: GSTNETWORKS.NET
DNS server found: 12.6.236.126
DNS server found: 12.160.200.5
http_persist_post(): entered
http_long_ParseURL(): entered
http_setauth(): entered
do_oper(POST): entered
POST /axis/services/Inventory HTTP/1.1
Host: 192.168.41.252:9090
User-Agent: http-api/1.24
Content-Length: 632
Authorization: Basic cm9vdDpwdWJsaWM=
Content-Type: text/xml
SOAPAction:
sendraw(): entered
<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="urn:Inventory" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><impl:getProfiles soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><in0 xsi:type="apachesoap:Map"><item xsi:type="apachesoap:mapItem"><key>profileName</key><value>A_646MOD Bridged</value></item></in0></impl:getProfiles></soapenv:Body></soapenv:Envelope>
recvresp(): entered
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=9343C6FFE7D8F2677F2197179B66F5C9; Path=/axis
Content-Type: text/xml;charset=utf-8
Transfer-Encoding: chunked
Date: Thu, 18 Aug 2011 18:10:08 GMT
SetError() #13: HTTP/1.1 200 OK
recvresp(): end with 200
recvdoc parms: chunked 0
header_load_cookies() entered
cookie_parse() entered
cookie = JSESSIONID=9343C6FFE7D8F2677F2197179B66F5C9; Path=/axis
cookie attr JSESSIONID=9343C6FFE7D8F2677F2197179B66F5C9
cookie attr Path=/axis
recvchunk(): entered
get_chunk_size(): entered
2000
chunk size = 8192
get_chunk_size returned 8192
calling comm_blockread
<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><ns1:getProfilesResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="urn:Inventory"><getProfilesReturn soapenc:arrayType="xsd:anyType[1]" xsi:type="soapenc:Array" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"><getProfilesReturn href="#id0"/></getProfilesReturn></ns1:getProfilesResponse><multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns2:Map" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="http://xml.apache.org/xml-soap"><item><key xsi:type="soapenc:string">WL_COUNTRY</key><value xsi:type="soapenc:string">WL_COUNTRY_US</value></item><item><key xsi:type="soapenc:string">WL_DEFAULT_TX_KEY</key><value xsi:type="soapenc:string">0</value></item><item><key xsi:type="soapenc:string">WL_WPA2_TKIP</key><value xsi:type="soapenc:string">Disabled</value></item><item><key xsi:type="soapenc:string">displayName</key><value xsi:type="soapenc:string">Profile_RG General_A_646MOD Bridged</value></item><item><key xsi:type="soapenc:string">failureCount</key><value xsi:type="soapenc:string">0</value></item><item><key xsi:type="soapenc:string">RG_INET_VCI</key><value xsi:type="soapenc:string">35</value></item><item><key xsi:type="soapenc:string">RG_DSCP_STATUS_1</key><value xsi:type="soapenc:string">Disabled</value></item><item><key xsi:type="soapenc:string">WL_WPA2_AES_CCMP</key><value xsi:type="soapenc:string">Disabled</value></item><item><key xsi:type="soapenc:string">RG_SUBSCRIBER_USER_PASSWORD</key><value xsi:type="soapenc:string">admin</value></item><item><key xsi:type="soapenc:string">stringstatus</key><value xsi:type="soapenc:string">Clear</value></item><item><key xsi:type="soapenc:string">RG_SNTP_SERVER</key><value xsi:type="soapenc:string">192.168.41.5</value></item><item><key xsi:type="soapenc:string">RG_PORT_SERVICE_HPNA</key><value xsi:type="soapenc:string">None</value></item><item><key xsi:type="soapenc:string">uClass</key><value xsi:type="soapenc:string">null</value></item><item><key xsi:type="soapenc:string">parentKey</key><value xsi:type="soapenc:string">NULL</value></item><item><key xsi:type="soapenc:string">RG_ROUTE_SUBNET_4</key><value xsi:type="soapenc:string">None</value></item><item><key xsi:type="soapenc:string">RG_INET_FRAME_TYPE</key><value xsi:type="soapenc:string">Tagged</value></item><item><key xsi:type="soapenc:string">RG_ROUTE_SUBNET_3</key><value xsi:type="soapenc:string">None</value></item><item><key xsi:type="soapenc:string">RG_ROUTE_SUBNET_2</key><value xsi:type="soapenc:string">None</value></item><item><key xsi:type="soapenc:string">RG_ROUTE_SUBNET_1</key><value xsi:type="soapenc:string">12.160.207.222</value></item><item><key xsi:type="soapenc:string">WL_AUTO_CHANNEL</key><value xsi:type="soapenc:string">Enabled</value></item><item><key xsi:type="soapenc:string">RG_VOIP_VPI</key><value xsi:type="soapenc:string">0</value></item><item><key xsi:type="soapenc:string">RG_END_USER_LOGIN</key><value xsi:type="soapenc:string">None</value></item><item><key xsi:type="soapenc:string">RG_PORT_SERVICE_WL</key><value xsi:type="soapenc:string">None</value></item><item><key xsi:type="soapenc:string">RG_MGMT_SUBNET_NAME_1</key><value xsi:type="soapenc:string"></value></item><item><key xsi:type="soapenc:string">RG_PORT_UP_RATE_HPNA</key><value xsi:type="soapenc:string">0</value></item><item><key xsi:type="soapenc:string">RG_TIME_ZONE</key><value xsi:type="soapenc:string">EST</value></item><item><key xsi:type="soapenc:string">RG_PORT_SERVICE_GLAN</key><value xsi:type="soapenc:string">None</value></item><item><key xsi:type="soapenc:string">RG_INET_VLAN</key><value xsi:type="soapenc:string">800</value></item><item><key xsi:type="soapenc:string">WL_STATUS</key><value xsi:type="soapenc:string">Enabled</value></item><item><key xsi:type="soapenc:string">managed</key><value xsi:type="soapenc:string">true</value></item><item><key xsi:type="soapenc:string">RG_VOIP_VCI</key><value xsi:type="soapenc:string">35</value></item><item><key xsi:type="soapenc:string">WL_WPA2</key><value xsi:type="soapenc:string">Disabled</value></item><item><key xsi:type="soapenc:string">RG_PORT_DOWN_RATE_HPNA</key><value xsi:type="soapenc:string">0</value></item><item><key xsi:type="soapenc:string">WL_WPA1</key><value xsi:type="soapenc:string">Disabled</value></item><item><key xsi:type="soapenc:string">RG_MGMT_VPI</key><value xsi:type="soapenc:string">0</value></item><item><key xsi:type="soapenc:string">RG_VOIP_FRAME_TYPE</key><value xsi:type="soapenc:string">Tagged</value></item><item><key xsi:type="soapenc:string">RG_ADDITIONAL_VLAN_INCLUDE_VIDS</key><value xsi:type="soapenc:string">None</value></item><item><key xsi:type="soapenc:string">RG_PORT_SERVICE_6</key><value xsi:type="soapenc:string">None</value></item><item><key xsi:type="soapenc:string">status</key><value xsi:type="soapenc:string">5</value></item><item><key xsi:type="soapenc:string">RG_PORT_SERVICE_5</key><value xsi:type="soapenc:string">None</value></item><item><key xsi:type="soapenc:string">RG_PORT_SERVICE_4</key><value xsi:type="soapenc:string">None</value></item><item><key xsi:type="soapenc:string">RG_PORT_SERVICE_3</key><value xsi:type="soapenc:string">None</value></item><item><key xsi:type="soapenc:string">RG_SUPER_USER_LOGIN</key><value xsi:type="soapenc:string">None</value></item><item><key xsi:type="soapenc:string">RG_PORT_SERVICE_2</key><value xsi:type="soapenc:string">None</value></item><item><key xsi:type="soapenc:string">RG_BOOTSTRAP_VLAN</key><value xsi:type="soapenc:string">2100</value></item><item><key xsi:type="soapenc:string">RG_PORT_UP_RATE_GLAN</key><value xsi:type="soapenc:string">0</value></item><item><key xsi:type="soapenc:string">RG_PORT_SERVICE_1</key><value xsi:type="soapenc:string">RG_INTERNET_SERVICE</value></item><item><key xsi:type="soapenc:string">RG_CES_VLAN</key><value xsi:type="soapenc:string">None</value></item><item><key xsi:type="soapenc:string">classname</key><value xsi:type="soapenc:string">ProfileMO</value></item><item><key xsi:type="soapenc:string">WL_PROFILE</key><value xsi:type="soapenc:string">WL_MIXED_G_WIFI</value></item><item><key xsi:type="soapenc:string">tester</key><value xsi:type="soapenc:string">ping</value></item><item><key xsi:type="soapenc:string">RG_MGMT_VCI</key><value xsi:type="soapenc:string">35</value></item><item><key xsi:type="soapenc:string">RG_PORT_DOWN_RATE_GLAN</key><value xsi:type="soapenc:string">0</value></item><item><key xsi:type="soapenc:string">WL_802_1_AUTHENTICATION</key><value xsi:type="soapenc:string">Disabled</value></item><item><key xsi:type="soapenc:string">RG_PORT_ADMIN_STATE_6</key><value xsi:type="soapenc:string">Disabled</value></item><item><key xsi:type="soapenc:string">RG_PORT_ADMIN_STATE_5</key><value xsi:type="soapenc:string">Disabled</value></item><item><key xsi:type="soapenc:string">RG_FLOW_CONTROL_1</key><value xsi:type="soapenc:string">Enabled</value></item><item><key xsi:type="soapenc:string">RG_PORT_ADMIN_STATE_4</key><value xsi:type="soapenc:string">Disabled</value></item><item><key xsi:type="soapenc:string">RG_MGMT_VLAN</key><value xsi:type="soapenc:string">2101</value></item><item><key xsi:type="soapenc:string">RG_PORT_ADMIN_STATE_3</key><value xsi:type="soapenc:string">Disabled</value></item><item><key xsi:type="soapenc:string">RG_PORT_ADMIN_STATE_HPNA</key><value xsi:type="soapenc:string">Disabled</value></item><item><key xsi:type="soapenc:string">RG_PORT_ADMIN_STATE_2</key><value xsi:type="soapenc:string">Disabled</value></item><item><key xsi:type="soapenc:string">RG_PORT_ADMIN_STATE_1</key><value xsi:type="soapenc:string">Enabled</value></item><item><key xsi:type="soapenc:string">type</key><value xsi:type="soapenc:string">Profile</value></item><item><key xsi:type="soapenc:string">RG_ROUTE_GATEWAY_1</key><value xsi:type="soapenc:string">10.252.0.1</value></item><item><key xsi:type="soapenc:string">RG_PORT_DOWN_RATE_6</key><value xsi:type="soapenc:string">0</value></
comm_blockread returned 8192
get_chunk_size(): entered
1a0d
chunk size = 6669
get_chunk_size returned 6669
calling comm_blockread
item><item><key xsi:type="soapenc:string">RG_PORT_UP_RATE_6</key><value xsi:type="soapenc:string">0</value></item><item><key xsi:type="soapenc:string">RG_PORT_DOWN_RATE_5</key><value xsi:type="soapenc:string">0</value></item><item><key xsi:type="soapenc:string">RG_PORT_UP_RATE_5</key><value xsi:type="soapenc:string">0</value></item><item><key xsi:type="soapenc:string">RG_PORT_DOWN_RATE_4</key><value xsi:type="soapenc:string">0</value></item><item><key xsi:type="soapenc:string">RG_PORT_UP_RATE_4</key><value xsi:type="soapenc:string">0</value></item><item><key xsi:type="soapenc:string">RG_PORT_DOWN_RATE_3</key><value xsi:type="soapenc:string">0</value></item><item><key xsi:type="soapenc:string">RG_PORT_SPEED_GLAN</key><value xsi:type="soapenc:string">RG_AUTO</value></item><item><key xsi:type="soapenc:string">RG_PORT_UP_RATE_3</key><value xsi:type="soapenc:string">0</value></item><item><key xsi:type="soapenc:string">RG_PORT_DOWN_RATE_2</key><value xsi:type="soapenc:string">0</value></item><item><key xsi:type="soapenc:string">RG_PORT_UP_RATE_2</key><value xsi:type="soapenc:string">0</value></item><item><key xsi:type="soapenc:string">RG_PORT_DOWN_RATE_1</key><value xsi:type="soapenc:string">0</value></item><item><key xsi:type="soapenc:string">RG_PORT_UP_RATE_1</key><value xsi:type="soapenc:string">0</value></item><item><key xsi:type="soapenc:string">RG_VOIP_VLAN</key><value xsi:type="soapenc:string">2002</value></item><item><key xsi:type="soapenc:string">WL_AUTHENTICATION</key><value xsi:type="soapenc:string">WL_AUTH_OPEN</value></item><item><key xsi:type="soapenc:string">RG_SUBSCRIBER_USER_LOGIN</key><value xsi:type="soapenc:string">admin</value></item><item><key xsi:type="soapenc:string">name</key><value xsi:type="soapenc:string">Profile_RG General_A_646MOD Bridged</value></item><item><key xsi:type="soapenc:string">RG_PORT_ADMIN_STATE_GLAN</key><value xsi:type="soapenc:string">Disabled</value></item><item><key xsi:type="soapenc:string">RG_INCLUDE_PORT_ASSIGNMENT</key><value xsi:type="soapenc:string">RG_PROFILE_SETTINGS</value></item><item><key xsi:type="soapenc:string">WL_802_1_REKEY_TIMEOUT</key><value xsi:type="soapenc:string">None</value></item><item><key xsi:type="soapenc:string">RG_PORT_SPEED_6</key><value xsi:type="soapenc:string">RG_AUTO</value></item><item><key xsi:type="soapenc:string">RG_INCLUDE_WIRELESS_PARAMS</key><value xsi:type="soapenc:string">RG_PROFILE_SETTINGS</value></item><item><key xsi:type="soapenc:string">RG_PORT_SPEED_5</key><value xsi:type="soapenc:string">RG_AUTO</value></item><item><key xsi:type="soapenc:string">RG_PORT_SPEED_4</key><value xsi:type="soapenc:string">RG_AUTO</value></item><item><key xsi:type="soapenc:string">RG_PORT_SPEED_3</key><value xsi:type="soapenc:string">RG_AUTO</value></item><item><key xsi:type="soapenc:string">RG_PORT_SPEED_2</key><value xsi:type="soapenc:string">RG_AUTO</value></item><item><key xsi:type="soapenc:string">RG_PORT_SPEED_1</key><value xsi:type="soapenc:string">RG_AUTO</value></item><item><key xsi:type="soapenc:string">webNMS</key><value xsi:type="soapenc:string">NULL</value></item><item><key xsi:type="soapenc:string">RG_LOOP_DETECTION</key><value xsi:type="soapenc:string">Disabled</value></item><item><key xsi:type="soapenc:string">statusPollEnabled</key><value xsi:type="soapenc:string">false</value></item><item><key xsi:type="soapenc:string">childrenKeys</key><value xsi:type="soapenc:string"></value></item><item><key xsi:type="soapenc:string">WL_RTS_THRESHOLD</key><value xsi:type="soapenc:string">0</value></item><item><key xsi:type="soapenc:string">RG_INCLUDE_SERVICE_VLANS</key><value xsi:type="soapenc:string">True</value></item><item><key xsi:type="soapenc:string">WL_FRAG_THRESHOLD</key><value xsi:type="soapenc:string">0</value></item><item><key xsi:type="soapenc:string">isGroup</key><value xsi:type="soapenc:string">false</value></item><item><key xsi:type="soapenc:string">pollInterval</key><value xsi:type="soapenc:string">1800</value></item><item><key xsi:type="soapenc:string">statusUpdateTime</key><value xsi:type="soapenc:string">Fri Jul 02 19:47:03 EDT 2010</value></item><item><key xsi:type="soapenc:string">RG_DISABLE_ON_POWER_FAILURE_1</key><value xsi:type="soapenc:string">Disabled</value></item><item><key xsi:type="soapenc:string">statusChangeTime</key><value xsi:type="soapenc:string">Mon Jan 12 13:57:19 EST 2009</value></item><item><key xsi:type="soapenc:string">RG_VIDEO_VLAN</key><value xsi:type="soapenc:string">None</value></item><item><key xsi:type="soapenc:string">WL_MAX_FRAME_BURST</key><value xsi:type="soapenc:string">0</value></item><item><key xsi:type="soapenc:string">WL_WPA2_PRE_AUTH</key><value xsi:type="soapenc:string">Disabled</value></item><item><key xsi:type="soapenc:string">RG_DAYLIGHT_SAVING</key><value xsi:type="soapenc:string">Disabled</value></item><item><key xsi:type="soapenc:string">RG_MGMT_FRAME_TYPE</key><value xsi:type="soapenc:string">Tagged</value></item><item><key xsi:type="soapenc:string">profileType</key><value xsi:type="soapenc:string">RG General</value></item><item><key xsi:type="soapenc:string">WL_ENCRYPTION</key><value xsi:type="soapenc:string">None</value></item><item><key xsi:type="soapenc:string">RG_GEN_PROFILE_SCOPING</key><value xsi:type="soapenc:string">None</value></item><item><key xsi:type="soapenc:string">WL_TRANSMIT_RATE</key><value xsi:type="soapenc:string">1M</value></item><item><key xsi:type="soapenc:string">RG_ROUTE_MASK_1</key><value xsi:type="soapenc:string">255.255.255.255</value></item><item><key xsi:type="soapenc:string">WL_802_1_KEY_TRANSMISSION</key><value xsi:type="soapenc:string">Disabled</value></item><item><key xsi:type="soapenc:string">profileName</key><value xsi:type="soapenc:string">A_646MOD Bridged</value></item><item><key xsi:type="soapenc:string">RG_SYSTEM_POWER_MGMT</key><value xsi:type="soapenc:string">Enabled</value></item><item><key xsi:type="soapenc:string">failureThreshold</key><value xsi:type="soapenc:string">1</value></item><item><key xsi:type="soapenc:string">isContainer</key><value xsi:type="soapenc:string">false</value></item><item><key xsi:type="soapenc:string">atiText</key><value xsi:type="soapenc:string"></value></item><item><key xsi:type="soapenc:string">RG_INET_VPI</key><value xsi:type="soapenc:string">0</value></item><item><key xsi:type="soapenc:string">WL_HIDE_SSID</key><value xsi:type="soapenc:string">False</value></item><item><key xsi:type="soapenc:string">RG_SPLIT_MANAGEMENT</key><value xsi:type="soapenc:string">Disabled</value></item><item><key xsi:type="soapenc:string">WL_INTRA_BSS_RELAY</key><value xsi:type="soapenc:string">Enabled</value></item></multiRef></soapenv:Body></soapenv:Envelope>
comm_blockread returned 6669
get_chunk_size(): entered
0
chunk size = 0
get_chunk_size returned 0
http_close(): entered
--------------------------------------------------
Date: Thu, 18 Aug 2011 17:37:05 +0200
From: Thomas Raddatz <thomas.raddatz@xxxxxxxxxxx>
Subject: Re: Instructions needed for WSDL2RPG logging set-up
To: HTTPAPI and FTPAPI Projects <ftpapi@xxxxxxxxxxxxxxxxxxxxxx>
Message-ID: <4E4D31A1.7030108@xxxxxxxxxxx>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Michael,
Did you already turn on the standard HTTP API logging? If you did not yet do that, please turn on logging by calling procedure *_setHttpDebug(status:
ifsPathName), eg:
DownloadAttachment_setHttpDebug(*ON: '/home/raddatz/logFile.log')
Usually the log file tells you each and everything you need to solve the problem.
Thomas.
Am 18.08.2011 16:48, schrieb Koester, Michael:
> I used WSDL2RPG to generate stub and caller program to get details from another platform on our network via a web service provided by the software on that platform. When I run my test call, I get a "1" as the number of rows returned. The returned row is blank. Don't know if I'm sending the values to the service properly or not. I am not getting an error, but I am not getting the same result as what shows in the Northbound Interface software.
>
> I know that's not enough for you help me solve the problem, but I need instructions to turn on the logging I've seen referenced in this list. Can the log file be created in a lib/file on the i, or does it have to go to the IFS?
> Once I get that, I may have follow-up questions (with details you can use). Or I may be able to determine from the log file that my request to the service is incorrect, and resolve that before involving you further.
>
> Thanks much.
>
> Michael Koester
>
-----------------------------------------------------------------------
This is the FTPAPI mailing list. To unsubscribe, please go to:
http://www.scottklement.com/mailman/listinfo/ftpapi
-----------------------------------------------------------------------