Cómo reiniciar CURLOPT_CUSTOMREQUEST

Estoy usando una API REST que, entre otras cosas, usa el método DELETE así:

 DELETE /resources/whatever/items/123 

Para acceder a esto usando PHP estoy usando cURL así:

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

Como puede ver, mi instancia de cURL es estática y se reutilizará para llamadas posteriores. Esto funciona bien al cambiar entre los métodos de solicitud “incorporados”. Por ejemplo, en mi método get() , hago algo como esto:

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

y luego ejecuta curl_exec() . Al establecer explícitamente el método de solicitud mediante CURLOPT_HTTPGET , se borrará un posible CURLOPT_POST previo.

Sin embargo, establecer CURLOPT_CUSTOMREQUEST (por ejemplo para DELETE ) anulará cualquier otro método de solicitud incorporado. Eso está bien siempre que quiera DELETE cosas, pero llamar por ejemplo curl_setopt(self::$curl, CURLOPT_HTTPGET, true) no restablecerá el método personalizado; DELETE aún se usará.

He intentado configurar CURLOPT_CUSTOMREQUEST en null , false o en la cadena vacía, pero esto solo dará como resultado una solicitud HTTP como

  /resources/whatever/items/123 

es decir, con la cadena vacía como método, seguido de un espacio, seguido de la ruta.

Sé que podría establecer CURLOPT_CUSTOMREQUEST para GET lugar y hacer solicitudes GET sin ningún problema, pero me pregunto si existe la posibilidad de restablecer CURLOPT_CUSTOMREQUEST .

Esto es realmente un error en PHP, ya que la documentación original establece lo siguiente:

Restaure el valor predeterminado interno estableciendo esto en NULL.

Desafortunadamente, como puede ver en el código fuente , el valor de la opción se convierte en una cadena antes de pasarla a la biblioteca subyacente.

Solución

He escrito una solicitud de extracción que resuelve el problema y permite que se pase NULL para el CURLOPT_CUSTOMREQUEST opción CURLOPT_CUSTOMREQUEST .

El parche anterior tardará un tiempo en fusionarse en el proyecto, por lo que hasta entonces tendría que establecerlo explícitamente una vez que comience a utilizar esta opción.

Actualizar

La solución se ha aplicado a 5.5.11 y 5.6.0 (beta1).

Establezca CURLOPT_CUSTOMREQUEST en NULL y CURLOPT_HTTPGET en TRUE para restablecer a un GET normal.