@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" ?
  • Вопрос задан
  • 6199 просмотров
Решения вопроса 1
@ChernovGV Автор вопроса
В общем проблема была в заголовках, хеш нужно было перевести в base64. Не информативная ошибка "HTTP/1.1 400 Bad Request" возвращалась скриптом валидации.
Но это частный случай.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@magazovski
Если у вас не https, попробуйте указать данный домен в качестве прокси сервера. Источник.

curl 'http://yandex.ru/search/?lr=213&text=hello' -X POST -x yandex.ru:80 -v -o /dev/null

* Connected to yandex.ru (5.255.255.5) port 80 (#0)
> POST http://yandex.ru/search/?lr=213&text=hello HTTP/1.1
> Host: yandex.ru
> User-Agent: curl/7.43.0
> Accept: */*
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 404 Not Found
< Date: Fri, 04 Sep 2015 08:05:16 GMT
< Content-Type: text/html; charset=UTF-8
< Cache-Control: no-cache,no-store,max-age=0,must-revalidate
< Expires: Fri, 04 Sep 2015 08:05:16 GMT
< Last-Modified: Fri, 04 Sep 2015 08:05:16 GMT
< P3P: policyref="/w3c/p3p.xml", CP="NON DSP ADM DEV PSD IVDo OUR IND STP PHY PRE NAV UNI"
< Set-Cookie: yandexuid=7466500011441353916; Expires=Mon, 01-Sep-2025 08:05:16 GMT; Domain=.yandex.ru; Path=/
< X-XSS-Protection: 1; mode=block
< X-Content-Type-Options: nosniff
< Content-Length: 21783
<
{ [861 bytes data]
100 21783  100 21783    0     0   126k      0 --:--:-- --:--:-- --:--:--  126k
* Connection #0 to host yandex.ru left intact
Ответ написан
Комментировать
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' => 'число байт в файле')
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы