81 lines
2.1 KiB
Ruby
81 lines
2.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require File.dirname(__FILE__) + '/logger'
|
|
|
|
module Dav4rack
|
|
class Handler
|
|
include Dav4rack::HttpStatus
|
|
|
|
# Options:
|
|
#
|
|
# - resource_class: your Resource implementation
|
|
# - controller_class: custom Controller implementation (optional).
|
|
# - root_uri_path: Path the handler is mapped to. Any resources
|
|
# instantiated will only see the part of the path below this root.
|
|
# - recursive_propfind_allowed (true) : set to false to disable
|
|
# potentially expensive Depth: Infinity propfinds
|
|
# - all options are passed on to your resource implementation and are
|
|
# accessible there as @options.
|
|
#
|
|
def initialize(options={})
|
|
@options = options.dup
|
|
|
|
Logger.set(*@options[:log_to])
|
|
end
|
|
|
|
def call(env)
|
|
start = Time.now
|
|
request = setup_request env
|
|
response = Rack::Response.new
|
|
|
|
Logger.info "Processing WebDAV request: #{request.path} (for #{request.ip} at #{Time.now}) [#{request.request_method}]"
|
|
|
|
controller = setup_controller request, response
|
|
controller.process
|
|
postprocess_response response
|
|
|
|
# Apache wants the body dealt with, so just read it and junk it
|
|
buf = true
|
|
buf = request.body.read(8192) while buf
|
|
|
|
if Logger.debug? and response.body.is_a?(String)
|
|
Logger.debug "Response String:\n#{response.body}"
|
|
end
|
|
Logger.info "Completed in: #{((Time.now.to_f - start.to_f) * 1000).to_i} ms | #{response.status} [#{request.url}]"
|
|
|
|
response.finish
|
|
|
|
rescue Exception => e
|
|
Logger.error "WebDAV Error: #{e}"
|
|
raise e
|
|
end
|
|
|
|
|
|
private
|
|
|
|
|
|
def postprocess_response(response)
|
|
if response.body.is_a?(String)
|
|
response['Content-Length'] ||= response.body.length.to_s
|
|
end
|
|
response.body = [response.body] unless response.body.respond_to?(:each)
|
|
end
|
|
|
|
|
|
def setup_request(env)
|
|
::Dav4rack::Request.new env, @options
|
|
end
|
|
|
|
|
|
def setup_controller(request, response)
|
|
controller_class.new(request, response, @options)
|
|
end
|
|
|
|
def controller_class
|
|
@options[:controller_class] || ::Dav4rack::Controller
|
|
end
|
|
|
|
end
|
|
|
|
end
|