Apache 使用cURL/WebDAV锁定放置解锁

Apache 使用cURL/WebDAV锁定放置解锁,apache,curl,locking,webdav,cadaver,Apache,Curl,Locking,Webdav,Cadaver,我的想法是锁定apache/WebDAV服务器上的一个文件,将它的更新版本放到服务器上,然后解锁它 我刚刚用尸体做了以下尝试: 创建一个包含内容的文件a.txt GETfileA.txt生成A文件 编辑A.txt成为更新文件,并将其保存(在尸体中) GETfileA.txt生成的文件仍然会生成A文件 在尸体中关闭编辑(VIM) GETfileA.txt生成更新文件 我猜内部尸体LOCKs文件,GETs文件并在本地更改它。然后它PUTs它和UNLOCKs它 问题:我如何使用卷发来实现这一点 问题:

我的想法是
锁定apache/WebDAV服务器上的一个文件,
将它的更新版本放到服务器上,然后
解锁它

我刚刚用尸体做了以下尝试:

  • 创建一个包含内容的文件
    a.txt
  • GET
    file
    A.txt
    生成
    A文件
  • 编辑
    A.txt
    成为
    更新文件
    ,并将其保存(在尸体中)
  • GET
    file
    A.txt
    生成的文件仍然会生成
    A文件
  • 在尸体中关闭编辑(VIM)
  • GET
    file
    A.txt
    生成
    更新文件
  • 我猜内部尸体
    LOCK
    s文件,
    GET
    s文件并在本地更改它。然后它
    PUT
    s它和
    UNLOCK
    s它

    问题:我如何使用卷发来实现这一点

    问题:当连接速度慢时,我对一个尚未完全上传的文件执行
    放置
    ,我只得到尚未上传的部分。我想买旧的,只要新的不完整

    尝试了:我尝试了以下手动锁定文件(即使用cURL):

    我得到的是:

    * About to connect() to myServer port 80 (#0)
    *   Trying xx.xx.xxx.xxx... connected
    * Connected to myServer (xx.xx.xxx.xxx) port 80 (#0)
    * Server auth using Basic with user 'user'
    > LOCK /newFile HTTP/1.1
    > Authorization: Basic xxxxxxxxxxxxxxxxx
    > User-Agent: curl/7.21.6 (x86_64-pc-linux-gnu) libcurl/7.21.6 OpenSSL/1.0.0e zlib/1.2.3.4 libidn/1.22 librtmp/2.3
    > Host: myServer
    > Accept: */*
    > 
    < HTTP/1.1 400 Bad Request
    < Date: Wed, 02 May 2012 15:20:55 GMT
    < Server: Apache/2.2.3 (CentOS)
    < Content-Length: 226
    < Connection: close
    < Content-Type: text/html; charset=iso-8859-1
    < 
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>400 Bad Request</title>
    </head><body>
    <h1>Bad Request</h1>
    <p>Your browser sent a request that this server could not understand.<br />
    </p>
    </body></html>
    * Closing connection #0
    
    谢谢你的提示


    更新:我添加了问题描述。。干杯

    方法需要一个包含要取出的锁的XML描述的主体。你的卷曲测试没有包括这个主体,因此400错误响应

    但如果我正确理解你的问题,你想:

  • 解锁
  • 如果这是真的,你为什么要为锁和开锁而烦恼呢?就这么做吧!只有当您希望在持有锁的同时执行多个操作,并且避免另一个客户端看到处于部分修改状态的对象,或者(可能更糟)与您同时修改对象时,锁才有用

    锁定可能有用的典型情况是读-修改-写循环:您希望获取对象,在本地修改它,然后将其放回,但不允许另一个客户端在获取对象和放置对象的时间之间进行竞争性更改。但是,对于处理这种特定情况,HTTP提供了一种不同的解决问题的方法,而不使用锁(锁不适合HTTP这样的无状态协议):

  • 获取对象
  • 在本地修改它
  • 使用包含步骤1中返回的原始ETag的标头放回对象
  • 如果PUT导致412错误,请返回步骤1。否则,你就完了

  • 更新:根据您更新的问题,我发现如果您执行GET并发PUT,您将看到新文件的部分截断或半上载版本。这是不幸的。对于其他请求,服务器应将PUT视为原子。其他客户端应该看到旧版本或新版本,而不是介于两者之间的状态。您不需要从客户端执行任何操作来实现这一点。它应该在服务器中修复。

    方法需要一个包含要取出的锁的XML描述的主体。你的卷曲测试没有包括这个主体,因此400错误响应

    但如果我正确理解你的问题,你想:

  • 解锁
  • 如果这是真的,你为什么要为锁和开锁而烦恼呢?就这么做吧!只有当您希望在持有锁的同时执行多个操作,并且避免另一个客户端看到处于部分修改状态的对象,或者(可能更糟)与您同时修改对象时,锁才有用

    锁定可能有用的典型情况是读-修改-写循环:您希望获取对象,在本地修改它,然后将其放回,但不允许另一个客户端在获取对象和放置对象的时间之间进行竞争性更改。但是,对于处理这种特定情况,HTTP提供了一种不同的解决问题的方法,而不使用锁(锁不适合HTTP这样的无状态协议):

  • 获取对象
  • 在本地修改它
  • 使用包含步骤1中返回的原始ETag的标头放回对象
  • 如果PUT导致412错误,请返回步骤1。否则,你就完了

  • 更新:根据您更新的问题,我发现如果您执行GET并发PUT,您将看到新文件的部分截断或半上载版本。这是不幸的。对于其他请求,服务器应将PUT视为原子。其他客户端应该看到旧版本或新版本,而不是介于两者之间的状态。您不需要从客户端执行任何操作来实现这一点。它应该在服务器中修复。

    我关闭了myServer以模拟PUT的慢速连接,例如您的第3点。现在发生的事情是,我可以尝试获取这个新文件,尽管它没有完全传输。这就是重点,我想在这里放些锁什么的。正如我提到的,当使用尸体时,我看到,它会查看文件,下载,更改,上传,然后解锁。干杯更新:我发现,我在使用尸体时遇到了同样的问题:(当保存在cadaver中编辑的文件时,它会上载它,我遇到了同样的问题。我关闭了myServer,以模拟PUT的慢速连接,例如,你的第3点。现在发生的是,我可以尝试获取这个新文件,尽管它没有完全传输。这就是我想要锁定的地方。正如我提到的,当使用cadaver时,我看到,它会查看文件,下载,更改,上载,然后解锁。干杯!更新:我看到,我在使用cadaver时也遇到同样的问题:(保存在cadaver中编辑的文件时)
    * About to connect() to myServer port 80 (#0)
    *   Trying xx.xx.xxx.xxx... connected
    * Connected to myServer (xx.xx.xxx.xxx) port 80 (#0)
    * Server auth using Basic with user 'user'
    > LOCK /newFile HTTP/1.1
    > Authorization: Basic xxxxxxxxxxxxxxxxx
    > User-Agent: curl/7.21.6 (x86_64-pc-linux-gnu) libcurl/7.21.6 OpenSSL/1.0.0e zlib/1.2.3.4 libidn/1.22 librtmp/2.3
    > Host: myServer
    > Accept: */*
    > 
    < HTTP/1.1 400 Bad Request
    < Date: Wed, 02 May 2012 15:20:55 GMT
    < Server: Apache/2.2.3 (CentOS)
    < Content-Length: 226
    < Connection: close
    < Content-Type: text/html; charset=iso-8859-1
    < 
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>400 Bad Request</title>
    </head><body>
    <h1>Bad Request</h1>
    <p>Your browser sent a request that this server could not understand.<br />
    </p>
    </body></html>
    * Closing connection #0
    
    [Wed May 02 15:20:55 2012] [error] [client xx.xx.xxx.xxx] The lock refresh for /newFile failed because no lock tokens were specified in an "If:" header.  [400, #0]
    [Wed May 02 15:20:55 2012] [error] [client xx.xx.xxx.xxx] (20)Not a directory: No locktokens were specified in the "If:" header, so the refresh could not be performed.  [400, #103]