Michael, 

I find the descriptions in [ 
https://mojolicious.org/perldoc/Mojo/UserAgent/Transactor#tx | 
https://mojolicious.org/perldoc/Mojo/UserAgent/Transactor#tx ] pretty helpful 

cheers 
tobi 

----- On May 14, 2020, at 2:06 PM, 'Michael Lackhoff' via Mojolicious 
<mojolicious@googlegroups.com> wrote: 

> Well, the easiest solution would be to just use curl.
> But M::U is a powerful tool I find myself using it more and more and I would
> like to better understand such tools.
> It looks great but if it has some severe shortcomings I want to know before
> doing lots of mission critical stuff with it.

> But thanks for your suggestion. It is always good to know further options.
> -Michael

> Am Donnerstag, 14. Mai 2020 13:47:41 UTC+2 schrieb Felipe Gasper:
>> FWIW, you can use libcurl with Mojo via Net::Curl::Promiser::Mojo. That may 
>> be
>> your easiest solution?

>> -FG

>>> On May 14, 2020, at 07:38, 'Michael Lackhoff' via Mojolicious <
>>> mojol...@googlegroups.com > wrote:

>>> Am 14.05.2020 um 05:08 schrieb Stefan Adams:

>>>> > I'm certain you'll be able to accomplish this with M::UA. Can you share

>>> Just to reduce complexity I changed everything to plain HTTP, so no SSL,
>>> keys or certificates.

>>>> > what the HTML error produced is?

>>> It is not really a normal error page, just a page from the UI. The most
>>> relevant lines are these:
>>> <p class="ErrorMsg">Invalid variable name.</p>
>>> <p>Wiederholen Sie das Update oder starten Sie die FRITZ!Box neu.</p>
>>> [German for: repeat the update(sic! I wanted to backup the box, not
>>> update) or restart your FRITZ!Box]

>>>> > Can you share the output that you are comparing that you are noticing is 
>>>> > so
>>>> > similar between curl and M::UA? You're using -v for curl. Also set the
>>>> > MOJO_CLIENT_DEBUG env variable to 1.

>>> Here is what curl gives (with --trace-ascii):
>>> => Send header, 200 bytes (0xc8)
>>> 0000: POST /cgi-bin/firmwarecfg HTTP/1.1
>>> 0024: Host: fritz.box
>>> 0035: User-Agent: curl/7.58.0
>>> 004e: Accept: */*
>>> 005b: Content-Length: 370
>>> 0070: Content-Type: multipart/form-data; boundary=--------------------
>>> 00b0: ----565a580ebeb0c567
>>> 00c6:
>>> => Send data, 370 bytes (0x172)
>>> 0000: --------------------------565a580ebeb0c567
>>> 002c: Content-Disposition: form-data; name="sid"
>>> 0058:
>>> 005a: 4e240384c30c909d
>>> 006c: --------------------------565a580ebeb0c567
>>> 0098: Content-Disposition: form-data; name="ImportExportPassword"
>>> 00d5:
>>> 00d7: backup
>>> 00df: --------------------------565a580ebeb0c567
>>> 010b: Content-Disposition: form-data; name="ConfigExport"
>>> 0140:
>>> 0142:
>>> 0144: --------------------------565a580ebeb0c567--
>>> <= Recv header, 17 bytes (0x11)
>>> 0000: HTTP/1.1 200 OK

>>>> > See how it works comparing curl to:

>>>> >    $ env MOJO_CLIENT_DEBUG=1 mojo get -v -M POST -f sid=$SID -f
>>>> > ImportExportPassword=$BAKPWD -f ConfigExport= http
>>>>> ://fritz.box/cgi-bin/firmwarecfg [ http://fritz.box/cgi-bin/firmwarecfg |
>>>> > <http://fritz.box/cgi-bin/firmwarecfg> ]

>>> The empty ConfigExport parameter gets lost with this command and the
>>> Content-Type is different:

>>> -- Blocking request ( [ http://fritz.box/cgi-bin/firmwarecfg |
>>> http://fritz.box/cgi-bin/firmwarecfg ] )
>>> -- Connect 7c84d2d7396d9d2ff9571982f73240cb ( [ http://fritz.box/ |
>>> http://fritz.box:80 ] )
>>> -- Client >>> Server ( [ http://fritz.box/cgi-bin/firmwarecfg |
>>> http://fritz.box/cgi-bin/firmwarecfg ] )
>>> POST /cgi-bin/firmwarecfg HTTP/1.1\x0d
>>> Content-Length: 48\x0d
>>> User-Agent: Mojolicious (Perl)\x0d
>>> Accept-Encoding: gzip\x0d
>>> Content-Type: application/x-www-form-urlencoded\x0d
>>> Host: fritz.box\x0d
>>> \x0d
>>> ImportExportPassword=backup&sid=4e240384c30c909d
>>> -- Client >>> Server ( [ http://fritz.box/cgi-bin/firmwarecfg |
>>> http://fritz.box/cgi-bin/firmwarecfg ] )

>>> -- Client <<< Server ( [ http://fritz.box/cgi-bin/firmwarecfg |
>>> http://fritz.box/cgi-bin/firmwarecfg ] )
>>> HTTP/1.1 200 OK\x0d

>>> With DEBUG on and my code (s. my original message and below) I get this:

>>> -- Client >>> Server ( [ http://fritz.box/cgi-bin/firmwarecfg |
>>> http://fritz.box/cgi-bin/firmwarecfg ] )
>>> POST /cgi-bin/firmwarecfg HTTP/1.1\x0d
>>> Accept-Encoding: gzip, deflate\x0d
>>> Content-Type: multipart/form-data; boundary=tyUPX\x0d
>>> Accept: */*\x0d
>>> Host: fritz.box\x0d
>>> Content-Length: 230\x0d
>>> User-Agent: Mojolicious (Perl)\x0d
>>> \x0d
>>> --tyUPX\x0d

>>> -- Client >>> Server ( [ http://fritz.box/cgi-bin/firmwarecfg |
>>> http://fritz.box/cgi-bin/firmwarecfg ] )
>>> Content-Disposition: form-data; name="ConfigExport"\x0d
>>> \x0d

>>> -- Client >>> Server ( [ http://fritz.box/cgi-bin/firmwarecfg |
>>> http://fritz.box/cgi-bin/firmwarecfg ] )
>>> \x0d
>>> --tyUPX\x0d

>>> -- Client >>> Server ( [ http://fritz.box/cgi-bin/firmwarecfg |
>>> http://fritz.box/cgi-bin/firmwarecfg ] )
>>> Content-Disposition: form-data; name="ImportExportPassword"\x0d
>>> \x0d

>>> -- Client >>> Server ( [ http://fritz.box/cgi-bin/firmwarecfg |
>>> http://fritz.box/cgi-bin/firmwarecfg ] )
>>> backup
>>> -- Client >>> Server ( [ http://fritz.box/cgi-bin/firmwarecfg |
>>> http://fritz.box/cgi-bin/firmwarecfg ] )
>>> \x0d
>>> --tyUPX\x0d

>>> -- Client >>> Server ( [ http://fritz.box/cgi-bin/firmwarecfg |
>>> http://fritz.box/cgi-bin/firmwarecfg ] )
>>> Content-Disposition: form-data; name="sid"\x0d
>>> \x0d

>>> -- Client >>> Server ( [ http://fritz.box/cgi-bin/firmwarecfg |
>>> http://fritz.box/cgi-bin/firmwarecfg ] )
>>> 33cb272bcd34940b
>>> -- Client >>> Server ( [ http://fritz.box/cgi-bin/firmwarecfg |
>>> http://fritz.box/cgi-bin/firmwarecfg ] )
>>> \x0d
>>> --tyUPX--\x0d

>>> -- Client >>> Server ( [ http://fritz.box/cgi-bin/firmwarecfg |
>>> http://fritz.box/cgi-bin/firmwarecfg ] )

>>> -- Client <<< Server ( [ http://fritz.box/cgi-bin/firmwarecfg |
>>> http://fritz.box/cgi-bin/firmwarecfg ] )
>>> HTTP/1.1 200 OK\x0d

>>> which for me looks very much the same as the curl version but as I said,
>>> curl gives the backup file whereas M::U just gives the HTML page back,
>>> indicating that something went wrong.
>>> I can only spot very minor differences that is why I am running out of
>>> ideas:
>>> - the boundary used by M::U is quite short
>>> - the form parameters are not in the same order
>>> - Accept-Encoding header (is also sent from Firefox where it works)
>>> - the different SID is normal (my script always makes a fresch login)

>>> Looks very strange to me
>>> -Michael

>>>> > On Wed, May 13, 2020, 4:56 PM 'Michael Lackhoff' via Mojolicious <
>>>> > mojol...@googlegroups.com > wrote:


>>>>> >> I had quite a bit of success recently using Mojo::UserAgent so I tried 
>>>>> >> to
>>>>> >> replace a curl command to do a backup of my Fritz.box router with M::U.

>>>>> >> Here is the curl command:
>>>>> >> curl -s -k -o $OUT --form sid=$SID --form ImportExportPassword=$BAKPWD 
>>>>> >> \
>>>>>>>         --form ConfigExport= [ http://fritz.box/cgi-bin/firmwarecfg |
>>>>> >>         http://fritz.box/cgi-bin/firmwarecfg ] >>
>>>>> >> It should be equivalent to this M::U request:

>>>>> >> my $tx = $ua->build_tx(
>>>>>>>     POST => ' [ http://fritz.box/cgi-bin/firmwarecfg |
>>>>> >>     http://fritz.box/cgi-bin/firmwarecfg ] ' =>
>>>>> >>         {
>>>>> >>             'Accept'       => '*/*',
>>>>> >>             'Content-Type' => 'multipart/form-data',
>>>>> >>         } => form => {
>>>>> >>             sid                  => $SID,
>>>>> >>             ImportExportPassword => $BAKPWD,
>>>>> >>             ConfigExport         => '',
>>>>> >>     }
>>>>> >> );

>>>>> >> # for debugging:
>>>>> >> print $tx->req->to_string;

>>>>> >> $tx = $ua->start($tx);
>>>>> >> $tx->res->save_to($OUT);

>>>>> >> As far as I can tell both the headers and the POST body is very much 
>>>>> >> the
>>>>> >> same (except the boundary value to separate the form fields) but to my
>>>>> >> surprise the curl command works ($OUT is the backup file) but with the 
>>>>> >> M::U
>>>>> >> version $OUT consists of some HTML output indicating an error.

>>>>> >> If I could see a difference I could try to better adjust my script but 
>>>>> >> as
>>>>> >> I said, they look very much the same (I compared it with the -v and
>>>>> >> --trace-ascii output of curl), so I run out of ideas what could 
>>>>> >> trigger the
>>>>> >> differnt response of my Fritz.box.
>>>>> >> Any ideas? At the moment I just solve it by using the curl command with
>>>>> >> "system" but I would prefer a Perl-only solution and what is even more
>>>>> >> important to me: I want to understand what is going on here.

>>>>> >> -Michael

>>>>> >> --
>>>>> >> You received this message because you are subscribed to the Google 
>>>>> >> Groups
>>>>> >> "Mojolicious" group.
>>>>> >> To unsubscribe from this group and stop receiving emails from it, send 
>>>>> >> an
>>>>> >> email to mojol...@googlegroups.com .
>>>>> >> To view this discussion on the web visit
>>>>>>> [
>>>>>>> https://groups.google.com/d/msgid/mojolicious/14df452c-e7a4-4b7c-90a2-9e1f5e15becc%40googlegroups.com
>>>>>>> |
>>>>>>> https://groups.google.com/d/msgid/mojolicious/14df452c-e7a4-4b7c-90a2-9e1f5e15becc%40googlegroups.com
>>>>>>> ] >> [
>>>>>>> https://groups.google.com/d/msgid/mojolicious/14df452c-e7a4-4b7c-90a2-9e1f5e15becc%40googlegroups.com?utm_medium=email&utm_source=footer
>>>>>>> |
>>>>>>> <https://groups.google.com/d/msgid/mojolicious/14df452c-e7a4-4b7c-90a2-9e1f5e15becc%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>> >> ] >> .




>>> --
>>> You received this message because you are subscribed to the Google Groups
>>> "Mojolicious" group.
>>> To unsubscribe from this group and stop receiving emails from it, send an 
>>> email
>>> to mojol...@googlegroups.com .
>>> To view this discussion on the web visit [
>>> https://groups.google.com/d/msgid/mojolicious/6bd73f2c-36ba-4a21-992d-b699fae6f158%40googlegroups.com?utm_medium=email&utm_source=footer
>>> |
>>> https://groups.google.com/d/msgid/mojolicious/6bd73f2c-36ba-4a21-992d-b699fae6f158%40googlegroups.com
>>> ] .

> --
> You received this message because you are subscribed to the Google Groups
> "Mojolicious" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email
> to [ mailto:mojolicious+unsubscr...@googlegroups.com |
> mojolicious+unsubscr...@googlegroups.com ] .
> To view this discussion on the web visit [
> https://groups.google.com/d/msgid/mojolicious/03a573c0-5df4-448c-9256-bb851abf7285%40googlegroups.com?utm_medium=email&utm_source=footer
> |
> https://groups.google.com/d/msgid/mojolicious/03a573c0-5df4-448c-9256-bb851abf7285%40googlegroups.com
> ] .

-- 
Tobi Oetiker, OETIKER+PARTNER AG, Aarweg 15 CH-4600 Olten, Switzerland 
www.oetiker.ch t...@oetiker.ch +41 62 775 9902 

-- 
You received this message because you are subscribed to the Google Groups 
"Mojolicious" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to mojolicious+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/mojolicious/1185346809.40923.1589458649675.JavaMail.zimbra%40oetiker.ch.

Reply via email to