Mojolicious响应的基本URL

时间:2017-04-02 15:58:09

标签: html perl http mojolicious

HTTP::Response模块具有base方法,该方法返回在将邮件内容中的相对URL转换为绝对URL时使用的基本URL。它从消息正文中检索它(作为HTML <base>中的<head>元素),HTTP标头Content-Location(或过时的Content-Base)或请求的URL(从最近的重定向,如果有的话)

我无法看到Mojo::Message::Response提供相同信息的任何方式,如果某个地方已经存在,我也不想自己编码

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:4)

更新此时我认为此框架与base

LWP不等价

我在content_location课程中找到Mojo::Headers方法。 Mojo::Message::Response继承自基础Mojo::Message,而Mojo::Headers似乎也会被选中

从概要

添加示例
my $res = Mojo::Message::Response->new;
$res->parse("HTTP/1.0 200 OK\x0d\x0a");
$res->parse("Content-Length: 12\x0d\x0a");
$res->parse("Content-Type: text/plain\x0d\x0a\x0d\x0a");
$res->parse('Hello World!');
say $res->code;
say $res->headers->content_type;
say $res->body;

say $res->headers->content_location // 'location not defined';  # /
$res->headers->content_location('set_some_location');
say $res->headers->content_location // 'location not defined';

似乎有效。这个合适吗?我不能轻易找到一个真实的页面试试。

这不扫描文档内容,但仅适用于标题。生成HTTP::Response对象时,LWP会在文档中设置标题,如问题和base下所述。在我的测试中(v5.16)Mojo::UA没有这样做。我无法找到直接的能力。

获取基本URL的一种方法是通过DOM,例如

use Mojo::UserAgent;
my $ua = Mojo::UserAgent->new;
my $base_url = $ua->get($url)
    ->res->dom
    ->at('head')->at('base')->attr('href');

方法dom来自Mojo::Message,而baseattr位于Mojo::DOM。或

$dom->at('head > base[href]');

返回hashref { href => URL },而第一个示例返回URL。

at在失败时返回undef,因此首先需要检查。

这是对内容的额外手动搜索,但至少它集中在<head>

<强>更新

我查看了上述组件及其父类的源代码。这也带来Mojo::Content,其子类SingleMojo::Message::content返回,而Mojo::UserAgent::Transactor及其redirect方法则使用Mojo::URL。但是,它们有不同的用途。总而言之,我找不到直接挖掘基本网址的帮助。

此时我必须得出结论,base中的LWP等直接功能在此处不可用。