私はcarddavクライアントに取り組んでいます。サーバーとして、davicalv。0.9.9.6を使用します。httpヘッダーに正しい値が含まれていると、無効なコンテンツタイプエラーが発生する理由がわかりません。ソースコードを調べたところ、次の状態が見つかりました。
if ( isset($_SERVER['CONTENT_LENGTH']) && $_SERVER['CONTENT_LENGTH'] > 7) {...
少し調べてみたところ$_SERVER['CONTENT_LENGTH']
、POSTメソッドとアップロードファイルのみで設定されたphpが見つかりました。常に設定するようにphpを構成する方法はあります$_SERVER['CONTENT_LENGTH']
か?この場合だけでなく、一般的に質問しています...
//編集(php curlを使用して)davicalサーバーにHTTPPUTリクエストを実行しています。
PUT /caldav.php/testuser/contacts/newc.vcf HTTP/1.1
Host: davical
Content-Type: text/vcard;
BEGIN:VCARD
VERSION:3.0
FN:ME
...
davical側には、設定されていないCONTENT_LENGTHの条件テストがあります。それで、それは大胆なバグですか?
//編集2
最後に私はそれを理解します!calback readfuncを使用したPUTリクエストでは、curl_setopt(...)を介してINFILE_SIZEを設定する必要があります。自動値はなく、Content-Lengthフィールドを手動でヘッダーに配置することも間違っています。例(不正解):
// PUT REQUEST
curl_setopt($ch,CURLOPT_HTTPHEADER,"Content-Length: $length"); //mistake
curl_setopt($ch,CURLOPT_PUT,true);
curl_setopt($ch,CURLOPT_READFUNCTION,array($this,'readfunc'));
....
--------------------------------------------------------------
// WIRESHARK TCP STREAM DUMP
PUT /caldav.php/testuser/contacts/novy.vcf HTTP/1.1
Authorization: Basic xxxxxxxxxxxxxxx
Host: davical
Accept: */*
Content-Type: text/vcard
Content-Length: xxx
Expect: 100-continue
HTTP/1.1 100 Continue
155
BEGIN:VCARD
VERSION:3.0
...
END:VCARD
0
HTTP/1.1 200 OK
----------------------------------------------------------------
// On server side
isset($_SERVER['CONTENT_LENGTH'])==false
2番目の(正しい)例
// PUT REQUEST
curl_setopt($ch,CURLOPT_INFILESIZE,$length);
curl_setopt($ch,CURLOPT_PUT,true);
curl_setopt($ch,CURLOPT_READFUNCTION,array($this,'readfunc'));
....
--------------------------------------------------------------
// WIRESHARK TCP STREAM DUMP
PUT /caldav.php/testuser/contacts/novy.vcf HTTP/1.1
Authorization: Basic xxxxxxxxxxxxxxx
Host: davical
Accept: */*
Content-Type: text/vcard
Content-Length: xxx
Expect: 100-continue
HTTP/1.1 100 Continue
BEGIN:VCARD
VERSION:3.0
...
END:VCARD
HTTP/1.1 200 OK
----------------------------------------------------------------
// On server side
isset($_SERVER['CONTENT_LENGTH'])==true