2014-10-06 29 views
1

我正在嘗試在Laravel Route中創建一個SabreDAV服務器。下面的代碼顯示,我想:如何在laravel控制器中集成sabredav?

Illuminate\Routing\Router::$verbs = [ 
    'GET', 
    'HEAD', 
    'POST', 
    'PUT', 
    'PATCH', 
    'DELETE', 
    'PROPFIND', 
    'PROPPATCH', 
    'MKCOL', 
    'COPY', 
    'MOVE', 
    'LOCK', 
    'UNLOCK' 
]; 


    Route::match(['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'PATCH', 'PROPFIND', 'PROPPATCH', 'MKCOL', 'COPY', 'MOVE', 'LOCK', 'UNLOCK'], 'carddav{test}', function() 
{ 
     date_default_timezone_set('Europe/Berlin'); 

     $baseUri = '/carddav'; 

     $pdo = new PDO('mysql:host=localhost;dbname=dav', 'root', 'root'); 
     $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 

     $authBackend = new \Sabre\DAV\Auth\Backend\PDO($pdo); 
     $principalBackend = new \Sabre\DAVACL\PrincipalBackend\PDO($pdo); 
     $carddavBackend = new \Sabre\CardDAV\Backend\PDO($pdo); 

     $nodes = [ 
       new \Sabre\DAVACL\PrincipalCollection($principalBackend), 
       new \Sabre\CardDAV\AddressBookRoot($principalBackend, $carddavBackend) 
     ]; 

     $server = new \Sabre\DAV\Server($nodes); 
     $server->setBaseUri($baseUri); 

     $server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend, 'SabreDAV')); 
     $server->addPlugin(new \Sabre\DAV\Browser\Plugin()); 
     $server->addPlugin(new \Sabre\CardDAV\Plugin()); 
     $server->addPlugin(new \Sabre\DAVACL\Plugin()); 
     $server->addPlugin(new \Sabre\DAV\Sync\Plugin()); 

     $server->exec(); 
})->where('path', '(.)*'; 

但如果我嘗試調用它在瀏覽器中有一個錯誤:

<?xml version="1.0" encoding="utf-8"?> 
<d:error xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns"> 
    <s:sabredav-version>2.0.4</s:sabredav-version> 
    <s:exception>Sabre\DAV\Exception\NotAuthenticated</s:exception> 
    <s:message>No digest authentication headers were found</s:message> 
</d:error> 

有沒有身份驗證提示。

如果我嘗試從Evolution進行連接,則出現消息:「不允許的方法」。

有人有什麼想法是什麼問題?

謝謝, 佩佩

回答

1

的問題是所發送的HTTP狀態代碼。不管SabreDAV的響應如何,Laravel路由器總是將HTTP狀態碼設置爲200,所以沒有CardDAV客戶端知道他們必須授權請求 - 忽略基本認證挑戰。

我的解決方案可能不是最優雅的一個,但它工作。只是包裝在ob_start的$服務器 - > EXEC()()和OB_END()標籤和輸出的內容與真實的Laravel響應:

ob_start(); 
$server->exec(); 

$status = $server->httpResponse->getStatus(); 
$content = ob_get_contents(); 
ob_end_clean(); 

return response($content, $status); 

一般指導:

  • 使用 「郵差」(谷歌Chrome應用)來測試的要求,你會看到他們發送的授權頭的前期
  • 使用像「查爾斯」網絡調試代理監視實際的請求和響應主體
工作時