gpt4 book ai didi

perl - 如何为 GET 请求绕过 LWP 的 URL 编码?

转载 作者:行者123 更新时间:2023-12-05 01:05:07 27 4
gpt4 key购买 nike

我正在谈论一个似乎是损坏的 HTTP 守护进程,我需要制作一个 GET包含管道的请求 | URL 中的字符。

LWP::UserAgent 在发送请求之前转义管道字符。

例如,传入的 URL 为:

https://hostname/url/doSomethingScript?ss=1234&activities=Lec1|01

作为传递给 HTTP 守护进程
https://hostname/url/doSomethingScript?ss=1234&activities=Lec1%7C01

这是正确的,但不适用于这个损坏的服务器。

如何覆盖或绕过 LWP 及其 friend 正在执行的编码?

备注

我已经在 StackOverflow 上看到并尝试了其他解决类似问题的答案。这里的区别似乎是这些答案正在处理 POST请求在哪里 formfield URL 的一部分可以作为键/值对数组或作为 'Content' => $content 传递。范围。对于 LWP 请求,这些方法对我不起作用。

我也试过构建一个 HTTP::Request对象并将其传递给 LWP,并将完整的 URL 直接传递给 LWP->get() .两种方法都没有骰子。

为了响应鲍罗丁的要求,这是我正在使用的代码的清理版本
#!/usr/local/bin/perl -w
use HTTP::Cookies;
use LWP;

my $debug = 1;

# make a 'browser' object
my $browser = LWP::UserAgent->new();

# cookie handling...
$browser->cookie_jar(HTTP::Cookies->new(
'file' => '.cookie_jar.txt',
'autosave' => 1,
'ignore_discard' => 1,
));

# proxy, so we can watch...
if ($debug == 1) {
$browser->proxy(['http', 'ftp', 'https'], 'http://localhost:8080/');
}

# user agent string (pretend to be Firefox)
$agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.7.12) Gecko/20050919 Firefox/1.0.7';

# set the user agent
$browser->agent($agent);

# do some things here to log in to the web site, accept session cookies, etc.
# These are basic POSTs of filled forms. Works fine.
# [...]

my $baseURL = 'https://hostname/url/doSomethingScript?ss=1234&activities=VALUEA|VALUEB';

@values = ['Lec1', '01', 'Lec1', '02'];

while (1) {
if (scalar(@values) < 2) { last; }

my $vala = shift(@values);
my $valb = shift(@values);

my $url = $basEURL;
$url =~ s/VALUEA/$vala/g;
$url =~ s/VALUEB/$valb/g;

# simplified. Would usually check request for '200' response, etc...
$content = $browser->get($url)->content();

# do something here with the content

# [...]

# fails because the '|' character in the url is escaped after it's handed
# to LWP

}

# end

最佳答案

正如@bchgys 在他的评论中提到的,这(几乎)在 linked thread 中得到了回答。 .这里有两个解决方案:

第一个并且可以说是最干净的方法是在本地覆盖 URI::Escape 中的转义映射以不修改管道字符:

use URI;
use LWP::UserAgent;

my $ua = LWP::UserAgent->new();
my $res;
{
# Violate RFC 2396 by forcing broken query string
# local makes the override take effect only in the current code block
local $URI::Escape::escapes{'|'} = '|';
$res = $ua->get('http://server/script?q=a|b');
}
print $res->request->as_string, "\n";

或者,您可以通过在创建请求后直接在请求中修改 URI 来简单地撤消转义:
use HTTP::Request;
use LWP::UserAgent;

my $ua = LWP::UserAgent->new();
my $req = HTTP::Request->new(GET => 'http://server/script?q=a|b');

# Violate RFC 2396 by forcing broken query string
${$req->uri} =~ s/%7C/|/;

my $res = $ua->request($req);
print $res->request->as_string, "\n";

第一个解决方案几乎肯定更可取,因为它至少依赖于 %URI::Escape::escapes导出和记录的包变量,因此这可能与您将要使用受支持的 API 执行此操作一样接近。

请注意,在任何一种情况下,您都违反了 RFC 2396,但如前所述,在与您无法控制的损坏服务器交谈时,您可能别无选择。

关于perl - 如何为 GET 请求绕过 LWP 的 URL 编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21977147/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com