2012-05-02 8 views
0

私の考えは、LOCKのApache/WebDAVサーバー上のファイルで、PUTはサーバー上の更新バージョン、それ以降はUNLOCKです。cURL/WebDAVを使用してロックを解除する

私は死体で次のことを試してみました:

  1. updated fileなると(死体で)それを保存するためにa file
  2. 編集A.txtを生成するコンテンツa file
  3. GETファイルA.txtでファイルA.txtを作成
  4. GETファイルA.txtまだ収率が得られる

を得死体で

  • 近い編集(VIM)
  • GETファイルA.txt私はGETはそれをSとそれをローカルに変更し、内部で死体LOCKのファイルを推測します。それからそれはPUTとそれはUNLOCKです。

    質問:どうすればこのようにカールできますか?

    問題:接続が遅く、ファイルがPUTの場合、それはまだ完全にはアップロードされていませんが、まだアップロードされている部分のみを取得します。新しいものが完成していない限り古いものを手に入れたいです。

    を試してみました:私は手動でファイルをロックするには、次の(すなわちcURLを持つ)を試してみました:

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

    私は何を得ることである:

    ApacheのログファイルIを見て
    * 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] 
    

    ありがとうございました!!

    更新日:問題の説明を追加しました。乾杯!

  • 答えて

    3

    LOCKメソッドには、取り出したいロックのXML記述を含む本文が必要です。あなたのcURLテストにはこのボディが含まれていなかったので、400エラー応答です。

    しかし、私が正しくあなたの質問を理解していれば、あなたがしたい:

    1. LOCK
    2. PUT
    3. UNLOCK

    それが本当なら、なぜあなたはLOCKを気にし、UNLO​​CKう?ちょうどPUTをしてください!ロックは、ロックを保持している間に複数の操作を実行し、別のクライアントが部分的に変更された状態でオブジェクトを参照したり、オブジェクトを同時に変更したりしないようにする場合にのみ便利です。

    ロックが有効な典型的なケースは、読み取り - 変更 - 書き込みサイクルです。オブジェクトを取得し、ローカルで変更して戻しますが、別のクライアントがそれを取得し、それをPUTしてください。

    1. オブジェクトをGET
    2. それを修正します。ただし、この特定のケースに対処するため、HTTPは、(HTTPのようなステートレスなプロトコルのため不向きである)ロックを使用せずに、問題を解決する別の方法を提供していますローカル
    3. 手順1で返された元のETagを含むIf-Matchヘッダーをオブジェクトに戻します。
    4. PUTの結果が412エラーの場合は、手順1に戻ります。

    UPDATE:あなたの更新の質問に基づいて、私はあなたがPUTとGETの同時操作を行う場合は、新しいファイルを部分的に切り捨てまたはハーフアップロードバージョンを確認していることがわかります。これは残念です。サーバーは、他の要求に関してPUTをアトミックとして扱う必要があります。他のクライアントは古いバージョンまたは新しいバージョンを参照する必要があります。これを真実にするためにクライアント側から行う必要はありません。サーバーで修正する必要があります。

    +0

    私はPUTの低速接続をシミュレートするためにmyServerを絞りました。あなたのポイント3.今度は、完全には送信されませんでしたが、この新しいファイルを取得しようとすることができます。それが、LOCKや何かを置いてみたいという要点です。私が言及したように、死体を使用するとき、それはファイルを見て、それをダウンロードし、変更し、アップロードし、次にそれをアンロックすることがわかります。乾杯! – ezdazuzena

    +0

    更新:私はcadaverを使って同じ問題を抱えているのを見ました:(cadaverで編集したファイルを保存するとアップロードされて同じ問題が発生する – ezdazuzena

    関連する問題