I see, you are building a client app, not a server app -- I missed that
detail.

And, I see that you want to pass the ^ *without* escaping it.

Your URL is getting parsed by Mojo::URL, whose parameters are getting
parsed by Mojo::Parameters, and when you get the parameters as a string
<https://mojolicious.org/perldoc/Mojo/Parameters#to_string>, url_escape
<https://mojolicious.org/perldoc/Mojo/Util#url_escape> is being applied:

Percent encode unsafe characters in string as described in RFC 3986
<http://tools.ietf.org/html/rfc3986>, the pattern used defaults to
^A-Za-z0-9\-._~.


Reading the code for to_string in Mojo::Parameters, I see no way around
this.  It would seem that Yahoo Finance is not RFC 3986 compliant.  The
question that needs to be asked then is, "Is it possible for Mojo::URL to
customize the characters that are considered unsafe?"  I don't know super
advanced Perl like this, but maybe it's possible to override a function and
make Mojo::Util::url_escape not actually escape the string?

There might be a more advanced way to build your transaction, one that
doesn't operate on a Mojo::URL object which will ultimately apply
url_escape without question -- but I wouldn't know it.

Anyway, from what I can see, there's not a solution to your problem.  :(


On Sun, Oct 28, 2018 at 11:49 AM Sylvain Thibault <sthiba...@smbcap.com>
wrote:

> Thank you for your response Stefan.
> Here is the complete code.  Symbol SPY works, symbol ^GSPC returns not
> found.
>
> This curl command with the ^GSPC symbol works:
>
> curl -s -o - -N -v 'https://streamerapi.finance.yahoo.com/streamer/1.0?s=
> ^GSPC&k=l86,l84,p20&callback=parent.yfs_u1f&mktmcb=parent.yfs_mktmcb&gencallback=parent.yfs_gencb&mu=1&lang=en-US&region=US&localize=0'
>
>
> #! /usr/bin/env perl
> use Mojo::UserAgent;
> use feature qw(say);
>
> $| = 1;
>
> # Accept responses of indefinite size
> my $ua = Mojo::UserAgent->new(max_response_size => 0);
> $ua->inactivity_timeout(0);
>
> my $url_raw
> # Symbol ^GSPC returns NOT FOUND
> #  = 'https://streamerapi.finance.yahoo.com/streamer/1.0?s=
> ^GSPC&k=l86,l84,p20&callback=parent.yfs_u1f&mktmcb=parent.yfs_mktmcb&gencallback=parent.yfs_gencb&mu=1&lang=en-US&region=US&localize=0';
>   = '
> https://streamerapi.finance.yahoo.com/streamer/1.0?s=SPY&k=l86,l84,p20&callback=parent.yfs_u1f&mktmcb=parent.yfs_mktmcb&gencallback=parent.yfs_gencb&mu=1&lang=en-US&region=US&localize=0
> ';
>
>
> # Build a normal transaction
> my $tx = $ua->build_tx(
>   GET => $url_raw,
>   => {Accept => '*/*'}
> );
>
> # Remove caret encoding... results is not found... ???
> say $tx->req->to_string;
>
> # Replace "read" events to disable default content parser
> $tx->res->content->unsubscribe('read')->on(
>   read => sub {
>     my ($content, $bytes) = @_;
>     say "Streaming: $bytes";
>   }
> );
>
> # Process transaction
> $tx = $ua->start($tx);
>
>
> say "done";
>
>
>
> On Saturday, October 27, 2018 at 5:38:43 PM UTC-6, Sylvain Thibault wrote:
>>
>> Given URL https://somehost.com.com/streamer/1.0?s=^GSPC
>>
>> When doing a GET, Mojo::UserAgent encodes the caret '^' as %5E
>> The server returns NOT FOUND.
>>
>> So this transaction from Mojo::UserAgent returns NOT FOUND:
>>
>> GET /streamer/1.0?s=%5EGSPC&k=l86,l84,p20 HTTP/1.1
>> Host: somehost.com
>> Accept: */*
>> User-Agent: Mojolicious (Perl)
>> Content-Length: 0
>>
>> This transaction using curl with the caret not encoded returns the
>> desired output:
>>
>> GET /streamer/1.0?s=^GSPC&k=l86,l84,p20 HTTP/1.1
>> Host: s <http://streamerapi.finance.yahoo.com/>omehost.com
>> User-Agent: curl/7.61.1
>> Accept: */*
>>
>> How does one send a caret '^' in a URL without encoding it to %5E ?
>>
>> Using a symbol without a caret works great in the Mojo::UserAgent version
>> of the code.
>>
>> Thanks,
>>
>> Sylvain Thibault
>>
>> --
> 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 post to this group, send email to mojolicious@googlegroups.com.
> Visit this group at https://groups.google.com/group/mojolicious.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
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 post to this group, send email to mojolicious@googlegroups.com.
Visit this group at https://groups.google.com/group/mojolicious.
For more options, visit https://groups.google.com/d/optout.

Reply via email to