【问题标题】:find out how an LWP request was sent "over the wire"了解 LWP 请求是如何“通过网络”发送的
【发布时间】:2017-08-23 17:23:51
【问题描述】:

如果我使用 LWP 发送请求,有一个便利函数 as_string 可以告诉我刚刚发送了什么请求。非常方便,事实上我没有任何问题。除了我刚刚注意到它肯定是在骗我。比如这段代码:

use v5.14.2;
use LWP;
my $response = LWP::UserAgent->new->get('http://user:pswd@example.com/');
say $response->request->as_string;

给出这个输出

GET http://user:pswd@example.com/
User-Agent: libwww-perl/6.13

但是 URL 肯定不是那样发送的!该库必须已解析出用户名和密码,并添加了适当的标头,并添加了主机标头,等等。有没有一种简单的方法可以找出实际发送的内容?

【问题讨论】:

  • Re "as_string 告诉我我刚刚发送了什么请求",不,它没有。 LWP::UserAgent 含义 LWP::Protocol 含义 LWP::Protocol::http 含义 Net::HTTP 不使用->as_string
  • 我无法解析你写的内容。你是说请求最终会在 Net::HTTP 结束,它是真正写入套接字的那个,但它会写任何它想要的东西,并且实际上并没有告诉它的调用者它写了什么?
  • Net::HTTP 是使用 LWP::UserAgent 时执行实际提升的模块。 // 对。
  • Net::HTTP 是否在任何地方“保存其工作”?如果下面的答案是正确的,那肯定是必须的?
  • 没有。也许某些更改最终会出现在 ::Request 对象中,但绝对不是全部,这就是为什么下面的答案说使用有线嗅探器或虚拟服务器的原因。

标签: perl lwp lwp-useragent


【解决方案1】:

LWP::ConsoleLogger::Everywhere1,您只需加载它即可获取请求和响应的所有详细信息。请求将在通过网络发送之前立即被接收,并在它返回时作出响应。

您只需在代码中的任意位置use LWP::ConsoleLogger::Everywhere。如果您想要更多控制权,该发行版中的主模块LWP::ConsoleLogger 可以让您轻松调整设置。

但是,这不是通过网络传输的真实数据。如果您想知道它收到了什么,您需要使用tcpdump 之类的东西监视连接,然后查看它(这是非常高级的网络东西),或者可能将端点更改为您自己的 IP 地址,或者只需127.0.0.1,然后使用netcat监听特定端口。

$ nc -l 8080

如果您将请求发送到该端口,您将在 netcat 中看到它。


1) 免责声明:我是该模块的贡献者

【讨论】:

  • Neato!那么,仅使用 LWP 附带的东西就没有简单的方法吗?
  • @MarkVY 有。看看 LWP::ConsoleLogger 的代码就知道了。其实很简单。但我猜它会给你同样的东西。您将拥有一个可以将其转换为字符串的请求对象。我在 TPCiA 讨论了它是如何工作的,但视频还没有。
  • 好的,我想我明白你在这里做了什么。您确保每个用户代理都是使用一些处理程序创建的,然后从 LWP 的角度来看,这些处理程序是无操作的,除了它们非常仔细地检查请求和响应并记录他们想要的任何内容。整洁!
  • @MarkVY 差不多,是的。但我的只是无处不在的部分。剩下的都是奥拉夫。不管怎样,这个模块对你的工具箱来说是一个很好的补充。
  • @MarkVY 是的,我在火车上很无聊。需要一些东西来使用 LWP 进行调试,在我构建它之后,我去 IRC 询问它是否已经存在。确实如此,所以我在那里添加了我的东西。奥拉夫的作品真的很棒。