Задать вопрос
@ChernovGV

Как отправить put запрос через curl в виде «PUT domain/folder/file.php HTTP/1.1»?

Добрый день. Есть задача отправить файл методом put с определенными заголовками. Делаю так:
$ch = curl_init();
        $fp = fopen($file_path, 'r');
        curl_setopt($ch, CURLOPT_URL, 'http://domain/folder/file.php');
        curl_setopt($ch, CURLOPT_INFILE, $fp);
        curl_setopt($ch, CURLOPT_INFILESIZE, $file['size']);
        curl_setopt($ch, CURLOPT_PUT, true);
        curl_setopt($ch, CURLOPT_UPLOAD, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Date:'.date('c'),
            'Content-MD5:'.$file['hash'],
            'X-Upload-Filename:'. $file['fileName'],
        ));
        curl_setopt($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
        curl_setopt($ch,CURLOPT_USERPWD,$login.":".$pass);
        $result = curl_exec($ch);
        curl_close($ch);
        echo $result;

Формируется адекватный запрос вида:
PUT /folder/file.php HTTP/1.1
Host: domain
Date: 2015-08-28T09:41:49+04:00
Content-Length: 198284
Content-MD5: ea200caec1ed9ef712fddafe4e2361e4
X-Upload-Filename: file_name.ext

Но сервер отвечает:
HTTP/1.1 400 Bad Request
Пробовал слать файл на наш сервер, там все ок, файл успешно отправляется и принимается.

Написал в тех поддержку, сказали что запрос должен иметь такой вид:
PUT http://domain/folder/file.php HTTP/1.1
Host: domain
Date: 2015-08-28T09:41:49+04:00
Content-Length: 198284
Content-MD5: ea200caec1ed9ef712fddafe4e2361e4
X-Upload-Filename: file_name.ext


Хоть я не совсем уверен в адекватности ответа тех.поддержки, но тем не менее задам вопрос:
Как сформировать запрос вида "PUT domain/folder/file.php HTTP/1.1" ?
  • Вопрос задан
  • 6215 просмотров
Подписаться 1 Оценить Комментировать
Ответ пользователя Павел Волынцев К ответам на вопрос (3)
copist
@copist
Empower people to give
Потестируй на своём собственном веб-сервере. Создай страницу, которая будет просто вываливать все заголовки запроса

<?php
var_dump($_SERVER);


Добейся, чтобы в твоём запросе были все указанные заголовки

Нужные заголовки добавляются в запрос отдельными командами
$headers = array(
    /* условно, добавить/удалить при необходимости */
    'date' => '2015-08-28T09:41:49+04:00',
    'content-length' => '198284',
    'content-md5' => 'ea200caec1ed9ef712fddafe4e2361e4',
    'x-upload-filename' => 'file_name.ext',
);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);


Знаю, что PUT запрос лучше отправлять по другому:
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PUT'); // вместо curl_setopt($ch, CURLOPT_PUT, true);
// и обязательно заголовок передать array('content-length' => 'число байт в файле')
Ответ написан