帮酷LOGO
  • 显示原文与译文双语对照的内容
文章标签:RACK  WEB  Webdav  
WebDAV for Rack

  • 源代码名称:dav4rack
  • 源代码网址:http://www.github.com/chrisroberts/dav4rack
  • dav4rack源代码文档
  • dav4rack源代码下载
  • Git URL:
    git://www.github.com/chrisroberts/dav4rack.git
  • Git Clone代码到本地:
    git clone http://www.github.com/chrisroberts/dav4rack
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/chrisroberts/dav4rack
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
  • DAV4Rack - rack的网络创作

    DAV4Rack是一个通过 rack 提供 web dav的框架,允许通过HTTP进行内容创作。 它基于原始的RackDAV框架插件,添加一些有用的新功能:

    • 更好的资源支持,用于构建完全虚拟化的资源结构

    • 通用锁定和资源级别特定锁定

    • 向资源提供虚拟映射的拦截器中间件

    • 映射资源路径

    • 身份验证支持

    • 资源回调

    • 远程文件代理( 包括对远程文件的映射支持)

    • 基于Nokogiri的文档解析与

    如果发现问题,请在github上创建新问题。 如果有修复,请使用 fork,并向我发送请求请求。 如果你只是在这里使用图书馆,享受 !

    安装

    通过RubyGems实现的插件

    gem install dav4rack

    文档

    快速入门

    如果你只想通过 web dav共享一个文件夹,你只需启动一个简单的服务器即可:

    dav4rack

    这将在端口 3000上启动一个 Unicorn 。Mongrel或者WEBrick服务器,你可以在没有身份验证的情况下连接它。 Unicorn和Mongrel要比WEBrick反应得更好,所以如果你有问题,安装其中一个并重启dav4rack进程。 简单的文件资源允许非常基本的身份验证,这是一个例子。 要启用它:

    dav4rack --username=user --password=pass

    rack-处理程序

    在 rack 应用程序中使用DAV4Rack非常简单。 一个非常薄的rackup脚本看起来像这样:

    require 'rubygems'
    require 'dav4rack'
    use Rack::CommonLogger
    run DAV4Rack::Handler.new(:root => '/path/to/public/fileshare')

    这将使用包含的FileResource并设置共享路径。 但是,DAV4Rack有一些漂亮的附加附加项可以在rackup脚本中启用。 首先,一个如何使用自定义资源的示例:

    run DAV4Rack::Handler.new(:resource_class => CustomResource, :custom => 'options', :passed => 'to resource')

    接下来,让我们为 web dav访问映射一个路径。 在本例中,我们将使用默认的FileResource,但不是在 root 目录中使用的web dav内容,将它映射到特定目录: /webdav/share/

    require 'rubygems'
    require 'dav4rack'
    use Rack::CommonLogger
    app = Rack::Builder.new{
     map '/webdav/share/' do
     run DAV4Rack::Handler.new(:root => '/path/to/public/fileshare', :root_uri_path => '/webdav/share/')
     end
    }.to_app
    run app

    除了Builder#map块,注意传递给处理程序初始化的新选项:root_uri_path 。 当DAV4Rack收到请求时,它会自动将请求转换为适当的路径并将它的传递给资源。

    构建rackup脚本时可用的另一个工具是。 拦截器的工作是简单的intecept web dav请求接收到路径层次结构,其中没有当前映射的资源。 例如我们继续最后一个示例,但这次包含拦截器:

    require 'rubygems'
    require 'dav4rack'
    use Rack::CommonLogger
    app = Rack::Builder.new{
     map '/webdav/share/' do
     run DAV4Rack::Handler.new(:root => '/path/to/public/fileshare', :root_uri_path => '/webdav/share/')
     end
     map '/webdav/share2/' do
     run DAV4Rack::Handler.new(:resource_class => CustomResource, :root_uri_path => '/webdav/share2/')
     end
     map '/' do
     use DAV4Rack::Interceptor, :mappings => {
     '/webdav/share/' => {:resource_class => FileResource, :custom => 'option'},
     '/webdav/share2/' => {:resource_class => CustomResource}
     }
     use Rails::Rack::Static
     run ActionController::Dispatcher.new
     end
    }.to_app
    run app

    在这个例子中,我们有两个受路径限制的web dav资源。 这意味着这些资源将处理对/webdav/share/* 和/webdav/share2/*的请求,但。 为了让webdav能够响应,我们提供拦截器。 拦截器不提供任何身份验证支持。 它只是创建一个虚拟文件系统视图到提供的映射路径。 一旦达到实际资源,将根据单个资源定义的要求执行身份验证。 在 root 映射中也注意到,我们正在运行一个 Rails 应用程序。 这是你可以使用 Rails 应用程序轻松地启用DAV4Rack的方法。

    启用日志记录

    DAV4Rack为 Rails 样式格式( 。简单的一致性) 提供了一些简单的日志记录,因这里输出应该看起来很熟悉。

    DAV4Rack::Handler.new(:resource_class => CustomResource, :log_to => '/my/log/file')

    你甚至可以指定日志记录级别:

    DAV4Rack::Handler.new(:resource_class => CustomResource, :log_to => ['/my/log/file', Logger::DEBUG])

    自定义资源

    创建自己的资源很容易。 简单继承 DAV4Rack::Resource 类,然后重新定义你想要自定义的所有方法。 DAV4Rack::Resource 类只有实现方法的实现,该方法可以提供非常通用的。 这意味着大多数事情至少需要某种实现。 但是,由于资源被定义得非常普遍,因这里控制器将请求传递给资源,很容易创建完全虚拟化资源。

    帮助器

    有一些帮助者值得注意,使事情变得更加简单。 dav4rack:: resource#accept_redirect方法可以用于资源。 如果 true,当前连接的客户端将接受并正确使用 302重定向请求。 大多数客户机不能正确支持这一点,当处理可以能位于它的他地方的虚拟文件时会很痛苦。 为了处理那些不支持重定向的客户端,提供了 helper,这样资源就不必处理代理本身。 DAV4Rack::RemoteFile 是一个经过修改的Rack::File,可以做一些有趣的事情。 首先,让我们看看它最基本的用法:

    class MyResource <DAV4Rack::Resource
     def setup
     @item = method_to_fill_this_properly
     end
     def get
     if(accept_redirect?)
     response.redirect item[:url]
     else
     response.body = DAV4Rack::RemoteFile.new(item[:url], :size => content_length, :mime_type => content_type)
     OK
     end
     end
    end

    这是一个简单的代理。 当 rack 接收到消息时,它会从对象中提取一块数据,然后从套接字中提取它,并将它的发送给用户,直到到达为止。 Rack::File 使用的方法相同,但是我们从套接字中提取,而不是从实际文件中提取。 现在,不是每次都从远程服务器代理这些文件,而是缓存它们:

    response.body = DAV4Rack::RemoteFile.new(item[:url], :size => content_length, :mime_type => content_type, :cache_directory => '/tmp')

    提供:cache_directory将允许RemoteFile在本地缓存项目,然后在后面的请求上搜索它们,然后再进入网络。 缓存文件 NAME 基于文件路径。大小和上次修改时间的SHA1哈希。 重要的是要注意,对于S3等服务,路径通常会变化,使这个缓存变得非常无价值。 为了解决这里问题,我们可以提供一个引用来代替:

    response.body = DAV4Rack::RemoteFile.new(item[:url], :size => content_length, :mime_type => content_type, :cache_directory => '/tmp', :cache_ref => item[:static_url])

    这些方法很好,但是让别人处理代理并让进程回来处理实际请求是非常好的。 只要前端服务器正确安装,RemoteFile就会很高兴做到这一点。 使用with方法将告诉RemoteFile简单地传递头,并让服务器处理实际的代理程序。 首先,让我们看看使用所有特性的实现,然后将它的降低到最低限度。 这些示例是特定于 Nginx的,但是基于 Rack::Sendfile 实现,因此应该适用于其他服务器。 首先,简化 Nginx 服务器块:

    server {
     listen 80;
     location/{
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_set_header Host $http_host;
     proxy_set_header X-Sendfile-Type X-Accel-Redirect;
     proxy_set_header X-Accel-Remote-Mapping webdav_redirect
     proxy_pass http://my_app_server;
     }
     location ~*/webdav_redirect {
     internal;
     resolver 127.0.0.1;
     set $r_host $upstream_http_redirect_host;
     set $r_url $upstream_http_redirect_url;
     proxy_set_header Authorization '';
     proxy_set_header Host $r_host;
     proxy_max_temp_file_size 0;
     proxy_pass $r_url;
     }
    }

    就绪后,RemoteFile的参数会稍微改变:

    response.body = DAV4Rack::RemoteFile.new(item[:url], :size => content_length, :mime_type => content_type, :sendfile => true)

    RemoteFile将自动地负责构建正确的路径并发送正确的标题。 如果X-Accel-Remote-Mapping标头不可用,则可以简单地传递该值:

    response.body = DAV4Rack::RemoteFile.new(item[:url], :size => content_length, :mime_type => content_type, :sendfile => true, :sendfile_prefix => 'webdav_redirect')

    如果没有设置X-Sendfile-Type头,你可以通过更改以下值来修复这个问题:

    response.body = DAV4Rack::RemoteFile.new(item[:url], :size => content_length, :mime_type => content_type, :sendfile => 'X-Accel-Redirect', :sendfile_prefix => 'webdav_redirect')

    如果你没有上述内容,因为你的服务器没有配置为tmodel支持,直到它配置完成为止。

    身份验证

    对每个资源基础执行身份验证。 控制器对象将检查资源的Resource#authenticate方法。 如果存在,任何身份验证信息都将传递给该方法。 根据结果,控制器将继续请求,或者发送 401个未授权的响应。

    精确来说,Resource#authentication_realm将检查是否存在,返回字符串将被用作领域。 还将检查Resource#authentication_error_msg是否存在,并在验证失败时将返回的字符串传递到响应中。

    还可以使用回调实现身份验证,如下所述。

    回调

    资源可以以利用回调方便地应用权限。身份验证或者任何需要执行的操作。 回调被应用到所有公开可用的方法。 这对于在资源内部使用的方法很重要。 方法不需要由控制器或者它的他任何人调用,应该作为 protected 或者 private 来降低与回调的交互。

    回调可以在方法调用之前或者之后调用。 例如:

    class MyResource <DAV4Rack::Resource
     before do |resource, method_name|
     resource.send(:my_authentication_method)
     end
     after do |resource, method_name|
     puts"#{Time.now} -> Completed: #{resource}##{method_name}"
     end
     private
     def my_authentication_method
     true
     end
    end

    在这里示例中,MyResource#my_authentication_method将在调用任何 public 方法之前调用。 在任何方法被调用之后,状态行将被打印到 STDOUT 。 在大多数情况下,在大多数方法调用之前运行回调都有点多,因这里回调可以以应用于特定方法:

    class MyResource <DAV4Rack::Resource
     before_get do |resource|
     puts"#{Time.now} -> Received GET request from resource: #{resource}"
     end
    end

    在这个示例中,在调用MyResource#get方法之前,将向STDOUT输出一个简单的状态行。 始终将当前资源对象提供给回调。 方法 NAME 只在回调之前/之后提供给泛型。

    处理系统中 OS X 叶的混乱文件非常方便:

    class MyResource <DAV4Rack::Resource
     after_unlock do |resource|
     resource.delete if resource.name[0,1] == '.'
     end
    end

    由于 OS X 正确实现锁定,我们可以等到它释放文件的锁,如果它是隐藏文件,就删除它。

    回调按定义的顺序调用,因此你可以轻松地在彼此之间建立回调。 这里示例类似:

    class MyResource <DAV4Rack::Resource
     before do |resource, method_name|
     resource.DAV_authenticate unless resource.user.is_a?(User)
     raise Unauthorized unless resource.user.is_a?(User)
     end
     before do |resource, method_name|
     resource.user.allowed?(method_name)
     end
    end

    在本示例中,第二个块检查 User#allowed? 可以以在定义的Resource#user上计算,因为块是按顺序调用的,如果Resource#user不是用户类型,则引发异常。

    避免回调

    在最后一个例子中特别要注意的是认证的DAV_前缀。 提供DAV_前缀将阻止将任何回调应用到给定方法。 这允许我们提供一个 public 方法,回调可以在资源上访问,而不会陷入循环中。

    使用DAV4Rack的软件 !

    Issues/Bugs/Questions

    已知问题

    • 当使用 Nginx ( 这是由于缺少 Nginx 传输编码的) 时,OS X 查找器将失败

    • Windows web dav小型重定向程序失败( 这里客户端非常中断。 欢迎使用修补程序。)

    • web dav规范的许多未实现部分( 始终欢迎使用补丁)

    未知问题

    请使用github上的问题: github.com/chrisroberts/dav4rack/issues

    贡献者

    感谢大家帮助提高这个项目的质量。

    许可证

    RackDAV一样,这个软件在MIT许可下发布。



    文章标签:WEB  RACK  Webdav  

    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语