More - Post Command Problem looks like a RunRev problem?

Andre Garzia andre at andregarzia.com
Tue Nov 18 12:38:48 EST 2008


Dave,

You can also try scripting your post call by hand using socket
routines from Rev itself. You basically assemble an HTTP request
inside a string and use write to socket to send it around. This is
pretty easy to do and gives you a lot of control over what is
happening.

Cheers
andre


On Tue, Nov 18, 2008 at 11:50 AM, Mark Smith <lists at futilism.com> wrote:
> Dave, the only things I might try would be
> 1) remove the double quotes from :-H 'SOAPAction:
> "http://bandyaboutmusic.com/GenX/IAccountService/DbPing"' --might cause
> confused parsing of the command, so:
> -H 'SOAPAction: http://bandyaboutmusic.com/GenX/IAccountService/DbPing'
>
> 2) are you sure that the url you're using
> <http://britservices.genxdev.com/Account.svc?wsdl> should include the
> "?wsdl" - it looks like a request for the wsdl, might this confuse the
> server?
>
> 3) try again using "-v" instead of "-s", this puts curl in verbose mode and
> might show something useful...
>
>
> Best,
>
> Mark
>
>
> On 18 Nov 2008, at 13:39, Dave wrote:
>
>> Hi Mark,
>>
>> I've tried it using a file, and with the code below, the command gets sent
>> but shell doesn't return.
>>
>> The there is one function that wraps the "post" command, here it is along
>> with the :
>>
>> constant kUseRunRevPostCommand="false"
>>
>> function LibSoapPostCommand
>> theHTTPHeader,theSOAPEnvelope,theSoapURL, at theSoapReply, at theSoapResponse
>>  local myShellCommand
>>  local myCommandLineResponse
>>  local myShellResult
>>  local myFilePathName
>>
>>    get StackLogStringWithTime(cr & cr &
>> "---------------------------------------------------------------" & cr & cr)
>>    get StackLogStringWithTime("theSoapURL:" && theSoapURL)
>>    get StackLogStringWithTime("theSOAPEnvelope:" && theSOAPEnvelope)
>>
>>  if kUseRunRevPostCommand = true then
>>    try
>>      set the httpheaders to theHTTPHeader
>>      --libUrlSetSSLVerification false
>>
>>      --
>>      --  Post the Data
>>      --
>>      post theSOAPEnvelope to url theSoapURL
>>
>>      --
>>      -- Catch Time-Out Errors
>>      --
>>    catch myError
>>      put the result into theSoapResponse
>>      put it into theSoapReply
>>      get StackLogStringWithTime("TIME-OUT - theSoapResponse:" &&
>> theSoapResponse)
>>      get StackLogStringWithTime("theSoapReply:" && theSoapReply)
>>      return empty
>>    end try
>>
>>    --
>>    --  Retreive Results
>>    --
>>    put the result into theSoapResponse
>>    put it into theSoapReply
>>    get StackLogStringWithTime("theSoapResponse:" && theSoapResponse)
>>    get StackLogStringWithTime("theSoapReply:" && theSoapReply)
>>
>>  else
>>    breakpoint
>>    put UtilStackGetTempFolderPathName() & "CURLTemp.txt" into
>> myFilePathName
>>    put theSOAPEnvelope into url("file:" & myFilePathName)
>>
>>    put "curl -s" into myShellCommand
>>    repeat for each line myHeaderLine in theHTTPHeader
>>      put " -H '" & myHeaderLine & "' " after myShellCommand
>>    end repeat
>>
>>    put "-d @" & myFilePathName && theSoapURL after myShellCommand
>>    put shell(myShellCommand) into myCommandLineResponse
>>    put the result into myShellResult
>>
>>    put myCommandLineResponse into theSoapResponse
>>    put myShellResult into theSoapReply
>>
>>    get StackLogStringWithTime("theSoapResponse:" && theSoapResponse)
>>    get StackLogStringWithTime("theSoapReply:" && theSoapReply)
>>
>>    delete file myFilePathName
>>  end if
>>
>>  return empty
>> end LibSoapPostCommand
>>
>> ------------------------------------------------------
>> This is the contents of the temp file:
>> ------------------------------------------------------
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>> <SOAP-ENV:Envelope
>> xmlns:xsd="http://www.w3.org/2001/XMLSchema"
>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>> xmlns:ccn2="http://schemas.datacontract.org/2004/07/ServiceContracts.Data"
>> xmlns:ccn3="http://schemas.microsoft.com/2003/10/Serialization/Arrays"
>> xmlns:i0="http://bam.com/"
>> SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
>> xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
>> xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
>> <SOAP-ENV:Header>
>>
>> </SOAP-ENV:Header>
>> <SOAP-ENV:Body>
>> <DbPing xmlns="http://bam.com/">
>> </DbPing>
>> </SOAP-ENV:Body>
>> </SOAP-ENV:Envelope>
>>
>> ------------------------------------------------------
>>
>> This is the Shell Command:
>>
>> curl -s -H 'Accept: text/xml'  -H 'Accept: multipart/*'  -H
>> 'Content-length: 689'  -H 'Content-Type: text/xml; charset=utf-8'  -H
>> 'SOAPAction: "http://bandyaboutmusic.com/GenX/IAccountService/DbPing"' -d
>> @/Documents/Programming/RunRevBase/Projects/GenX/RunTime/Temp/CURLTemp.txt
>> http://britservices.genxdev.com/Account.svc?wsdl
>>
>> When I run this from RunRev the shell() function never returns, the same
>> happens if I run it from the command line.
>>
>> Thanks a lot
>> Dave
>>
>> On 17 Nov 2008, at 16:32, Mark Smith wrote:
>>
>>> Sorry, I should have said, the library requires 2.9.
>>>
>>> How big is the data you're sending? I've had trouble putting large
>>> amounts of data on the command line (maybe a limitation of rev's 'shell'
>>> call, or something else). I was suggesting this mainly as a way fo see if it
>>> gave you any indication of what the problem might be, whether or not it
>>> would be useful in 'production'.
>>> Anyway, you could certainly try passing the soap envelope on the command
>>> line (does writing it to a file really slow it down all that much?).
>>> Anyway, you'll need to url encode the data, so something like
>>>
>>> put "curl -s" into tCurlStr
>>>
>>> repeat for each line L in myHttpHeaders -- if you're only setting one
>>> header, you don't need a repeat, of course.
>>>  put " -H" && "'" & L & "'" after tCurlStr
>>> end repeat
>>>
>>> put " -d" && "-" && quote & urlencode(mySoapEnvelope) & quote && tUrl
>>> after tCurlStr
>>> put shell(tCurlStr) into tResponse
>>>
>>> I think libUrl only ever puts errors into the result. What the shell call
>>> returns will be either the returned data, or an error (though the result may
>>> contain something if there was an error in the shell call itself).
>>>
>>> Also, I've just realised that if you do need to write to a tempfile, the
>>> line should be:
>>> put " -d" && "@" & tFile && tUrl after tCurlStr
>>>
>>>
>>> Best,
>>>
>>> Mark
>>>
>>> On 17 Nov 2008, at 16:10, Dave wrote:
>>>
>>>> Hi,
>>>>
>>>> Thanks for this. I looked at your library and found that it won't run
>>>> under RunRev 2.8.1.472 which is what I am using.
>>>>
>>>> Writing to a file will slow it down, do I *have* to use a file? If not,
>>>> how would I format the command?
>>>>
>>>> Also there are two return variables using the post command and I need to
>>>> return both:
>>>>
>>>> post mySoapEnvelope to url mySoapURL
>>>> put it into myReply
>>>> put the result into myResult
>>>>
>>>> How can I do this using the shell command?
>>>>
>>>> Would it be worth replacing the internet library from the latest version
>>>> of RunRev? Will this work? Are they compatible?
>>>>
>>>> All the Best
>>>> Dave
>>>>
>>>> On 17 Nov 2008, at 15:21, Mark Smith wrote:
>>>>
>>>>> Dave, you'll need something like this:
>>>>>
>>>>> put the tempname into tFile
>>>>> put mySoapEnvelope into url("file:" & tFile) -- this is so we don't
>>>>> pass a load of data on the command line
>>>>> put "curl -s" into tCurlStr
>>>>>
>>>>> repeat for each line L in myHttpHeaders -- if you're only setting one
>>>>> header, you don't need a repeat, of course.
>>>>>  put " -H" && "'" & L & "'" after tCurlStr
>>>>> end repeat
>>>>>
>>>>> put " -d" && tFile && tUrl after tCurlStr
>>>>> put shell(tCurlStr) into tResponse
>>>>> delete file tFile -- cleanup
>>>>>
>>>>>
>>>>> If you want to see the whole exchange including headers and everything,
>>>>> then replace "-s" with "-v" in the third line.
>>>>>
>>>>> Alternatively, you could try my library
>>>>> (http://futsoft.futilism.com/revolutionstuff.html),
>>>>> in which case it would be
>>>>>
>>>>> put curl.new() into tCurl
>>>>> curl.setUrl tCurl, tUrl
>>>>> curl.setHeaders  tCurl, myHttpHeaders
>>>>> curl.setPostData tCurl, mySoapEnvelope
>>>>> put curl.runTilDone(tCurl) into tResponse
>>>>>
>>>>>
>>>>> Best,
>>>>>
>>>>> Mark
>>>>>
>>>>>
>>>>> On 17 Nov 2008, at 14:40, Dave wrote:
>>>>>
>>>>>> Hi Mark,
>>>>>>
>>>>>> I can't figure out the correct format for the "curl" command, or how
>>>>>> to call it from RunRev.
>>>>>>
>>>>>> Given that the current post command looks like this:
>>>>>>
>>>>>> set the httpHeaders to myHTTPHeader
>>>>>> post mySoapEnvelope to url mySoapURL
>>>>>> put it into myReply
>>>>>> put the result into myResult
>>>>>>
>>>>>> How would I do this using curl? The function to send the command is
>>>>>> called from all over the place so I would have to change it in the low level
>>>>>> function, if so then the above is the only data I can get at and I have to
>>>>>> return myReply and myResult in the same format as the post command would
>>>>>> use.
>>>>>>
>>>>>> Is this possible using curl?
>>>>>>
>>>>>> Thanks a lot
>>>>>> All the Best
>>>>>> Dave
>>>>>>
>>>>>> On 17 Nov 2008, at 12:00, Mark Smith wrote:
>>>>>>
>>>>>>> Dave, I wonder if it would be worth trying to do the post using curl
>>>>>>> (or some other tool) to see if the problem still occurs?
>>>>>>>
>>>>>>> Also, have you looked at what actual bytes the truncated response
>>>>>>> ends with ie. is the server sending back something weird?
>>>>>>>
>>>>>>> Best,
>>>>>>>
>>>>>>> Mark
>>>>>>>
>>>>>>> On 17 Nov 2008, at 11:29, Dave wrote:
>>>>>>>
>>>>>>>> Hi All,
>>>>>>>>
>>>>>>>> Please see below for the history of this problem. Since then I have
>>>>>>>> some more information:
>>>>>>>>
>>>>>>>> I installed WireShark and recreated the problem. When I look at the
>>>>>>>> captured information, it looks as if the response is being sent and received
>>>>>>>> by server/client ok. It shows a number of TCP packets (TCP Segment of a
>>>>>>>> reassembled PDU) and then one block that shows as HTTP/XML. When I select
>>>>>>>> this block it shows the packet reassembled as 23782 bytes. However when the
>>>>>>>> error occurs, the response return by the RunRev post command only shows the
>>>>>>>> first 2736 bytes, e.g. the rest of the reassembled block is truncated. I
>>>>>>>> have the dumps as text files but they are too big to post here.
>>>>>>>>
>>>>>>>> When I looked up the post command in RunRev it says it is part of
>>>>>>>> the internet library, however I can't find any source code for this. Is it
>>>>>>>> available? I'd like to add some trace information so I can see if this
>>>>>>>> library is being passed the whole block and if so why is it going wrong on
>>>>>>>> this block.
>>>>>>>>
>>>>>>>> Is there another way to do this in RunRev? e.g. A alternative to the
>>>>>>>> "post" command?
>>>>>>>>
>>>>>>>> Any ideas or suggestions on how to fix or even get a handle of this
>>>>>>>> problem would be greatly appreciated.
>>>>>>>>
>>>>>>>> All the Best
>>>>>>>> Dave
>>>>>>>>
>>>>>>>> ------
>>>>>>>>
>>>>>>>> I read records from a database, format them, and add them to a block
>>>>>>>> of data. There is a blocking factor variable, it is set to 200, so I read
>>>>>>>> 200 records from the database, block them into one big block and send it to
>>>>>>>> the server via a "post" command. The Server then sends a response which can
>>>>>>>> be variable in length, the response is in XML format. This process works
>>>>>>>> well 99% of the time, but sometimes, (and this can be reproduced if the
>>>>>>>> right data (or the wrong data in this case!) is present in the database).
>>>>>>>> When this happens the response from the server is truncated in the middle of
>>>>>>>> an XML node. As far as I can tell the difference is that by chance, a group
>>>>>>>> of 200 records has caused the response to be over a certain size.
>>>>>>>>
>>>>>>>> If I set the BlockingFactor to 50, the problem goes away, but this
>>>>>>>> causes a major slowdown.
>>>>>>>>
>>>>>>>> ------
>>>>>>>>
>>>>>>>> It is sending one block at a time, each block contains N records.
>>>>>>>> There are around 10,500 records in the database.
>>>>>>>>
>>>>>>>> Each record has an XML node in the reply, depending on the content
>>>>>>>> of the record sent, it will return different data of variable size. It
>>>>>>>> appears if the block returned is greater than a certain size, it is
>>>>>>>> truncated.
>>>>>>>>
>>>>>>>> Basically the process is:
>>>>>>>>
>>>>>>>> repeat for all Records in Database
>>>>>>>> Read Record From Database
>>>>>>>> Encode as XML
>>>>>>>> Add to end of SendDataBlock
>>>>>>>>
>>>>>>>> if the number of records in SendDataBloack > SendBlockingFactor then
>>>>>>>>  post SendDataBlock
>>>>>>>>  get response
>>>>>>>>  process response
>>>>>>>>  put empty into SendDataBlock
>>>>>>>> end if
>>>>>>>>
>>>>>>>> end repeat
>>>>>>>>
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> use-revolution mailing list
>>>>>>>> use-revolution at lists.runrev.com
>>>>>>>> Please visit this url to subscribe, unsubscribe and manage your
>>>>>>>> subscription preferences:
>>>>>>>> http://lists.runrev.com/mailman/listinfo/use-revolution
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> use-revolution mailing list
>>>>>>> use-revolution at lists.runrev.com
>>>>>>> Please visit this url to subscribe, unsubscribe and manage your
>>>>>>> subscription preferences:
>>>>>>> http://lists.runrev.com/mailman/listinfo/use-revolution
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> use-revolution mailing list
>>>>>> use-revolution at lists.runrev.com
>>>>>> Please visit this url to subscribe, unsubscribe and manage your
>>>>>> subscription preferences:
>>>>>> http://lists.runrev.com/mailman/listinfo/use-revolution
>>>>>
>>>>> _______________________________________________
>>>>> use-revolution mailing list
>>>>> use-revolution at lists.runrev.com
>>>>> Please visit this url to subscribe, unsubscribe and manage your
>>>>> subscription preferences:
>>>>> http://lists.runrev.com/mailman/listinfo/use-revolution
>>>>
>>>>
>>>> _______________________________________________
>>>> use-revolution mailing list
>>>> use-revolution at lists.runrev.com
>>>> Please visit this url to subscribe, unsubscribe and manage your
>>>> subscription preferences:
>>>> http://lists.runrev.com/mailman/listinfo/use-revolution
>>>
>>> _______________________________________________
>>> use-revolution mailing list
>>> use-revolution at lists.runrev.com
>>> Please visit this url to subscribe, unsubscribe and manage your
>>> subscription preferences:
>>> http://lists.runrev.com/mailman/listinfo/use-revolution
>>
>>
>> _______________________________________________
>> use-revolution mailing list
>> use-revolution at lists.runrev.com
>> Please visit this url to subscribe, unsubscribe and manage your
>> subscription preferences:
>> http://lists.runrev.com/mailman/listinfo/use-revolution
>
> _______________________________________________
> use-revolution mailing list
> use-revolution at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your subscription
> preferences:
> http://lists.runrev.com/mailman/listinfo/use-revolution
>



-- 
http://www.andregarzia.com All We Do Is Code.



More information about the use-livecode mailing list