PHP curl сбрасывает контент-длину, если CURLOPT_POST установлен с помощью curl_setopt_array? - PullRequest
2 голосов
/ 02 ноября 2011

Похоже, curl_setopt_array отличается от нескольких вызовов curl_setopt. Рассмотрим этот сценарий:

$ch = curl_init('http://www.stackoverflow.com/');

[options]

curl_exec($ch);

var_dump(curl_getinfo($ch));

Теперь он отправляет правильный запрос, если [options] является одним из них:

curl_setopt_array($ch, array(
  CURLOPT_POST => true,
  CURLOPT_POSTFIELDS => array('a' => 'b'),
));

или

curl_setopt_array($ch, array(
  CURLOPT_POSTFIELDS => array('a' => 'b'),
));

или

curl_setopt($ch, CURLOPT_POSTFIELDS, 'a=b');
curl_setopt($ch, CURLOPT_POST, 1);

НО НЕ так:

curl_setopt_array($ch, array(
  CURLOPT_POSTFIELDS => array('a' => 'b'),
  CURLOPT_POST => true,
));

Кажется, что длина содержимого сбрасывается, если CURLOPT_POST установлено после CURLOPT_POSTFIELDS. За исключением того, что это работает нормально, если установлено с curl_setopt вместо curl_setopt_array.

Почему это?

1 Ответ

2 голосов
/ 02 ноября 2011

Когда вы указываете CURLOPT_POST, сообщение отправляется как application/x-www-form-urlencoded.

Но со страницы руководства curl_setopt:

Передача массива в CURLOPT_POSTFIELDS будет кодировать данные как multipart / form-data, при передаче строки в кодировке URL будет кодировать данные как application / x-www-form-urlencoded.

Так что, когда вы делаете

curl_setopt_array($ch, array(
  CURLOPT_POSTFIELDS => array('a' => 'b'),  // multipart/form-data
  CURLOPT_POST => true,                     // application/x-www-form-urlencoded
));

Данные устанавливаются как mulpart/form-data (путем установки CURLOPT_POSTFIELDS в массив), а затем сбрасываются как application/x-www-form-urlencoded (путем установки CURLOPT_POST в значение true).

Другие примеры работают, потому что вы не меняете тип после того, как данные установлены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...