Как сбросить CURLOPT_CUSTOMREQUEST

Я использую REST API, который, среди прочего, использует метод DELETE следующим образом:

 DELETE /resources/whatever/items/123 

Чтобы получить доступ к этому с помощью PHP, я использую cURL следующим образом:

 self::$curl = curl_init(); curl_setopt_array(self::$curl, array( CURLOPT_AUTOREFERER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_RETURNTRANSFER => true, )); 

Как вы можете видеть, мой экземпляр cURL статичен и будет использоваться повторно для последующих вызовов. Это отлично работает при переключении между «встроенными» запросами. Например, в моем методе get() я делаю что-то вроде этого:

 curl_setopt_array(self::$curl, array( CURLOPT_HTTPGET => true, CURLOPT_URL => self::BASE . 'whatever', )); 

а затем запустите curl_exec() . CURLOPT_HTTPGET образом задав метод запроса через CURLOPT_HTTPGET , будет удален предыдущий CURLOPT_POST .

Однако установка CURLOPT_CUSTOMREQUEST (например, DELETE ) переопределит любой другой встроенный запрос. Это нормально, пока я хочу DELETE вещи, но призывая, например, curl_setopt(self::$curl, CURLOPT_HTTPGET, true) не сбрасывает настраиваемый метод; DELETE прежнему будет использоваться.

Я попытался установить CURLOPT_CUSTOMREQUEST в значение null , false или пустую строку, но это приведет только к HTTP-запросу, например

  /resources/whatever/items/123 

т.е. с пустой строкой как метод, за которой следует пробел, за которым следует путь.

Я знаю, что я мог бы установить CURLOPT_CUSTOMREQUEST вместо GET и делать запросы GET без каких-либо проблем, но мне интересно, есть ли возможность сбросить CURLOPT_CUSTOMREQUEST .

На самом деле это ошибка в PHP, поскольку в исходной документации указано следующее:

Восстановите внутреннее значение по умолчанию, установив для этого значение NULL.

К сожалению, как вы можете видеть из исходного кода , значение параметра передается в строку до того, как оно будет передано в базовую библиотеку.

Решение

Я написал запрос на CURLOPT_CUSTOMREQUEST который решает проблему, и позволяет передавать NULL для CURLOPT_CUSTOMREQUEST параметра CURLOPT_CUSTOMREQUEST .

Вышеупомянутый патч займет некоторое время, чтобы объединиться в проект, поэтому до тех пор вам придется явно установить метод самостоятельно, как только вы начнете использовать этот параметр.

Обновить

Исправление было применено к 5.5.11 и 5.6.0 (beta1).

Установите CURLOPT_CUSTOMREQUEST в NULL и CURLOPT_HTTPGET в TRUE, чтобы вернуться к обычным GET.