首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将sabredav集成到laravel控制器中?

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

Stack Overflow用户
提问于 2014-10-06 12:42:59
回答 1查看 1.8K关注 0票数 2

我正试图在Laravel路由中创建一个SabreDAV。以下代码显示我尝试过:

代码语言:javascript
复制
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', '(.)*';

但是,如果我试图在浏览器中调用它,就会出现一个错误:

代码语言:javascript
复制
<?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>

没有身份验证提示。

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

有人知道问题出在哪里吗?

谢谢,佩佩

EN

回答 1

Stack Overflow用户

发布于 2015-12-23 09:40:52

问题是发送的HTTP状态代码。无论来自SabreDAV的响应,Laravel路由器总是将HTTP代码设置为200,因此没有一个CardDAV客户端知道他们必须授权请求--忽略基本的Auth挑战。

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

代码语言:javascript
复制
ob_start();
$server->exec();

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

return response($content, $status);

一般指导意见:

  • 使用"postman“(Google )测试请求,您将看到它们在预先发送授权头时正常工作
  • 使用像"Charles“这样的web调试代理来监视实际的请求和响应主体。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26216478

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档