[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Ftpapi] Procedure to use for POST data



Just an update - it's working for me now. This is how I'm doing it, just sharing if anyone else come across with similar issue.

yajl_beginObj();                                 
     yajl_addChar('Location': '06031') ;         
     yajl_addChar('Source'  : 'WMS'  ) ;         
     yajl_addNum('Quantity'  : '10'   ) ;        
yajl_endObj();                                   
                                                 
%len(jsonData) = JSON_BUF_SIZE;                                                                  
rc = yajl_copyBuf(  0                         
                        : %addr(jsonData : *data)
                        : JSON_BUF_SIZE          
                        : len );         
        
%len(jsonData) = len;                     
yajl_genClose();                                 

http_setCCSIDs( 1208: 0 );                
form = WEBFORM_open();              
            
WEBFORM_setVar(form: 'Action': 'SendMessage');  
WEBFORM_setVar(form: 'MessageBody': jsondata ) ;

               'RTI_TRAX_Q?' + webform_getData(form);             
WEBFORM_close(form);                                              
                                                                  
rc  =  http_req('POST'                                            
               : httpurl                                          
               : *omit                                            
               : ResponseMessage                                  
               : *omit                                            
               : *omit                                            
               : 'application/json') ;                   

​Thanks,
Pargat​


On Fri, May 12, 2017 at 10:37 AM, Pargat Singh <pargat2k3@xxxxxxxxx> wrote:
Thanks a lot Scott. It's working using both { and } and %char(leftbrace).

I was able to POST manually generated JSON string successfully so now trying to build JSON message using your YAJL procedures. Below is how I tried, referred example you provided in YAJL SAVF. But in debug when i see data in "jsonData" variable it shows some junk. Not sure if this is expected or i missed any required step. 

This is how I'm trying. After copying JSON buffer, I'm encoding data before putting in URL but it posted data as junk characters as "#Ž€€€€‚<?Ä/ÈÑ?>‚š€‚ – “‘‚ŒŽ€€€€‚ë?ÍÊÄÁ‚š€‚ï(ë‚ŒŽ€€€€‚éÍ/>ÈÑÈ`‚š€‘ Ž'Ž" 

Please advise if i need any additional steps to post JSON generated data from YAJL procedures.
                             
yajl_beginObj();                                 
     yajl_addChar('Location': '06031') ;         
     yajl_addChar('Source'  : 'WMS'  ) ;         
     yajl_addNum('Quantity'  : '10'   ) ;        
yajl_endObj();                                   
                                                 
%len(jsonData) = JSON_BUF_SIZE;                                                                  
rc = yajl_copyBuf(  1208                         
                        : %addr(jsonData : *data)
                        : JSON_BUF_SIZE          
                        : len );         
        
%len(jsonData) = len;                     
yajl_genClose();                                 

http_setCCSIDs( 1208: 0 );                
form = WEBFORM_open();              
            
WEBFORM_setVar(form: 'Action': 'SendMessage');  
WEBFORM_setVar(form: 'MessageBody': jsondata ) ;

               'RTI_TRAX_Q?' + webform_getData(form);             
WEBFORM_close(form);                                              
                                                                  
rc  =  http_req('POST'                                            
               : httpurl                                          
               : *omit                                            
               : ResponseMessage                                  
               : *omit                                            
               : *omit                                            
               : 'application/json') ;                   

Below is from http log file:

