2014-09-22 74 views
1

我有使用PHP发送的WebDAV propfind请求。 HTTP请求如下:响应XML包含“2000”和“20a0”字符

PROPFIND /path/to/whatever HTTP/1.1 
User-Agent: My Client 
Accept-Encoding: deflate 
Depth: 1 
Host: example.com 
Content-Type: text/xml;charset=UTF-8 
Authorization: Basic bLahDeBlah= 
Content-Length: 82 
Connection: close 

<?xml version='1.0' encoding='utf-8'?><propfind xmlns='DAV:'><allprop/></propfind> 

它正常工作时的响应XML小于约1.5 MB。当响应较大时,XML包含字符\r\n2000\r\n和偶尔\r\n20a0\r\n

我使用这个PHP代码检索响应:

<?php 
$output = ""; 
while (!feof($this->socket)) { 
     $output .= fgets($this->socket, 1024); 
} 

我可以从响应剥离不需要的字符解决这个问题 - 但我想,以防止这一点。任何想法可能导致这种情况?

更新:响应标题包含Transfer-Encoding: chunked。我们的PHP版本是Windows,我相信没有DLL可以使用http_chunked_decode()

+1

响应数据可能是由于传输编码被设置为由远程服务器分块。 – 2014-09-22 10:43:25

+0

是的,那是可能的。什么是响应标题? – 2014-09-22 10:45:35

+0

响应头有“Transfer-Encoding:chunked” – 2014-09-22 11:14:02

回答

1

由于有几个人已经在评论中指出“十六进制”字符被插入,因为响应是chunked-encoded

This stack-overflow question涉及同样的问题(不使用PECL扩展),并提出了以下的代码片段的响应解码:

function decode_chunked($str) { 
    for ($res = ''; !empty($str); $str = trim($str)) { 
    $pos = strpos($str, "\r\n"); 
    $len = hexdec(substr($str, 0, $pos)); 
    $res.= substr($str, $pos + 2, $len); 
    $str = substr($str, $pos + 2 + $len); 
    } 
    return $res; 
} 

正如联提问时指出,要确保头Transfer-Encoding: chunked是在应用解码之前设置。

更新: Zend框架功能Response类也支持分块解码。请注意,Zend \ Http类可以用作独立组件(无需在应用程序中包含完整框架!)。

+0

感谢您指出Zend Framework具有decodeChunkedBody()函数在Response类中执行此操作。似乎工作! – 2014-09-22 13:03:35