用curl登录passport时遇到的一个编码问题。

在微软把passport登录服务器转到login.live.com之后,通过curl访问登录页面,如果没有设定Accept-Encoding,将会得到一个错误页面,设置Accept-Encoding为gzip之后,得到的却是一堆乱码。

因为注意到header中有这么一句:Transfer-Encoding: chunked,认为是curl不认chunked编码得缘故,后来看头几个字节:0x1F8B08,不是chunked编码,而是gzip。header中有Content-Encoding: gzip,按说curl应该是自动解压缩的,但是这里没有,用gzuncompress函数解码,显示data error。

后来在手册gzencode这个函数的用户注解里看到这么一句话:

The 10 byte string in gzencode is the standard gzip header. The first two bytes (1f 8b) define the return as a gzip file, the third byte (08) means that the body is compressed using the “deflate” algorithm. The rest is padding (00)’s.

意思是gzip文件的前两个字节1f 8b表明这是一个gzip文件,而第三个字节08代表文件主体是用deflate这种方式压缩的。于是用gzinflate函数解压成功:
gzinflate(substr($contents, 10)); // 去掉前边gzip文件的文件头,10个字节

大概是curl根据header中的Content-Encoding: gzip,解压未成功,直接返回了原始数据。这里似乎也跟微软的服务器有关,返回了错误的编码声明,如果服务器返回的是Content-Encoding: deflate,就应该没问题了。

12 Comments »

  1. volcano said,

    October 18, 2006 @ 7:22 am

    你可以试试用pear的HTTP_Request,它对这个问题处理的很好。或者看看它的源代码,看看它是怎么处理的

  2. Bonita said,

    October 18, 2006 @ 4:56 pm

    看到本文,
    突然想起来用 Curl 来访问有些网站会返回 404 ,
    比如 6rooms,
    望大侠点解。
    感谢。

    PS:我试了试用 fsockopen 方式访问也不行

  3. legend said,

    October 18, 2006 @ 8:00 pm

    请给出具体网址。

  4. Bonita said,

    October 19, 2006 @ 4:20 pm

    hxxp://www.6rooms.com
    以上

  5. legend said,

    October 19, 2006 @ 5:04 pm

    别忘了指定user-agent.

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, ‘http://www.6rooms.com/’);
    curl_setopt($ch, CURLOPT_USERAGENT, ‘Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)’);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    echo curl_exec($ch);

  6. Bonita said,

    October 19, 2006 @ 5:43 pm

    啊哈,的确是这个问题,
    感谢 legend 高人.

  7. zzzz said,

    October 24, 2006 @ 2:52 pm

    ugia.cn用的是哪里的服务器 速度好快啊

  8. legend said,

    October 24, 2006 @ 9:28 pm

    服务器在北京

  9. Laoliu said,

    December 7, 2006 @ 4:54 pm

    legend,问个题外话,PHPRPC是不是不支持Unix服务器?

    我下载的PHPRPC2.1在我服务器上实例都不能正常运行!

    请指教~

    另外,前几天你重装Blog,是我不小心点了 Install.php ,不过后来被你恢复了!

    ^_^

  10. legend said,

    December 7, 2006 @ 8:25 pm

    phprpc支持unix服务器吧,可能缺什么扩展导致不能运行,具体你去www.coolcode.cn看看。

    那天我说怎么变样了,原来是你干的。

  11. tonywang said,

    February 13, 2007 @ 9:48 pm

    To Laoliu,你说的phprpc的问题我也遇到了,后来用了老一点的版本就好了,具体的没研究过,如果不需要加密用老版挺好.
    另 qupu不错,有空要常去 呵呵

  12. andot said,

    February 20, 2007 @ 12:11 am

    嗯,那是因为缺少 bcmath 扩展的原因。

    这篇文章很好啊,我今天也遇到这个问题了。我发送请求时,分明就没有
    Accept-Encoding: gzip,deflate
    但是返回的结果却是:
    Content-Encoding: gzip
    而且问题跟你一样,实际不是 gzip,而是 deflate。

RSS feed for comments on this post

Leave a Comment