POST /048216022518/RTI_TRAX_Q?Action="">MessageBody=%23%C2%8E%C2%80%C2%80%C2%80%C2%80%C2%82%3C%3F%C3%84%2F%C3%88%C3%91%3F%3
E%C2%82%C2%9A%C2%80%C2%82%C2%90%C2%96%C2%90%C2%93%C2%91%C2%82%C2%8C%C2%8E%C2%80%C2%80%C2%80%C2%80%C2%82%C3%AB%3F%C3%8D%C3%8A%C3%84%
C3%81%C2%82%C2%9A%C2%80%C2%82%C3%AF(%C3%AB%C2%82%C2%8C%C2%8E%C2%80%C2%80%C2%80%C2%80%C2%82%C3%A9%C3%8D%2F%3E%C3%88%C3%91%C3%88%60%C
2%82%C2%9A%C2%80%C2%91%C2%90%C2%8E%27%C2%8E HTTP/1.1         

Host: xyz.com       
User-Agent: http-api/1.34                        

Thanks,
Pargat

On Wed, May 10, 2017 at 2:09 PM, Scott Klement <sk@xxxxxxxxxxxxxxxx> wrote:

Try using %char(LeftBrace), etc.   Or just code the { and  } characters in your string.  Coding them in the string will only be a problem if the program is run in a different character set that it was compiled from.  So if you support multiple CCSIDs, you want to convert it from Unicode, but if not, you can code it in EBCDIC.


I don't understand why it says CCSID 1208, though -- the UCS-2 constants are either CCSID 13488 (UCS-2) or 1200 (UTF-16).



On 5/10/17 12:09 PM, Pargat Singh wrote:
Scott,

I defined those in my program. I won't take chance to modify HTTPAPI as I'm very new to this :)
Error is coming on line 34 where i used Leftbrace/Rightbrace constants. Below is how i defined these constants in UCS-2.

I found one of your response regarding encoding braces for JSON message so that's how i was trying. - http://www.scottklement.com/archives/ftpapi/201308/msg00038.html

0027.00        dcl-c  LeftBrace           const(U'007b')    ;                                          
0028.00        dcl-c  RightBrace          const(U'007d')    ;                                          
0029.00        dcl-c  Comma               const(U'002c')    ;                                          
0030.00                                                                                                
0031.00                http_setCCSIDs( 1208: 0 );                                                      
0032.00          form = WEBFORM_open();                                                                
0033.00          WEBFORM_setVar(form: 'Action': 'SendMessage');                                        
0034.00          WEBFORM_setVar(form: 'MessageBody':LeftBrace + ' "Location":"06031" ' + RightBrace); 
              

*RNF0203 30   2723 003400  PARAMETER  HAS CCSID 1208; THE JOB CCSID IS REQUIRED FOR
                           OPTIONS(*STRING).                                       

Thanks,
Pargat

On Tue, May 9, 2017 at 10:55 PM, Scott Klement <sk@xxxxxxxxxxxxxxxx> wrote:
Pargat,

This error is referring to the RPG CCSID(1208) or CCSID(*UTF8) keyword, which HTTPAPI does not use.

Did you add this keyword somewhere in your code?  Or modify the HTTPAPI code?  

-SK




On 5/9/17 11:16 AM, Pargat Singh wrote:
Thanks Scott. Sorry i misunderstood initially regarding encoding whole data.

I made changes in my test program as you suggested but getting compile time error at below line 34. I couldn't find where to define JOB CCSID as i tried at H-spec as "ctl-opt ccsid(*CHAR : *JOBRUN) ; " but no luck.

The error is coming due to Leftbrace/Rightbrace being defined as UCS-2, I even tried with hex value but no luck. Now I have tried like below and it seems to be working. The data is also posted on webservice. I'll try my complete message and will revert if still see any issue.

Again, thanks a lot for all of your help. This learning is very precious for me.

​​
WEBFORM_setVar(form: 'MessageBody': '{'      + ' "Location":"06031" ' + ',' + 
               ' "UID":"U1234567" ' + '}' ) ;                                 

​​
*RNF0203 30   2723 003400  PARAMETER  HAS CCSID 1208; THE JOB CCSID IS REQUIRED FOR
                           OPTIONS(*STRING).                                       
