LOCK PUT UNLOCK with cURL / WebDAV

时间:2012-05-02 15:42:07

标签: apache curl locking webdav cadaver

我的想法是LOCK apache / WebDAV服务器上的文件,PUT服务器上的文件的更新版本以及之后的UNLOCK

我刚用尸体试过以下内容:

  1. 创建内容为A.txt
  2. 的文件a file
  3. GET文件A.txt,产生a file
  4. A.txt修改为updated file并保存(在尸体中)
  5. GET文件A.txt,其产量仍为a file
  6. 在尸体中关闭编辑(VIM)
  7. GET文件A.txt,产生updated file
  8. 我猜内部尸体LOCK是文件,GET是它并在本地更改它。然后是它PUT和它UNLOCK

    问题:如何使用curl执行此操作?

    问题:当连接速度很慢且我为文件执行PUT时,尚未完全上传,我只收到尚未上传的部分。只要新的不完整,我想得到旧的。

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

    curl -v -X LOCK --user "user:password" http://myServer/newFile
    

    我得到的是:

    * 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
    

    查看apache日志文件,我发现:

    [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]
    

    感谢任何暗示!!

    更新:我添加了我的问题说明..干杯!

1 个答案:

答案 0 :(得分:3)

LOCK方法需要一个正文,其中包含您要取出的锁的XML描述。您的cURL测试不包括此正文,因此400错误响应。

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

  1. LOCK
  2. PUT
  3. UNLOCK
  4. 如果这是真的,你为什么要打扰LOCK和UNLOCK?只是做PUT!只有当您想要在持有锁时执行多个操作并且避免让另一个客户端看到处于部分修改状态的对象或者(可能更糟)与您同时修改对象时,锁才有用。

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

    1. 获取对象
    2. 在本地修改
    3. 使用包含步骤1中返回的原始ETag的If-Match标头返回对象
    4. 如果PUT导致412错误,请返回步骤1.否则,您已完成。
    5. 更新:根据您更新的问题,如果您与PUT并发执行GET,我会看到您看到新文件的部分截断或半上传版本。这很不幸。服务器应该将PUT视为与其他请求相关的原子。其他客户端应该看到旧版本或新版本,而不是其中的状态。从客户端开始,您无需做任何事情就可以做到这一点。它应该在服务器中修复。