2015-06-20 8 views
0

В previous question я спросил о синхронизации данных с сервером DaviCal. Я пришел к выводу, что в DaviCal появилась ошибка, так как при запросе сервера CalDav с недопустимым токеном синхронизации сервер должен вернуть ошибку, но вместо этого он возвращает весь набор событий на сервере.CalDav sync-token expirey

Итак, я начал искать альтернативный сервер 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 ...

Итак, вопрос: КАК я могу убедиться, что мой токен синхронизации все еще действителен? Итак, если токен действителен и ничего не возвращается, я знаю, что мой локальный кеш обновлен или, в случае, если токен синхронизации является INVALID, мне нужно выполнить полную синхронизацию!

+0

Сервер не должен иметь дело со случайными токенами, токены полностью непрозрачны для клиента. Кроме того, на сервере не должно быть «to_ expire tokens», оно * может *, это что-то другое ;-) Я бы предположил, что SabreDAV присоединяет постоянно растущий номер ревизии к каждому изменению, и токен sync просто ссылается на это. Конечно, сервер, вероятно, должен удалить надгробия в конечном итоге, но это может быть процесс обслуживания базы данных, выполняющийся независимо. P.S .: вполне вероятно, ошибка SabreDAV. – hnh

+1

Wrt the PS: ошибка, которая не влияет на надлежащего клиента! Кроме того, не делайте такого рода «» + syncToken - всегда правильно кодировать маркеры XML, они вполне могут содержать специальные символы XML. – hnh

ответ

0

Это действительно ошибка в саблях/dav. Не стесняйтесь открывать отчет об ошибке, поэтому он находится на нашем радаре. Это никогда не вызывало серьезной озабоченности, так как «хорошие клиенты» никогда не выдавали синхронизирующий токен, который не был выпущен нами.

Причина, по которой это происходит, состоит в том, что эта цифра является постоянно увеличивающимся идентификатором записи в нашей базе данных. Чтобы получить все изменения, выполняется простой SQL-запрос с >.

Если вы явно хотите протестировать недействительные токены в своем клиенте, я бы рекомендовал просто поставить синхронизирующий токен с совершенно другим форматом (то, что не начинается с http://sabre.io/ns/sync).

+0

Хорошо. Я, конечно, НИКОГДА не использую синхронизацию, токен, который никогда не выдавался клиентом. У меня должен быть возможность протестировать мой клиент, если есть истекший синхронизирующий токен - вот почему я пробовал случайные числа. Так что может быть просто вопрос - ** WHAT ** сервер, чтобы забыть токен синхронизации и ** КАК ** я могу проверить свой клиент с истекшим синхронизирующим токеном? – neggenbe

+0

Я думаю, что Evert сказал, что SabreDAV никогда не заканчивает токенов. – hnh

+0

Хорошо, так что комментарий sabreDav к учебнику не имеет смысла? – neggenbe