CPAN::Forum
SOAP-Lite - SOAP with Attachments not supported?
| Posted on Tue Aug 19 15:17:27 2008 by bobdolebananaphone |
| SOAP with Attachments not supported? |
|
Quick prefix which could make it so that you don't have to answer the long question: does "Supports single/multipart MIME attachment (parsing side only)." mean that a SOAP::Lite client can't send SwA? The longer question is why the following doesn't work.
I have a SOAP::Lite client and a gSOAP server. I want to send a MIME file from one to the other. Here's the message I sent to the gSOAP list:
------------------------------------------------------
I am trying to send a MIME encoded file from a SOAP::Lite client to a
gSOAP server, but the server is giving me the following error which I
don't understand, since I'm not that experienced with SOAP:Error 6 fault: SOAP-ENV:Client [no subcode]
"No XML element tag"
Detail: [no detail]
The following is the command I run (I include the source at the end
incase the raw messages don't show an obvious error)
$ ./MIMEsend.pl soapcpp2.exe
Calling client setupSOAP::Transport::new: ()
SOAP::Serializer::new: ()
SOAP::Deserializer::new: ()
SOAP::Parser::new: ()
SOAP::Lite::new: ()
SOAP::Transport::HTTP::Client::new: ()Calling sendMIMESOAP::Data::new: ()
SOAP::Lite::call: ()
SOAP::Serializer::envelope: ()
SOAP::Serializer::envelope: sendMIME SOAP::Data=HASH(0x1075d488)
SOAP::Data::new: ()
SOAP::Data::new: ()
SOAP::Data::new: ()
SOAP::Data::new: ()
SOAP::Data::new: ()
SOAP::Transport::HTTP::Client::send_receive: HTTP::Request=HASH
(0x1060ece8)
SOAP::Transport::HTTP::Client::send_receive: POST
http://192.168.0.131:1234/ HTTP/1.1
Accept: text/xml
Accept: multipart/*
Accept: application/soap
Content-Length: 600620
Content-Type: Multipart/Related; type="text/xml";
start="<main_envelope>"; boundary="----------=_1219045514-2988-0"; cha
rset=utf-8
SOAPAction: "capture#sendMIME"This is a multi-part message in MIME format...------------=_121904551
+4-2988-0
Content-Type: text/xml
Content-Disposition: inline
Content-Location: /main_envelope
Content-ID: <main_envelope><?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope
xmlns:namesp1="capture" xmlns:SOAP-ENV="http://schemas.xmlsoap.
org/soap/envelope/"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsi="http://www.w3.org/2001/XMLSchem
a-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" SOAP-
ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encodin
g/"><SOAP-ENV:Body><namesp1:sendMIME><magicNumber
xsi:type="xsd:int">123</magicNumber></namesp1:sendMIME></SOAP-ENV:Body
></SOAP-ENV:Envelope>
------------=_1219045514-2988-0
Content-Type: application/exe; name="soapcpp2.exe"
Content-Disposition: attachment; filename="soapcpp2.exe"
Content-Transfer-Encoding: base64
MIME-Version: 1.0
X-Mailer: MIME-tools 5.427 (Entity 5.427)TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAA
+AA
...MIME FILE...
TkdQQURESU5HWFhQQURESU5H------------=_1219045514-2988-0--
SOAP::Transport::HTTP::Client::send_receive: HTTP::Response=HASH
(0x1076f8c8)
SOAP::Transport::HTTP::Client::send_receive: 500 read failed:
Connection reset by peer
Content-Type: text/plain
Client-Date: Mon, 18 Aug 2008 07:45:28 GMT
Client-Warning: Internal response500 read failed: Connection reset by peer
SOAP::Deserializer::deserialize: ()
SOAP::Parser::decode: ()
500 read failed: Connection reset by peer at ./MIMEsend.pl line 23
SOAP::Transport::HTTP::Client::DESTROY: ()
SOAP::Data::DESTROY: ()
SOAP::Data::DESTROY: ()
SOAP::Data::DESTROY: ()
SOAP::Parser::DESTROY: ()
SOAP::Transport::DESTROY: ()
SOAP::Serializer::DESTROY: ()
SOAP::Data::DESTROY: ()
SOAP::Data::DESTROY: ()
SOAP::Deserializer::DESTROY: ()
SOAP::Data::DESTROY: ()
SOAP::Lite::DESTROY: ()
So my first question would be, is it because of the "This is a multi-
part message in MIME format..."? Is that the thing missing the XML
element it's talking about? Because that's the only thing I can see that seems to differ from the SwA spec. So for the record, my gSOAP code looks like this (basically just the example code from the documentation):
int ns__sendMIME(struct soap *soap, int magicNumber, int &result){
struct soap_multipart * attachment;
for(attachment = soap->mime.list; attachment; attachment =
attachment->next){
printf("MIME attachment:\n");
printf("Memory=%p\n", (*attachment).ptr);
printf("Size=%ul\n", (*attachment).size);
printf("Encoding=%d\n", (int)(*attachment).encoding);
printf("Type=%s\n", (*attachment).type?
(*attachment).type:"null");
printf("ID=%s\n", (*attachment).id?
(*attachment).id:"null");
printf("Location=%s\n", (*attachment).location?
(*attachment).location:"null");
printf("Description=%s\n", (*attachment).description?
(*attachment).description:"null");
} printf("magicNumber = %#x\n", magicNumber);
if(magicNumber == 123){
result = 42;
}
else{
result = 0;
} return SOAP_OK;
}
My SOAP::Lite code looks like this:
#!perl
use SOAP::Lite +trace => 'all';
#use SOAP::Lite;
use SOAP::Lite::Packager;
use MIME::Entity;my $ent = build MIME::Entity
Type => "application/exe",
Path => $ARGV[0],
Filename => $ARGV[0],
Disposition => "attachment";print "\nCalling client setup\n\n";
$client = SOAP::Lite
-> packager(SOAP::Lite::Packager::MIME->new)
-> parts([$ent])
-> proxy('http://192.168.0.131:1234/')
-> ns('capture');print "\nCalling sendMIME\n\n";
$data = SOAP::Data->name(magicNumber => "123");
$result = $client->sendMIME($data);
#print "result = $result\n";
Thanks for any help you can give!
Bob
|
| Write a response |
(9)
]