Loading ...
Sorry, an error occurred while loading the content.

Re: SOAP::Lite and attachments...

Expand Messages
  • jpeyser
    I stand corrected; everything has been incorporated into SOAP::Lite (almost). So I tried to run the old examples from the SOAP-MIME package without using
    Message 1 of 12 , Oct 29, 2003
    • 0 Attachment
      I stand corrected; everything has been incorporated into SOAP::Lite
      (almost). So I tried to run the old examples from the SOAP-MIME
      package without using SOAP::MIME. The client side works fine. But the
      server side has a couple of problems.

      Here are the examples.

      #!/usr/local/bin/perl

      use SOAP::Lite +trace => qw(debug);
      use MIME::Entity;

      my $ent = build MIME::Entity
      Type => "image/gif",
      Encoding => "base64",
      Path => "m.gif",
      Filename => "m.gif",
      Disposition => "attachment";

      my @parts = ($ent);
      $SOME_HOST = 'http://localhost:8765';
      $SOME_NAMESPACE = 'SOAP_MIME_Test';


      my $som = SOAP::Lite
      ->readable(1)
      ->uri($SOME_NAMESPACE)
      ->proxy($SOME_HOST)
      ->parts(@parts)
      # ->parts([ $ent ])
      ->echo(SOAP::Data->name("whatToEcho" => "GREAT"));


      The old example has a couple of problems (maybe it is obsolete).
      First, the subroutine SOAP::SOM::parts that was introduced in the
      SOAP-MIME package was not added to SOAP::Lite. Second, after adding
      the parts routine, the result is different (there is an extra empty
      array).

      0 ARRAY(0x6a60e4)
      0 ARRAY(0xe250b8)
      empty array
      1 REF(0xe1d91c)
      -> MIME::Entity=HASH(0xe1da3c)
      'ME_Bodyhandle' => MIME::Body::InCore=HASH(0xe1daa8)
      'MBC_Data' => ARRAY(0xe12d94)



      Anyway, here is the modified code that works.

      #!/usr/local/bin/perl

      use SOAP::Lite;
      use SOAP::Transport::HTTP;

      my $port = shift || 8765;

      my $daemon = SOAP::Transport::HTTP::Daemon
      -> new ('LocalPort' => $port, 'Reuse' => 1)
      -> dispatch_to('SOAP_MIME_Test')
      -> handle();

      BEGIN {

      sub SOAP::SOM::parts {
      my $self = shift;
      @_ ? ($self->{_parts} = shift, return $self) : return $self->
      {_parts};
      }


      package SOAP_MIME_Test;
      use strict;
      use vars qw(@ISA);
      @ISA = qw(SOAP::Server::Parameters);

      sub echo {
      my $self = shift;
      my $envelope = pop;

      my $part = $envelope->parts->[1];
      # foreach my $part (@{$envelope->parts}) {
      print STDERR "Attachments.cgi: attachment found! (".ref
      ($$part).")\n";
      # }
      print STDERR "envelope is of type: " . ref($envelope) . "\n";
      print $envelope->body;
      my $STRING = $envelope->dataof("//echo/whatToEcho")
      or die SOAP::Fault->faultcode("Client")
      ->faultstring("You must specify a string to echo")
      ->faultactor('urn:SOAP_MIME_Test#echo');

      my $ent = build MIME::Entity
      'Id' => "<1234>",
      'Type' => "text/xml",
      'Path' => "hello.xml",
      'Filename' => "hello.xml",
      'Disposition' => "attachment";

      return SOAP::Data->name("whatToEcho" => $STRING);
      }
      }



      --- In soaplite@yahoogroups.com, "Byrne Reese" <byrne@m...> wrote:
      > Let me continue - you are correct, the functionality has been
      merged.
      > SOAP::Lite 0.60 should be more than sufficient for your needs.
      >
      > Would you mind sending some of your code samples and server
      config's? It
      > may help me track down your problem. Also - if you could put a
      trace on
      > the message payload (all I need to see is the MIME and SOAP
      stuff... by
      > all means, hide the attachment content if it is sensitive data.
      >
      > > I was under the impression that SOAP::Lite 0.60 (which is *still*
      not on
      > > CPAN!!!!!) did not require SOAP::MIME since that functionality
      had been
      > > integrated into the core.
      > >
      > > Tim
      > >
      > > --
      > > Tim Jenness
      > > JAC software
      > > http://www.jach.hawaii.edu/~timj
      > >
      > >

      >
      >
      > ^byrne :/
    • jigsaw9876
      Thanks for this fix. I have attachments working now. -JS
      Message 2 of 12 , Oct 30, 2003
      • 0 Attachment
        Thanks for this fix. I have attachments working now.

        -JS
      • jigsaw9876
        In the same context I have another silly question: The server returns data and an attachment like: return SOAP::Data- name( whatToEcho = $STRING),$ent; How
        Message 3 of 12 , Oct 31, 2003
        • 0 Attachment
          In the same context I have another silly question:
          The server returns data and an attachment like:
          return SOAP::Data->name("whatToEcho" => $STRING),$ent;
          How does the client recieve this?
          $som->result returns the SOAP::Data but how do I extract the MIME::entity bit??

          - JS
        • Byrne Reese
          The SOAP::SOM object returned by SOAP::Lite has a subroutine called parts - which contains the array of MIME::Entity objects. ... ^byrne :/
          Message 4 of 12 , Oct 31, 2003
          • 0 Attachment
            The SOAP::SOM object returned by SOAP::Lite has a subroutine called
            'parts' - which contains the array of MIME::Entity objects.

            >
            >
            >
            >
            > In the same context I have another silly question:
            > The server returns data and an attachment like:
            > return SOAP::Data-
            > How does the client recieve this?
            > $som-
            >
            > - JS
            >
            >
            >
            >
            >
            >
            >
            >
            >
            >
            > Yahoo! Groups Sponsor
            >
            >
            > ADVERTISEMENT
            >
            >
            >
            >
            >
            >
            >
            >
            >
            > To unsubscribe from this group, send an email to:
            > soaplite-unsubscribe@yahoogroups.com
            >
            >
            >
            >
            >
            > Your use of Yahoo! Groups is subject to the Yahoo! Terms of Service.
            >
            >
            >
            >
            >


            ^byrne :/
          • jpeyser
            OK!!!!!! Finally found the problem. I stand corrected a second time. The parts subroutine is defined in SOAP::SOM, but it has a bug. for my $method (qw(parts))
            Message 5 of 12 , Oct 31, 2003
            • 0 Attachment
              OK!!!!!!

              Finally found the problem. I stand corrected a second time.
              The parts subroutine is defined in SOAP::SOM, but it has a bug.

              for my $method (qw(parts)) {
              my $field = '_' . $method;
              *$method = sub {
              ### my $self = shift->new;
              my $self = shift;
              @_ ? ($self->{$field} = shift, return $self) : return $self->
              {$field};
              }
              }

              (The parts subroutine was defined in a new instance of SOAP::SOM.)


              A second problem in package SOAP::MIMEParser.

              sub decode {
              my $self = shift;
              my $entity = eval { $self->parse_data(shift) }
              or die "Something wrong with MIME message: @{[$@ || $self-
              >last_error]}\n";

              # initialize with empty array; autovivification doesn't work in
              this case --PK
              ### $self->parts([]) if $entity->parts;
              $self->{_parts} = [] if $entity->parts;

              (This was initializing the array with an empty array
              as it's first element.)

              --- In soaplite@yahoogroups.com, "Byrne Reese" <byrne@m...> wrote:
              > The SOAP::SOM object returned by SOAP::Lite has a subroutine called
              > 'parts' - which contains the array of MIME::Entity objects.
              >
              > >
              > >
              > >
              > >
              > > In the same context I have another silly question:
              > > The server returns data and an attachment like:
              > > return SOAP::Data-
              > > How does the client recieve this?
              > > $som-
              > >
              > > - JS
              > >
              > >
              > >
              > >
              > >
              > >
              > >
              > >
              > >
              > >
              > > Yahoo! Groups Sponsor
              > >
              > >
              > > ADVERTISEMENT
              > >
              > >
              > >
              > >
              > >
              > >
              > >
              > >
              > >
              > > To unsubscribe from this group, send an email to:
              > > soaplite-unsubscribe@yahoogroups.com
              > >
              > >
              > >
              > >
              > >
              > > Your use of Yahoo! Groups is subject to the Yahoo! Terms of
              Service.
              > >
              > >
              > >
              > >
              > >
              >
              >
              > ^byrne :/
            • techrg99
              Here is a complete and working example of attachemnt download: Here is the server side - MIME_Test.pm - I am using Apache/mod_perl server: package MIME_Test;
              Message 6 of 12 , Nov 4, 2003
              • 0 Attachment
                Here is a complete and working example of attachemnt download:
                Here is the server side - MIME_Test.pm - I am using Apache/mod_perl
                server:

                package MIME_Test;

                use strict;
                use SOAP::Lite;
                use MIME::Entity;
                use IO::File;
                use Digest::MD5 qw(md5_base64);

                use vars qw(@ISA);
                @ISA = qw(SOAP::Server::Parameters);

                sub echo3 {
                my $self = shift;
                my $envelope = pop;
                my ($info, $md5_check) = @_;

                my $file = "/usr/local/jci/gim/tmp/anim.gif";

                my $ent = MIME::Entity->build(Type => "image/gif",
                Encoding => "base64",
                Path => $file,
                Filename => "anim.gif",
                Disposition => "attachment",
                Mode => 1);

                my $checksum = `GET_CHECKSUM.pl $file`;

                return SOAP::Data->name("checksum" => $checksum), $ent;
                }


                where $checksum is a MD5 checksum - this is not really needed but I
                threw it in my example - here is the code for GET_CHECKSUM.pl and the
                reason I wrote it is because if I call this in the echo3 code
                directly, I do not get the correct checksum - not sure where the
                conflict is, but if anyone can advise on this - I would greatly
                appreciate it...

                # GET_CHECKSUM.pl:
                use strict;
                use Digest::MD5 qw(md5_base64);

                my $checksum = "";
                if(open(FILE, $ARGV[0])) {
                binmode(FILE);
                $checksum = md5_base64(*FILE);
                close FILE;
                }
                print $checksum;




                Here is the client side:


                use strict;
                use SOAP::Lite +trace => qw(debug);
                use MIME::Entity;
                use Digest::MD5 qw(md5 md5_hex md5_base64);

                my $soap = SOAP::Lite
                -> readable(1)
                -> uri("http://$host:$port/MIME_Test")
                -> proxy("http://$host:$port/$proxy");

                my $som = $soap->echo3;
                my $part = $som->parts->[0];

                my $checksum = $som->result;

                print "SOAP = $soap\n";
                print "SOM = $som\n";
                print "SOM REF = " . ref($som->parts) . "\n";
                print "PART = $part\n";
                print "CHECKSUM= $checksum\n";

                my $bh;
                my $io;
                my $buf;

                open FILE, "> anim3.gif";
                binmode FILE;

                if($bh = $$part->bodyhandle) {
                $io = $bh->open;

                while($io->read($buf, 1024)) {
                print FILE $buf;
                }

                $io->close;
                }

                my $checksum2 = md5_base64(*FILE);
                close FILE;

                print "CHECKSUM= $checksum2\n";

















                --- In soaplite@yahoogroups.com, "Byrne Reese" <byrne@m...> wrote:
                > The SOAP::SOM object returned by SOAP::Lite has a subroutine called
                > 'parts' - which contains the array of MIME::Entity objects.
                >
                > >
                > >
                > >
                > >
                > > In the same context I have another silly question:
                > > The server returns data and an attachment like:
                > > return SOAP::Data-
                > > How does the client recieve this?
                > > $som-
                > >
                > > - JS
                > >
                > >
                > >
                > >
                > >
                > >
                > >
                > >
                > >
                > >
                > > Yahoo! Groups Sponsor
                > >
                > >
                > > ADVERTISEMENT
                > >
                > >
                > >
                > >
                > >
                > >
                > >
                > >
                > >
                > > To unsubscribe from this group, send an email to:
                > > soaplite-unsubscribe@yahoogroups.com
                > >
                > >
                > >
                > >
                > >
                > > Your use of Yahoo! Groups is subject to the Yahoo! Terms of Service.
                > >
                > >
                > >
                > >
                > >
                >
                >
                > ^byrne :/
              • Byrne Reese
                Thank you for finding this patch. I have made the changes to the source base, and am checking them in now. This will go out in the next release. ... ^byrne :/
                Message 7 of 12 , Nov 12, 2003
                • 0 Attachment
                  Thank you for finding this patch. I have made the changes to the source
                  base, and am checking them in now. This will go out in the next release.
                  >
                  >
                  >
                  >
                  > OK!!!!!!
                  >
                  > Finally found the problem. I stand corrected a second time.
                  > The parts subroutine is defined in SOAP::SOM, but it has a bug.
                  >
                  > for my $method (qw(parts)) {
                  > my $field = '_' . $method;
                  > *$method = sub {
                  > ### my $self = shift-


                  ^byrne :/
                Your message has been successfully submitted and would be delivered to recipients shortly.