D LeftBrace       C                   Const(%UCS2('{'))
D RightBrace      C                   Const(%UCS2('}'))
0031.00                http_setCCSIDs( 1208: 0 );                                                     
0032.00          form = WEBFORM_open();                                                               
0033.00          WEBFORM_setVar(form: 'Action': 'SendMessage');                                       
​​
0034.00          WEBFORM_setVar(form: 'MessageBody':LeftBrace + ' "Location":"06031" ' + RightBrace); 
0035.00                                                                                               
0036.00                httpurl      = 'https://xyz.com/048216022518/' +           
0037.00                               'RTI_TRAX_Q?' + webform_getData(form);                          
0038.00                WEBFORM_close(form);   

Thanks,
Pargat

On Tue, May 9, 2017 at 2:50 AM, Scott Klement <sk@xxxxxxxxxxxxxxxx> wrote:
Pargat,

I told you this already in my previous reply!!  You are putting data in the URL that has not been URL encoded!  That is the missing step!

One way to handle this is with the web forms routines in HTTPAPI:

/define WEBFORMS
/copy HTTPAPI_H

dcl-s form like(WEBFORM);
dcl-s URL varchar(32767);

http_setCCSIDs(1208: 0);

form = WEBFORM_open();
WEBFORM_setVar(form: 'Action': 'SendMessage');
WEBFORM_setVar(form: 'MessageBody':LeftBrace + ' "Location":"06031" ' + RightBrace);

URL = "" class="m_-3597856765984050435m_-7333983279838773778gmail-m_-2722561160604730472gmail-m_1735831827240346651moz-txt-link-freetext" href="https://xyz.com/048216022518/RTI_TRAX_Q" target="_blank">https://xyz.com/048216022518/RTI_TRAX_Q?'
       + webform_getData(form);

WEBFORM_close(form);

// now use http_req() or whatever, with URL as the URL, it has the encoded data.


-SK


On 5/9/17 12:11 AM, Pargat Singh wrote:
Hi,

I guess for JSON, braces and comma has to be encoded. This is how I tried but still getting same error. Can you please advise If I'm missing any required step.

Below is from http log file. It shows %20 in message.

POST /048216022518/RTI_TRAX_Q?Action=SendMessage&MessageBody={%20"Location":"06031"%20} HTTP/1.1
Host: xyz.com                                                               
User-Agent: http-api/1.34                                                                       

dcl-c  LeftBrace           const(%UCS2('{')) ; 
dcl-c  RightBrace          const(%UCS2('}')) ; 
dcl-c  Comma               const(%UCS2(',')) ; 

 httpurl      = 'https://xyz.com/048216022518/' +            
                'RTI_TRAX_Q?Action="">&MessageBody=' +                       
                LeftBrace +  ' "Location":"06031" ' + Rightbrace ;         

http_setCCSIDs( 1208: 0 );                  
                                            
rc  =  http_req('POST'                      
               : httpurl                    
               : *omit                      
               : ResponseMessage            
               : *omit                      
               : *omit                                 
               : 'application/json') ;      

Thanks,
Pargat

         

On Sun, May 7, 2017 at 1:11 AM, Pargat Singh <pargat2k3@xxxxxxxxx> wrote:
Seems like some part of message is chopped off in my previous reply, re-sending. When I POST this message even without request data, it works perfectly

httpurl  =  https://xyz.com/048216022518/RTI_TRAX_Q?Action="">MessageBody=Loc:6603,Type:CC,SKN:423465,
UID:B1234567,Qty:1000,Seq:1,TimeStamp:2017-04-05-14.15.04.409000      

On Sun, May 7, 2017 at 12:53 AM, Pargat Singh <pargat2k3@xxxxxxxxx> wrote:
Scott,

Thanks for the details, even i asked same question when i saw this requirement first time :)

This webservice expects data in URL itself. It works fine when i POST data like below, non JSON format. I tried splitting URL and data while invoking http_req but getting "Unknown Operation" in response, please help me out.

ID:B1234567,Qty:1000,Seq:1,TimeStamp:2017-04-05-14.15.04.409000                   

