Я работаю на клиенте carddav.В качестве сервера я использую davical v. 0.9.9.6.Я не понимаю, почему я получаю недопустимую ошибку типа содержимого, когда заголовки http содержат правильное значение.Я смотрю в исходный код и нашел это условие:
if ( isset($_SERVER['CONTENT_LENGTH']) && $_SERVER['CONTENT_LENGTH'] > 7) {...
После небольшого исследования я нашел php set $_SERVER['CONTENT_LENGTH']
только с методом POST и загрузкой файла.Есть ли способ настроить php, чтобы всегда устанавливать $_SERVER['CONTENT_LENGTH']
?Я спрашиваю в целом, не только для этого случая ...
// РЕДАКТИРОВАТЬ Я делаю HTTP PUT-запрос к davical серверу (используя php curl).сторона - это условие тестирования CONTENT_LENGTH, которое не установлено.Значит, это давняя ошибка?
// РЕДАКТИРОВАТЬ 2
Наконец-то я это понял!PUT-запрос с функцией обратного вызова readfunc требует установки INFILE_SIZE с помощью curl_setopt (...). Отсутствует автоматическое значение, поэтому вводить поле 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
Второй (правильный) пример
// 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