【问题标题】:Perl - Force LWP::Protocol subclass selection, or is there a better way?Perl - 强制 LWP::Protocol 子类选择,还是有更好的方法?
【发布时间】:2014-01-16 08:54:02
【问题描述】:

背景

我已经为基于AnyEvent::HTTP 的HTTP(S) 编写了LWP::Protocol“实现程序”。 (即:它实现了两个 HTTP 和 HTTPS)。

它与LWP::Protocol::AnyEvent::httpCoro::LWP 的不同之处在于它不会阻塞$protocol->request。我已经为 select()、名称解析等实现了大部分与 Coro::LWP 相同的技巧,但更好地利用了 AnyEvent

$protocol->request() 返回的 HTTP 响应现在是 230 - Pending Completion of Request,但我愿意接受更好的方式来传达它不是一个完整的请求。

我还编写了HTTP::Response 的子类,如果他们试图在响应完成之前使用部分响应,则会强制标准“消费者”方法使用 BLOCKING;它还添加了与内部/提供的AnyEvent::CondVar 良好工作的方法,以便您可以一次触发大量请求,以及使用AnyEvent 执行其他操作。 (我还重写了所有 LWP::UserAgent 的 post-send_request() 逻辑,将其推迟到真正的请求完成)。

问题

如果我有我的 LWP::UserAgent 子类“升级”URL scheme,我目前正在做一个黑客攻击,通过为异步请求附加 '_async',并且我已经将 LWP::Protocol 子类作为“实现者”对于匹配/^https?_async$/的方案

问题

如何让我的LWP::UserAgent 子类选择我的(更多异步)HTTP 和 HTTPS 协议“实现者”而不是系统上安装的其他协议? (即:当LWP::UserAgent子类调用LWP::Protocol::create时)。

我可以强制选择我的“实施者”吗?还是有更自然的方法来做到这一点?

【问题讨论】:

    标签: perl asynchronous lwp-useragent anyevent


    【解决方案1】:

    您需要在您的send_request 呼叫附近拨打implementor

    LWP::Protocol::implementor('http', 'your::module::name');
    

    查看http://search.cpan.org/~gaas/LWP-Protocol-http10-6.03/lib/LWP/Protocol/http10.pm 的源代码,了解您需要实现什么来替换 HTTP 协议处理程序

    【讨论】:

    • 正如我在问题中所说,我希望覆盖 HTTP 和 HTTPS 协议。 AnyEvent::HTTP 已经可以很好地处理 SSL。我试图让LWP::UserAgent 使用 my LWP::Protocol“实现者”而不是系统上安装的其他人(例如:LWP::Protocol::http、LWP::Protocol::AnyEvent ::http) 实现相同的方案 - HTTP 和 HTTPS。
    • 如果你真的读过这个问题,我写了一个 LWP::UserAgent 的子类。 LWP::UserAgent 从“适当的”LWP::Protocol 子类调用$protocol->request(其中$protocol 由名为LWP::Protocol::create 的工厂函数制造)。我的问题是关于如何影响该选择。
    • 好的,抱歉,但您的问题对我来说不是很清楚,所以现在,您是否尝试过更改 LWP::Protocol::implementor ? search.cpan.org/~gaas/libwww-perl-6.05/lib/LWP/Protocol.pm
    • 特别是 LWP::Protocol::implementor('http', 'your::module::name');
    • 我已经做到了。它仍然选择另一个实现者。有几个实现“http”。
    猜你喜欢
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    相关资源
    最近更新 更多