rc  =  http_req('POST'     
               : httpurl   
               : *omit     
               : ResponseMessage      
               : *omit                
               : *omit         
               : 'application/json') ;                                     

Thanks,
Pargat 

On Sat, May 6, 2017 at 11:29 PM, Scott Klement <sk@xxxxxxxxxxxxxxxx> wrote:
Pargat,

Every web service works differently.  I can tell you how to use HTTPAPI, but I cannot tell you want is needed for a specific web service.  If you know what the web service expects, and just need to know how to code that HTTPAPI, then I can help you.  (But you have to tell me what it expects.)

The format you're sending is rather strange -- I don't know if it is right or wrong because I'm not familiar with this web service, but it is highly suspcious to me because it's so different from what most others do.

1) You are doing a POST request, which allows you to send a big stream of request data -- but you're not using it and instead are putting all your data in the URL.  That's very suspcious.

2) Also closely related to #1, you are telling it that your request data is in application/json format, but you are not sending any request data -- so that doesn't make much sense.

3) You have both form fields (aka name/value pairs) and JSON in the same request.  Most web services use one or the other, not a mixture of both.

4) It doesn't not appear that you have URL encoded your data, despite that you're putting it in the URL.  Therefore, any special characters you use could cause problems.

Again -- all of this COULD be valid and expected with this web service,  I have no way of knowing.  But MOST web services that I've used don't work the way you've coded this.

-SK



On 5/6/17 7:38 PM, Pargat Singh wrote:
Hi Scott,

When i try to send message using procedure http_req in JSON format, I get code 400 in RC and gets nothing in response parameter. But i see "400 Bad Request" error in http log, below is how i'm invoking http_req and snippet from http log.

Do i need to use any different procedure/parm to pass data in JSON format? When I send message as named value pair then it works perfectly.

httpurl = https://xyz.com.com/048216022518/RTI_TRAX_Q?Action="">ge&MessageBody={"Location":"06031","UID":"UID12345","Quantity":-8,"EventSource":"WMI","EventBucket":"AVAILABLE","EventType":"Adjustment","EventReasonCode":"CycleCount","EventSeq":11,"Timestamp":"2017-04-05-14.15.04.409000"}


rc  =  http_req('POST'                
               : httpurl              
               : *omit                
               : ResponseMessage      
               : *omit                
               : *omit                
               : 'application/json') ;

SetError() #13: HTTP/1.1 400 Bad Request 
recvresp(): end with 400                 
recvdoc parms: identity 0                
header_load_cookies() entered            
recvdoc(): entered                       
SetError() #0:                           
recvdoc(): Receiving 0 bytes.            
recvdoc(): Nothing to receive, exiting...
SetError() #13: HTTP/1.1 400 Bad Request 
http_close(): entered                    

​Thanks,
Pargat​


On Fri, May 5, 2017 at 7:14 AM, Pargat Singh <pargat2k3@xxxxxxxxx> wrote:
Scott,

Thanks for the details. It seems error comes only in http_req procedure. I tried same with HTTPAPI command and it didn't blow and shows actual error. If you are planning to make change in http_req then please let me know and I can test it out.

ssageBody=Loc:6603') DOWNLOAD('/home/gurayap/webresponse') REQTYPE(*POST)
 UPLOAD('/home/gurayap/webresponse') PROXY('www-proxy-dev.tru.com:8080') 
DEBUG('/home/gurayap/httplog.txt')                                       

30 SSL Handshake: (GSKit) Peer not recognized or badly formatted message 
  receive                    

Thanks,
Pargat                                            

On Fri, May 5, 2017 at 6:02 AM, Scott Klement <sk@xxxxxxxxxxxxxxxx> wrote:
Pargat,

I do not receive an error when I run your program.  However, I think I see why...  it is not because of your URL that you are getting this error, it is because you are experiencing a "Peer not recognized or badly formatted message received" error during the SSL handshake.   I don't receive that problem, presumably because I'm running a different version of the IBM i operating system (or maybe a different PTF level) that has improvements to the SSL software (GSKit).

