2014-09-22 88 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