2

我正在使用 perl 5.16.2、OAuth::Lite(1.31) 编写 Web 服务。服务器是 CentOS release 6.3 (Final), 2.6.32-279.14.1.el6.x86_64。

问题是当我为 twitter oauth 请求令牌时,OAuth::Lite get_request_token阻止服务器执行 30 秒,有时返回正确响应,有时浏览器请求超时。

重现问题的最小代码如下,

use OAuth::Lite::Consumer;                                                            

my $consumer = OAuth::Lite::Consumer->new(                                      
  request_token_path => 'https://api.twitter.com/oauth/request_token',          
  consumer_key       => '[CONSUMER KEY]',                               
  consumer_secret    => '[CONSUMER SECRET]',            
  callback_url       => '[CALLBACK]',                    
);                                                                              

my $rtoken = $consumer->get_request_token();

将在 30 秒后返回。

我阅读了代码,并my_readline在 Net::HTTP::Methods 行 259-260 in Net::HTTP 6.05 中找出了该方法

die "read timeout" unless $self->can_read;
my $n = $self->sysread($_, 1024, length);

阻止请求。my_readline试图阅读的标题是

HTTP/1.1 200 OK
Date: Fri, 16 Nov 2012 16:16:39 GMT
Status: 200 OK
X-MID: 266cca0268c8eb68e76eedda256c77829ea9b22e
X-Transaction: 784ff126dfead993
Tag: "382e5356bb65e976f6b117bacdfa05e4"
Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0
X-Runtime: 0.02892
Pragma: no-cache
Expires: Tue, 31 Mar 1981 05:00:00 GMT
X-Frame-Options: SAMEORIGIN
Content-Type: text/html; charset=utf-8
Last-Modified: Fri, 16 Nov 2012 16:16:39 GMT
Set-Cookie: k=10.36.55.109.1353082599368934; path=/; expires=Fri, 23-Nov-12 16:16:39 GMT; domain=.twitter.com
Set-Cookie: guest_id=v1%3A135308259937793094; domain=.twitter.com; path=/; expires=Mon, 17-Nov-2014 04:16:39 GMT
Set-Cookie: _twitter_sess=BAh7CCIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNo%250ASGFzaHsABjoKQHVzZWR7ADoHaWQiJTJlZGJiN2MyOTMyNmM0OGY0MjJmZmY0%250AMTU3YzllYTI0Og9jcmVhdGVkX2F0bCsI0vcBCjsB--21ab24a6dd6596b1dcc78651c0b6a4836b320621; domain=.twitter.com; path=/; HttpOnly
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 150
Server: tfe

此标头超过 1024 个字符。所以我将 1024 更改为 2048,它开始工作正常......我想弄清楚这个问题的原因。

任何帮助表示赞赏。谢谢。

4

1 回答 1

2

多年前,我在使用 LWP::Protocol::https(也被 OAuth::Lite 使用)时有过糟糕的体验,尤其是在 CentOS 上。长话短说:试图在那个平台上编译 Net::SSLeay 太沮丧了,导致我用 WWW::Curl 替换了 LWP::UserAgent。编译得很好。并且非常适合那个简单的应用程序。然而,OAuth::Lite 与 LWP 紧密耦合,重新实现一切毫无意义。还有另一种将 libcurl 与基于 LWP 的代码一起使用的方法:http: //blogs.perl.org/users/stas/2012/11/libcurl-as-lwp-backend-or-all-your-protocol-are-属于我们.html

于 2012-11-16T17:40:37.643 回答