It looks that when it fails during the SSL Handshake step, HTTPAPI tries to close the SSL environment twice.  The first time works, but the second time the environment is set to null, and so it gets a pointer error.

I can try to fix this...  but since I can't reproduce it, I have no way to test my fix.

-SK

On 5/4/2017 7:34 PM, Pargat Singh wrote:
Thanks Scott.
I changed the definition of variable in my program and reverted the change i made in HTTPAPI. After change i retried again and got same error "*Pointer not set for location referenced*". This is the program I'm testing with, it's happening when i use any invalid URL, e.g. xyz.com <http://xyz.com>.

Please let me know if you need more details.

**FREE
       /copy qrpglesrc,httpapi_h
dcl-s  httpurl varchar(5000)  ;
dcl-s  ResponseMessage varchar(1600000:4) ;
dcl-s  HttpLogFileIfsPath  varchar(200)   ;
dcl-s  rc  zoned(10)  ;
        httpurl      = 'https://xyz.com/048216022518/' +
 'RTI_TRAX_Q?Action="">e&MessageBody=' +
 'Loc:6603,Type:CC,SKN:423465,UID:B1234567,' +
 'Qty:1000,Seq:1,TimeStamp:2017-04-05-14.15.04.409000' ;
        HttpLogFileIfsPath   =  '/home/gurayap/httplog.txt'     ;
        http_debug(*ON: HttpLogFileIfsPath);
        rc  =  http_req('POST'
                       : httpurl
                       : *omit
                       : ResponseMessage
                       : *omit
                       : *omit
                       : 'application/json') ;
          *InLr = *On;

*Below is from log file.*

recvresp(): entered
HTTP/1.1 200 Connection established

SetError() #13: HTTP/1.1 200 Connection established
recvresp(): end with 200
recvdoc parms: identity 0
header_load_cookies() entered
SNI hostname set to: xyz.com <http://xyz.com>
(GSKit) Peer not recognized or badly formatted message received.
ssl_error(415): (GSKit) Peer not recognized or badly formatted message received.
SetError() #30: SSL Handshake: (GSKit) Peer not recognized or badly formatted message received.
http_close(): entered

Thanks,
Pargat

