<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none"><!--P{margin-top:0;margin-bottom:0;} p
        {margin-top:0;
        margin-bottom:0}--></style>
</head>
<body dir="ltr" style="font-size:12pt;color:#000000;background-color:#FFFFFF;font-family:Calibri,Arial,Helvetica,sans-serif;">
<p>Hi Mark,</p>
<p>this is my first post.</p>
<p>I'm using your XML::Compile (superb) Library quite a long time now, and stumpled upon
</p>
<p>XML::Compile::Transport::SOAPHTTP_MojoUA last year.</p>
<p>It's very outdated so i patched it to use Mojo::Promise and Mojo::IOLoop::Delay to get flow control over the use of Non-Blocking I/O.</p>
<p>The<span style="color:black">&nbsp;current release don't&nbsp;take advantage&nbsp;of the&nbsp;latest version&nbsp;of Mojolicious which has got improvements&nbsp;over the last 2 years !<br>
</span></p>
<p><span style="color:black">Perhaps&nbsp;you&nbsp;want consider an update&nbsp;to use&nbsp;promises and the&nbsp;delay loop ?<br>
</span></p>
<p><span style="color:black"><br>
</span></p>
<p><span style="color:black">Anyhow, right now, i patched the version you provide and added:<br>
</span></p>
<p><span style="color:black"><br>
</span></p>
<p><span style="color:black">_prepare_call sync req:<br>
</span></p>
<p><span style="color:black"># async call<br>
&nbsp; sub {<br>
&nbsp;&nbsp;&nbsp; my ($content, $trace, $mtom, $callback) = @_;<br>
&nbsp;&nbsp;&nbsp; my $promise = Mojo::IOLoop-&gt;delay;<br>
</span></p>
<p><span style="color:black"><br>
</span></p>
<p><span style="color:black">start ua (promises):<br>
</span></p>
<p><span style="color:black"><br>
</span></p>
<p><span style="color:black">$ua-&gt;start(<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $tx =&gt; sub {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my ($ua, $tx) = @_;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my $err = $tx-&gt;error;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $promise-&gt;resolve($tx) if !$err || $err-&gt;{code};<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $promise-&gt;reject($err-&gt;{message});<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $handler-&gt;($tx);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp; );<br>
&nbsp; return $promise;<br>
</span></p>
<p><span style="color:black">};<br>
</span></p>
<p><span style="color:black"><br>
</span></p>
<p><span style="color:black">Demo script (HWG SMS Modem):<br>
</span></p>
<p><span style="color:black"><br>
</span></p>
<p><span style="color:black">#!/usr/bin/env perl<br>
<br>
use Mojo::Base -strict;<br>
</span></p>
<p><span style="color:black">use Mojo::Util qw(dumper b64_encode);<br>
use Mojo::IOLoop::Delay;<br>
use XML::Compile::WSDL11;<br>
use XML::Compile::SOAP11;&nbsp;&nbsp;&nbsp; # use SOAP version 1.1<br>
use XML::Compile::Transport::SOAPHTTP_MojoUA;<br>
<br>
#use Log::Report mode =&gt; 'DEBUG';&nbsp;&nbsp;&nbsp; # or 'VERBOSE'<br>
<br>
sub soap {<br>
&nbsp; my $username&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = q{api};<br>
&nbsp; my $password&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = q{xxxxxxxxxxxxxxxxxxxxx};<br>
&nbsp; my $authorization = sprintf(&quot;Basic %s&quot;, b64_encode(qq{$username:$password}));<br>
&nbsp; my $wsdl&nbsp; = XML::Compile::WSDL11-&gt;new(q{/etc/hwg-sms-gateway/wsdl/hwg.wsdl});<br>
&nbsp; my $trans = XML::Compile::Transport::SOAPHTTP_MojoUA-&gt;new(<br>
&nbsp;&nbsp;&nbsp; connect_timeout =&gt; 2,<br>
&nbsp;&nbsp;&nbsp; request_timeout =&gt; 2,<br>
&nbsp;&nbsp;&nbsp; address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&gt; q{http://10.1.1.1/service.xml}<br>
&nbsp; );<br>
&nbsp; return $wsdl-&gt;compileCalls(<br>
&nbsp;&nbsp;&nbsp; transport&nbsp;&nbsp;&nbsp;&nbsp; =&gt; $trans,<br>
&nbsp;&nbsp;&nbsp; async&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&gt; 1,<br>
&nbsp;&nbsp;&nbsp; method&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =&gt; q{POST},<br>
&nbsp;&nbsp;&nbsp; user_agent&nbsp;&nbsp;&nbsp; =&gt; qq{SMS-Agent/1.0},<br>
&nbsp;&nbsp;&nbsp; authorization =&gt; $authorization<br>
&nbsp; );<br>
}<br>
<br>
sub start {<br>
&nbsp; my $wsdl = soap();<br>
&nbsp; my $d&nbsp;&nbsp;&nbsp; = Mojo::IOLoop::Delay-&gt;new;<br>
<br>
&nbsp; $d-&gt;steps(<br>
&nbsp;&nbsp;&nbsp; sub {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my $delay&nbsp;&nbsp; = shift;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my $cb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = $delay-&gt;begin;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my $promise = $wsdl-&gt;call(<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QueueStatus =&gt; {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Queue&nbsp;&nbsp;&nbsp;&nbsp; =&gt; q{GsmIn},<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _callback =&gt; sub {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my ($xmlout, $trace) = @_;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $delay-&gt;pass($xmlout);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $cb-&gt;();<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; );<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $promise-&gt;then(sub {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my $promise = shift;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; })-&gt;catch(sub {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my $err = shift;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(STDERR &quot;ERROR: %s\n&quot;, dumper $err);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; })-&gt;wait;<br>
&nbsp;&nbsp;&nbsp; },<br>
<br>
&nbsp;&nbsp;&nbsp; sub {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my ($delay, $result) = @_;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;DELAY LAST RECEIVED: %s\n&quot;, dumper $result);<br>
&nbsp;&nbsp;&nbsp; }<br>
&nbsp; )-&gt;wait;<br>
}<br>
<br>
start();<br>
<br>
1;<br>
</span></p>
<p><span style="color:black"><br>
</span></p>
<p><span style="color:black">Produces:<br>
</span></p>
<p><span style="color:black">DELAY LAST RECEIVED: {<br>
&nbsp; &quot;response&quot; =&gt; {<br>
&nbsp;&nbsp;&nbsp; &quot;Cnt&quot; =&gt; 0,<br>
&nbsp;&nbsp;&nbsp; &quot;IdSet&quot; =&gt; {},<br>
&nbsp;&nbsp;&nbsp; &quot;Max&quot; =&gt; 25,<br>
&nbsp;&nbsp;&nbsp; &quot;Missed&quot; =&gt; 0,<br>
&nbsp;&nbsp;&nbsp; &quot;Rslt&quot; =&gt; 0<br>
&nbsp; }<br>
}<br>
</span></p>
<p><span style="color:black"><br>
</span></p>
<p><span style="color:black">I would be great to have a state of the art version of this module.<br>
</span></p>
<p><span style="color:black">What i also needs is a option (extra_opts) to add custom headers to the request which can be parsed by the Mojo::Promise object.<br>
</span></p>
<p><span style="color:black">When using multiple concurrent promises, you cannot tell what have been called but to examine $tx-res-&gt;headers !<br>
</span></p>
<p><span style="color:black">Which i did, i use it in a production env for one year now.<br>
</span></p>
<p><span style="color:black">To be consistent, i only wanted to inform you about the changes in Mojolicious and what can be accomplished nowadways.<br>
</span></p>
<p><span style="color:black"><br>
</span></p>
<span style="color:black">Kind regards Franz</span>
</body>
</html>