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

Re: SOAP-call without doing HTTP

Expand Messages
  • jpeyser
    Marten, The following program solves the first part of your dilemma. This will create the XML code for each request without sending out anything. Jonathan
    Message 1 of 3 , Sep 10, 2002
    • 0 Attachment
      Marten,
      The following program solves the first part of your dilemma. This
      will create the XML code for each request without sending out
      anything.

      Jonathan

      #!/usr/local/bin/perl -w

      # -- SOAP::Lite -- guide.soaplite.com -- Copyright (C) 2001 Paul
      Kulchenko --
      # My packages by J. Peyser

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


      sub BEGIN {
      package My::Transport;

      @ISA = qw(SOAP::Transport);

      ### Sub proxy redefined to eliminate lines searching for transport
      module.
      sub proxy {
      my $self = shift->new;
      my $class = ref $self;

      return $self->{_proxy} unless @_;
      $_[0] =~ /^(\w+):/ or die "proxy: transport protocol not
      specified\n";
      my $protocol = uc "$1"; # untainted now
      # https: should be done through Transport::HTTP.pm
      for ($protocol) { s/^HTTPS$/HTTP/ }

      (my $protocol_class = "${class}::$protocol") =~ s/-/_/g;
      no strict 'refs';
      unless (defined %{"$protocol_class\::Client::"} &&
      UNIVERSAL::can("$protocol_class\::Client" => 'new')) {
      # eval "require $protocol_class";
      # die "Unsupported protocol '$protocol'\n" if $@ =~ m!
      ^Can't locate SOAP/Transport/!;
      # die if $@;
      }
      $protocol_class .= "::Client";
      return $self->{_proxy} = $protocol_class->new(endpoint => shift,
      @_);
      }


      package My::Transport::HTTP::Client;

      @ISA = qw(SOAP::Transport::HTTP::Client);
      @xml = ();

      ### Sub send_receive redefined to bypass HTTP or any other transport
      protocol.
      sub send_receive {
      my($self, %parameters) = @_;
      my($envelope, $endpoint, $action, $encoding) =
      @parameters{qw(envelope endpoint action encoding)};

      push @xml, $envelope;
      $self->is_success(1);

      return;
      }

      } #End BEGIN


      die "Usage: $0 <symbol>...\n" unless $#ARGV > -1;

      my ($domain, $soap, $code, $msg, $message);

      $soap = SOAP::Lite
      -> uri('DomainTools')
      -> transport(My::Transport->new)
      -> proxy('http://soap.variomedia.de/public/');

      while ($domain = shift) {

      $soap->getDomainStatus($domain);
      # ($code, $message) = @{$soap->getDomainStatus($domain)-
      >result};
      # print "$domain: [$code] [$msg]";

      }

      foreach (@My::Transport::HTTP::Client::xml) {print $_, "\n";};


      --- In soaplite@y..., Marten Lehmann <lehmann@c...> wrote:
      > Hello,
      >
      > I'd like to change the following code so that SOAP::Lite generates
      the
      > xml-message, but doesn't post them. Instead I want to do the
      > http-connection handling and feed SOAP::Lite with the response I
      get.
      >
      > use SOAP::Lite;
      > use strict;
      >
      > my ($domain, $soap, $code, $msg);
      >
      > $soap = SOAP::Lite
      > -> uri('DomainTools')
      > -> proxy('http://soap.variomedia.de/public/');
      >
      > $domain = shift @ARGV;
      > ($code, $message) = @{$soap->getDomainStatus($domain)->result};
      > print "$domain: [$code] [$msg]";
      >
      > Wherefor I need this is as follows: I want to do several SOAP-calls
      at
      > the same time, but with SOAP::Lite I have to wait until I receive a
      > response for the current SOAP-call. So I want to syswrite the
      > xml-message on my own to the http-servers and sysread the responses
      as
      > they come - nonblocked of course. After fully retrieved the
      response I
      > again want to use SOAP::Lite to do the parsing.
      >
      > Regards
      > Marten
    Your message has been successfully submitted and would be delivered to recipients shortly.