sinatra/sinatra-contrib/lib/sinatra/webdav.rb

95 lines
2.3 KiB
Ruby

# frozen_string_literal: true
require 'sinatra/base'
module Sinatra
# = Sinatra::WebDAV
#
# This extensions provides WebDAV verbs, as defined by RFC 4918
# (https://tools.ietf.org/html/rfc4918). To use this in your app,
# just +register+ it:
#
# require 'sinatra/base'
# require 'sinatra/webdav'
#
# class Application < Sinatra::Base
# register Sinatra::WebDAV
#
# # Now you can use any WebDAV verb:
# propfind '/2014/january/21' do
# 'I have a lunch at 9 PM'
# end
# end
#
# You can use it in classic application just by requring the extension:
#
# require 'sinatra'
# require 'sinatra/webdav'
#
# mkcol '/2015' do
# 'You started 2015!'
# end
#
module WebDAV
def self.registered(_)
Sinatra::Request.include WebDAV::Request
end
module Request
def self.included(base)
base.class_eval do
alias_method :_safe?, :safe?
alias_method :_idempotent?, :idempotent?
def safe?
_safe? or propfind?
end
def idempotent?
_idempotent? or propfind? or move? or unlock? # or lock?
end
end
end
def propfind?
request_method == 'PROPFIND'
end
def proppatch?
request_method == 'PROPPATCH'
end
def mkcol?
request_method == 'MKCOL'
end
def copy?
request_method == 'COPY'
end
def move?
request_method == 'MOVE'
end
# def lock?
# request_method == 'LOCK'
# end
def unlock?
request_method == 'UNLOCK'
end
end
def propfind(path, opts = {}, &bk) route 'PROPFIND', path, opts, &bk end
def proppatch(path, opts = {}, &bk) route 'PROPPATCH', path, opts, &bk end
def mkcol(path, opts = {}, &bk) route 'MKCOL', path, opts, &bk end
def copy(path, opts = {}, &bk) route 'COPY', path, opts, &bk end
def move(path, opts = {}, &bk) route 'MOVE', path, opts, &bk end
# def lock(path, opts = {}, &bk) route 'LOCK', path, opts, &bk end
def unlock(path, opts = {}, &bk) route 'UNLOCK', path, opts, &bk end
end
register WebDAV
Delegator.delegate :propfind, :proppatch, :mkcol, :copy, :move, :unlock # :lock
end