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,@theSoapReply,@theSoapRespons
e
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
[email protected]
Please visit this url to subscribe, unsubscribe and manage
your subscription preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution
_______________________________________________
use-revolution mailing list
[email protected]
Please visit this url to subscribe, unsubscribe and manage
your subscription preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution
_______________________________________________
use-revolution mailing list
[email protected]
Please visit this url to subscribe, unsubscribe and manage your
subscription preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution
_______________________________________________
use-revolution mailing list
[email protected]
Please visit this url to subscribe, unsubscribe and manage your
subscription preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution
_______________________________________________
use-revolution mailing list
[email protected]
Please visit this url to subscribe, unsubscribe and manage your
subscription preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution
_______________________________________________
use-revolution mailing list
[email protected]
Please visit this url to subscribe, unsubscribe and manage your
subscription preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution
_______________________________________________
use-revolution mailing list
[email protected]
Please visit this url to subscribe, unsubscribe and manage your
subscription preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution
_______________________________________________
use-revolution mailing list
[email protected]
Please visit this url to subscribe, unsubscribe and manage your subscription
preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution