lib/sinatra/webdav.rb



# 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 requiring 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