On Thu, May 4, 2017 at 5:08 PM, Scott Klement <sk@xxxxxxxxxxxxxxxx <mailto:sk@xxxxxxxxxxxxxxxx>> wrote:

    Pargat,

    I do not recommend changing the prototype in HTTPAPI.  If you are
    doing this, then you must make sure that it is changed everywhere
    in HTTPAPI and is not causing problems.  I cannot help you with
    this, I will not support it if you make your own changes to
    HTTPAPI, then you must support it yourself.

    Instead, please define your variable as varying(4).  (It can be
    any length).  This will make it compatible with http_req() and you
    won't need to change the prototype.

    I am not familiar with the pointer error you've cited -- please
    make sure it is not due to an incorrect change you've made to
    HTTPAPI. If it is not, then please tell me how I should call
    HTTPAPI to reproduce this problem.

    -SK

    On 5/4/2017 1:33 PM, Pargat Singh wrote:

        Thanks Scott. This is really very helpful information.

        I installed the latest HTTPAPI version and tested using
        http_req procedure and it works like a charm. As of now, these
        are the 2 challenges I faced while testing:

        1. My program which invokes http_url is fully free and was not
        compiling due to error "*The type and attributes of the
        parameter do not match those of the prototype*" when i defined
        the response parm as (dcl-s ResponseMessage            varchar(1600000) ;). In prototype it's defined as below.

        *D ResultStr                     a   len(16000000) varying          options(*varsize:*omit:*nopass) *

        I changed the prototype to below and then it got compiled.
        Please advise if i shouldn't be changing prototype definition.

        *D   ResultStr  1600000a                 varying
         options(*varsize:*omit:*nopass)*


        2. For testing, when i changed my URL to make it invalid just
        to determine if i get valid error message. I got an error
        "*Pointer not set for location referenced*" in module
        *COMMTCPR4*, procedure *CommTcp_Hangup*. Error is coming on
        *close(fd)* statement.

        D CommTcp_Hangup...
        D                 PI             1N
        D   peHandle                      *   value
        c                   eval  p_CommTcp = peHandle
        *c                   if  close(fd) = 0 *
        c                   return    *ON
        c                   else
        c                   return    *OFF
        c                   endif
        P                 E


        call   PGM(TESTWEB2)
        (GSKit) Peer not recognized or badly formatted message received.
        Pointer not set for location referenced.
        The call to HTTP_REQ ended in error (C G D F).

        Thanks,
        Pargat

        On Thu, May 4, 2017 at 12:15 AM, Scott Klement
        <sk@xxxxxxxxxxxxxxxx <mailto:sk@xxxxxxxxxxxxxxxx>
        <mailto:sk@xxxxxxxxxxxxxxxx <mailto:sk@xxxxxxxxxxxxxxxx>>> wrote:

            Pargat,

            There are older routines and newer routines in HTTPAPI.  I
        would
            recommend using the newer ones if you can, they have a
        much more
            streamlined and simple interface.  Use the older routines
        if you
            need compatibility with older OS versions, including
        versions of
            RPG before it supported larger strings.

            Under the covers, all of the ways of doing POST use the
        same HTTP
            POST request.  The difference is how they interface to
        your program.

            The old methods for POST are:

            -- http_url_post():  Data to upload comes from a pointer, data
            received goes to a file in the IFS

            -- http_url_post_raw(): Data to upload comes from a pointer,
            received data goes to a callback routine.

            -- http_url_post_stmf(): Data to upload comes from an IFS
        file,
            received data goes to a file.

            -- http_url_post_raw2():  Callback is used for both the
        data to
            upload, and the received data

            -- http_url_post_xml(): Data to upload comes from a
        pointer. Data
            received is parsed by an XML parser, and parsed data is
        passed to
            two callbacks.



            The new methods are:

            -- http_req(): Works with any operation, including POST.
        Data to
            upload can come from a file or a string.  Data received
        also can
            be a file or string.

            -- http_string(): streamlined version of http_req(). Input and
            output are both strings.  Errors are sent as *escape messages
            instead of return codes.

            -- http_stmf(): streamlined version o http_req() where
            input/output are both files.  Errors are sent as *escape
        messages.


            Please do not call HTTPCMDR4 directly, that is only meant
        for use
            from the HTTPAPI command object, and I cannot provide
        support for
            calling this program directly.

            Given that you don't want special behavior for errors,
        http_req()
            might be easiest.

            url = "" href="http://your-url-here" rel="noreferrer" target="_blank">http://your-url-here';
            rc = http_req('POST': url: *omit: OutputString: *omit:
            InputString: 'application/json');

            the rc will tell you what you got back from the server.

            -1 = error occurred, communications didn't succeed
            0 = time out
            1 = success (same as 200 HTTP code)

            numbers higher than 1 are HTTP response codes that were
        sent from
            the server, such as 404 (not found), 403 (forbidden), 500
        (server
            detected error), etc.  If you get a number higher than 0
        in the
            rc, you will also have data in the OutputString (if the server
            sent any.)

            Good luck!



            On 5/3/17 10:35 AM, Pargat Singh wrote:

                Hi,

                I'm very new to HTTPAPI so need a little help here,
            sorry might
                be asking basic/stupid questions.

                I need to post data as named value pair and data is
            embedded in
                URL itself, example below. I was planning to use
            HTTPAPI command
                but I believe that won't return me error message back
            in program.
                So other option is to call HTTPCMDR4 program with
            required parms
                and it will return me error code and message back in
            my calling
                program.

                Not sure if i should be calling this program or use
            any other
                procedure e.g. http_url_post_raw2. But with this not
            sure how to
                trap the error message if connection/POST is not
            successful.

            https://xyz.com/048216022518/RTI_TRAX_Q?Action="">
            <
