caldav server
2018-05-11 21:46:17 0 举报
AI智能生成
caldav server
作者其他创作
大纲/内容
client测试
thunderbird
不支持目录发现
对alarm的缓解支持还不够
Em client
支持服务发现
alarm的缓解支持很友好
outlook sync
不支持目录发现
mac Calendar
支持目录发现
ios calendar
支持目录发现
抓包情况
刚开始能抓到很多propfind的包
没什么特别的
omd client
工作排期数据同步
add可以,多次add会导致sequence增加
update-delete的逻辑很清楚,还在进一步梳理,要精简代码
待办 数据同步
只支持add逻辑已经足够,caldav server 端本身会采用比较更新的方式
在测试过程中发现httpkit,不支持mkcalendar方法,所以server不能使用http-kit
网络环境
办公网
开发网
通过labweifi,手机上日历app可以访问测试环境的日历
vpn情况?
手机vpn不可以
mac vpn不可以
在访问oa系统时,会被定向到企业it的登录页面
公司内外的环境非常复杂,需要经过各种各样的测试
在测试环境下jetty可能会有出现一些网络包截断问题,暂时忽略。。
路由handler
options
支持各级目录的options
:authorized? true
liberator graph的走向是is-options? true,直接返回200 options
DAV头部"1, 2, 3, calendar-access, addressbook, extended-mkcol"
mkcalendar
成功时返回201
输入body为空时也可以创建日历
读取输入的xml中的prop属性,新增到db
propfind
支持根目录、owner目录和calendar目录
需要鉴权,user/pass
目前用basic
后续改用digest?
depth头部指定检索深度
brief头部指示404的属性可以不返回
处理逻辑
1.解析请求xml中的prop/all-prop/propname,获得{:prop-name prop-name :props props :all-prop all-prop}的map
2.获取user在uri下可读和可写的所有items.考虑depth和brief
maintainer和creator可写,viewer可看
叶子节点支持到todo和event
propfind一般不返回具体日历对象信息
这里唯一的例外就是当propfind根目录时,也返回了具体的日历信息
当时好像是为了支持mac而特意做的改变
这些items,也要支持到用户组的权限方式
这里的逻辑目前还不够完善
3.对所有的items根据请求构造response
每一个item都有href
status 200/计算不出来的值则返回status 404
根据is-collection?和is-leaf?该支持到的属性略有不同
如果不是propname请求,则计算props的每一个值
report
目前支持到calendar目录
需要鉴权和读的权限
不能读,则not allowed
暂时没做filter的支持
rfc4791 9.7
逻辑复杂,但是没太大必要
处理逻辑
1.判断请求是calendar-multiget还是sync-collection还是别的来获取href
如果是sync-collection,hrefs就是这段时间内改变过的item
如果是multiget,那就是multiget里面的href项
如果是别的,href就是默认的uri,并做处理
2.根据1的href来获取作为响应的item
user获取某个owner下面的calendar,要有或者读的权限或者写的权限
只是查出所有的calendar和对应的comps,生成calendar对象
对于currence情况要用到循环
3.将item过滤,包装返回
如果是存在的则返回200
包装内容仅限于getetag/getcontenttype/calendar-data
如果是删除的item,返回404
所有item的response放在一个multistatus中
get
get是report的简化版
权限一样
查找comps,生成calendar对象返回
put
要有写的权限
否则not allowed
liberator来处理etag逻辑
:etag-matches-for-if-match?处理修改
:etag-matches-for-if-none?处理新增
支持todo和event
event
从comp中解析各种属性
dtstart
dtend
summary
desc
recurrenceid
location
class
alarms
repeat
重复次数
duration
trigger
可能是确定的时间或者相对于开始时间的一个相对时间
action
比如DISPLAY
attach
desc
summary
怎么解除alarm?
目前并没有得到支持,因为客户端对这个的支持是不一样的
rrule
事件的重复发生规则
uid+recuurence_id唯一
如果已经存在,则判断是否更新
todo
基本和event一样,也是uid+recurrence id
特别要支持的属性
completed
status
percent-complete
支持recur
delete
要有写的权限
否则not allowed
liberator来处理etag逻辑
if-match判断是否server上的变更过
删除是软删除
支持删除一个文件
todo
event
支持删除一个日历
post
输入输出使用jsonrpc格式
/client/
用于同步erp系统其它模块的数据到同一日历中
/api/
用于提供api
路由前缀
/calendar/
caldav标准
rfc4791
icalendar标准
rfc5445
0 条评论
下一页