CalDav同步令牌到期

时间:2015-06-20 08:32:31

标签: httpwebrequest sync caldav sabredav

previous question中,我询问了如何与DaviCal服务器同步数据。我最后得出的结论是,DaviCal存在一个错误,因为当查询具有无效同步令牌的CalDav服务器时,服务器应该返回错误,而是返回服务器上的整组事件。

所以我开始寻找另一种CalDav服务器。我用SabreDav。我按照他们非常方便的教程here

在那里说:

  

注意事项

     

请注意,服务器可以“忘记”之前发布的任何同步令牌。在这种情况下,可能需要再次进行全同步。

     

如果服务器无法识别提供的同步令牌,则会发出HTTP错误。 SabreDAV发出403。

看起来很有希望:正是我需要的东西!

所以我要做的是获取http://sabre.io/ns/sync/15的同步令牌。

然后我按如下方式提交我的REPORT查询(也许这就是我做错事的地方?!)

string syncToken = "http://sabre.io/ns/sync/15";
string body = " <d:sync-collection xmlns:d=\"DAV:\"> " +
              "   <d:sync-token>" + syncToken + "</d:sync-token> " +
              "   <d:sync-level>1</d:sync-level> " +
              "   <d:prop> " +
              "     <d:getetag/> " +
              "   </d:prop> " +
              " </d:sync-collection> ";
Request = (HttpWebRequest)HttpWebRequest.Create("http://my.sabredav.com/calendars/example/home/");
Request.Credentials = new NetworkCredential("my_user", "my_pwd");
Request.Method = "REPORT";
Request.ContentType = "application/xml";
// set the body of the request...
Request.ContentLength = body.Length;
using (Stream reqStream = Request.GetRequestStream()) {
    // Write the string to the destination as a text file.
    byte[] encodedBody = Encoding.UTF8.GetBytes(body);
    reqStream.Write(encodedBody, 0, encodedBody.Length);
    reqStream.Close();
}

// Send the method request and get the response from the server.
Response = (HttpWebResponse)Request.GetResponse();

因此,当我使用有效的同步令牌http://sabre.io/ns/sync/15发送请求时,我得到一个空响应:

<?xml version="1.0"?>
    <d:multistatus xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:cs="http://calendarserver.or /ns/">
    <d:sync-token>http://sabre.io/ns/sync/15</d:sync-token>
</d:multistatus>

到目前为止一切顺利。

如果我使用之前的同步令牌,我知道在某些时候它是有效的(在这种情况下http://sabre.io/ns/sync/14 - 偶然它是前一个数字......)我会按预期得到更改:

    <?xml version="1.0"?>
    <d:multistatus xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:cs="http://calendarserver.org/ns/">
     <d:response>
      <d:href>/calendarserver.php/calendars/admin/default/23b351ee-7677-46e3-b5c5-5263e8fca351.ics</d:href>
      <d:propstat>
       <d:prop>
        <d:getetag>&quot;8d8d122a66625ca990252fae652cd2e5&quot;</d:getetag>
       </d:prop>
       <d:status>HTTP/1.1 200 OK</d:status>
      </d:propstat>
     </d:response>
     <d:sync-token>http://sabre.io/ns/sync/15</d:sync-token>
    </d:multistatus>

但问题是,如果我使用的RANDOM同步令牌我绝对不会发出:http://sabre.io/ns/sync/1234312231344324

我在使用最新(当前)令牌时得到了相同的答案:

    <?xml version="1.0"?>
    <d:multistatus xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:cs="http://calendarserver.org/ns/">
     <d:sync-token>http://sabre.io/ns/sync/15</d:sync-token>
    </d:multistatus>

SabreDav说它应该抛出一个错误403,但很明显,这不是我在这里得到的......但是,如果我使用INVALID同步令牌格式,比如token1234,我的确会收到错误403 ...

所以问题是:我如何确保我的同步令牌仍然有效?因此,如果令牌有效且没有返回任何内容,我知道我的本地缓存是最新的,或者,如果同步令牌是无效的,我需要进行完全同步!

1 个答案:

答案 0 :(得分:0)

这确实是saber / dav中的一个错误。随意打开一个错误报告,以便它在我们的雷达上。它从未成为一个主要关注点,因为表现良好的客户&#39;永远不会提供我们从未发出的同步令牌。

之所以发生这种情况,是因为数字只是我们数据库中不断增加的记录ID。要获取所有更改,请使用math.acos(1.0000000000000002) 进行简单的SQL查询。

如果您明确要在客户端测试无效令牌,我建议您只提供一个完全不同格式的同步令牌(不会以>开头)。