如何将sabredav集成到laravel控制器中?

如何将sabredav集成到laravel控制器中?,laravel,sabredav,Laravel,Sabredav,我正在尝试在一个Laravel路由中创建一个SabreDAV服务器。以下代码显示我已尝试: illumb\Routing\Router::$verbs=[ “得到”, “头”, "岗位",, "放",, “补丁”, “删除”, “PROPFIND”, “PROPPATCH”, “MKCOL”, “复制”, "动",, “锁”, “解锁” ]; 路由::匹配(['GET','HEAD','POST','PUT','DELETE','PATCH','PROPFIND','PROPPATCH','MK

我正在尝试在一个Laravel路由中创建一个SabreDAV服务器。以下代码显示我已尝试:

illumb\Routing\Router::$verbs=[
“得到”,
“头”,
"岗位",,
"放",,
“补丁”,
“删除”,
“PROPFIND”,
“PROPPATCH”,
“MKCOL”,
“复制”,
"动",,
“锁”,
“解锁”
];
路由::匹配(['GET','HEAD','POST','PUT','DELETE','PATCH','PROPFIND','PROPPATCH','MKCOL','COPY','MOVE','LOCK','UNLOCK'],'carddav{test}',function()
{
日期默认时区设置(“欧洲/柏林”);
$baseUri='/carddav';
$pdo=newpdo('mysql:host=localhost;dbname=dav','root','root');
$pdo->setAttribute(pdo::ATTR_ERRMODE,pdo::ERRMODE_异常);
$authbend=new\Sabre\DAV\Auth\Backend\PDO($PDO);
$principalBackend=new\Sabre\DAVACL\principalBackend\PDO($PDO);
$carddavBackend=new\Sabre\CardDAV\Backend\PDO($PDO);
$nodes=[
新建\Sabre\DAVACL\PrincipalCollection($principalBackend),
新建\Sabre\CardDAV\AddressBookRoot($principalBackend,$carddavBackend)
];
$server=new\Sabre\DAV\server($nodes);
$server->setBaseUri($baseUri);
$server->addPlugin(新建\Sabre\DAV\Auth\Plugin($authbend,'SabreDAV'));
$server->addPlugin(新建\Sabre\DAV\Browser\Plugin());
$server->addPlugin(新建\Sabre\CardDAV\Plugin());
$server->addPlugin(新建\Sabre\DAVACL\Plugin());
$server->addPlugin(新建\Sabre\DAV\Sync\Plugin());
$server->exec();
})->其中('路径','(.)*';
但如果我尝试在浏览器中调用它,则会出现错误:

<?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>

2.0.4
Sabre\DAV\Exception\n未验证
未找到摘要身份验证标头
没有身份验证提示

如果我试图从进化论中连接,就会得到这样的信息:“方法不允许”

有人知道问题出在哪里吗

谢谢,
pepe

问题在于发送的HTTP状态码。无论来自SabreDAV的响应如何,Laravel路由器总是将HTTP状态码设置为200,因此CardDAV客户端永远不会知道他们必须授权请求–忽略基本身份验证挑战

我的解决方案可能不是最优雅的,但它正在工作。只需将$server->exec()包装在ob_start()和ob_end()标记中,并以真正的Laravel响应输出内容:

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

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

return response($content, $status);
一般指导:

  • 使用“邮递员”(Google Chrome应用程序)测试请求,您将看到它们在预先发送授权头时工作
  • 使用类似“Charles”的web调试代理来监视实际的请求和响应主体