https://xyz.com/048216022518/RTI_TRAX_Q?Action="">>
                           <
https://xyz.com/048216022518/RTI_TRAX_Q?Action="">&
            <https://xyz.com/048216022518/RTI_TRAX_Q?Action="">>>*MessageBody=Loc:6030,Type=FRZ,SKN:423465768675,Qty:1000*

                *
                *

                In addition, i need to send data in JSON format so i
            used Scott's
                YAJL utility and tried to generate data as it's shown
            in Scott's
                example. But when i check the http log it shows junk
            characters,
                below is snippet from http log file. In debug, it
            shows junk too
                but i believe that might be due to EBCDIC vs 1208. In
            debug i
                pulled HEX equivalent of data which was showing in program
                variable and then converted to ASCII format. It showed
            correctly
                but not sure why it's transmitting as junk. Below
            message was
                posted on remote system with just "-" and rest of the
            data was
                ignored/not transmitted. Please help.


                do_oper(POST): entered

                There are 0 cookies in the cache

                POST
            /048216022518/RTI_TRAX_Q?Action=SendMessage&MessageBody=-#
                   <?Ä/ÈÑ?>                 ë?ÍÊÄÁ    ï(ë                  éÍ/>ÈÑÈ`      '

                Host:
sqs.us-east-1.amazonaws.com
            <http://sqs.us-east-1.amazonaws.com>
                <http://sqs.us-east-1.amazonaws.com
            <http://sqs.us-east-1.amazonaws.com>>

                User-Agent: http-api/1.32



                Thanks,

                Pargat





            --
            _______________________________________________
            Ftpapi mailing list
        Ftpapi@xxxxxxxxxxxxxxxxxxxxxx
        <mailto:Ftpapi@lists.scottklement.com>
        <mailto:Ftpapi@lists.scottklement.com
        <mailto:Ftpapi@lists.scottklement.com>>
        http://scottklement.com/mailman/listinfo/ftpapi
        <http://scottklement.com/mailman/listinfo/ftpapi>
            <http://scottklement.com/mailman/listinfo/ftpapi
        <http://scottklement.com/mailman/listinfo/ftpapi>>





    --     _______________________________________________
    Ftpapi mailing list
    Ftpapi@xxxxxxxxxxxxxxxxxxxxxx <mailto:Ftpapi@lists.scottklement.com>
    http://scottklement.com/mailman/listinfo/ftpapi
    <http://scottklement.com/mailman/listinfo/ftpapi>





--
_______________________________________________
Ftpapi mailing list
Ftpapi@xxxxxxxxxxxxxxxxxxxxxx
http://scottklement.com/mailman/listinfo/ftpapi






--
_______________________________________________
Ftpapi mailing list
Ftpapi@xxxxxxxxxxxxxxxxxxxxxx
http://scottklement.com/mailman/listinfo/ftpapi








--
_______________________________________________
Ftpapi mailing list
Ftpapi@xxxxxxxxxxxxxxxxxxxxxx
http://scottklement.com/mailman/listinfo/ftpapi






--
_______________________________________________
Ftpapi mailing list
Ftpapi@xxxxxxxxxxxxxxxxxxxxxx
http://scottklement.com/mailman/listinfo/ftpapi






--
_______________________________________________
Ftpapi mailing list
Ftpapi@xxxxxxxxxxxxxxxxxxxxxx
http://scottklement.com/mailman/listinfo/ftpapi



-- 
_______________________________________________
Ftpapi mailing list
Ftpapi@xxxxxxxxxxxxxxxxxxxxxx
http://scottklement.com/mailman/listinfo/ftpapi