我的想法是LOCK
apache / WebDAV服务器上的文件,PUT
服务器上的文件的更新版本以及之后的UNLOCK
。
我刚用尸体试过以下内容:
A.txt
a file
GET
文件A.txt
,产生a file
A.txt
修改为updated file
并保存(在尸体中)GET
文件A.txt
,其产量仍为a file
GET
文件A.txt
,产生updated file
我猜内部尸体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]
感谢任何暗示!!
更新:我添加了我的问题说明..干杯!
答案 0 :(得分:3)
LOCK
方法需要一个正文,其中包含您要取出的锁的XML描述。您的cURL测试不包括此正文,因此400错误响应。
但如果我理解你的问题,你想:
如果这是真的,你为什么要打扰LOCK和UNLOCK?只是做PUT!只有当您想要在持有锁时执行多个操作并且避免让另一个客户端看到处于部分修改状态的对象或者(可能更糟)与您同时修改对象时,锁才有用。
锁定可能有用的典型情况是读取 - 修改 - 写入循环:您希望获取对象,在本地修改它并将其丢回,但禁止其他客户端在您获取GET的时间之间进行竞争性更改它和它的时间。但是,为了处理这种特定情况,HTTP提供了一种解决问题的不同方法,而不使用锁(不适合像HTTP这样的无状态协议):
更新:根据您更新的问题,如果您与PUT并发执行GET,我会看到您看到新文件的部分截断或半上传版本。这很不幸。服务器应该将PUT视为与其他请求相关的原子。其他客户端应该看到旧版本或新版本,而不是其中的状态。从客户端开始,您无需做任何事情就可以做到这一点。它应该在服务器中修复。