Доброго времени суток. Столкнулся со следующей проблемой:
Делаю через Curl запросы к некому API, в случае успешного выполнения запроса API отвечает HTTP кодом - 204 No Content, в случае ошибки - кодом 400 Bad Request.
Если выполнить запрос через командную строку консоли - все замечательно работает:
root@srv:~# curl -X DELETE -H 'Content-Type: application/json' -H 'Authorization: Bearer ...' "https://example.com/v2/droplets/944" -vvv
* About to connect() to example.com port 443 (#0)
...
> DELETE /v2/droplets/944 HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: example.com
> Accept: */*
> Content-Type: application/json
> Authorization: Bearer ...
>
< HTTP/1.1 204 No Content
< Server: nginx/1.2.6 (Ubuntu)
< Date: Tue, 09 Jun 2015 17:23:02 GMT
< Content-Type: application/json
< Connection: keep-alive
< X-Powered-By: PHP/5.4.9-4ubuntu2
< Set-Cookie: PHPSESSID=tmljg2ujbjhcil6f9dq3tkqd92; path=/; domain=example.com
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< Pragma: no-cache
<
* Connection #0 to host example.com left intact
* Closing connection #0
Если выполнить такой же запрос из php через модуль Curl, получим следующий лог:
...
> DELETE /v2/droplets/948 HTTP/1.1
User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
Host: example.com
Accept: */*
Authorization: Bearer ...
Content-Type: application/json
< HTTP/1.1 204 No Content
* Server nginx/1.2.6 (Ubuntu) is not blacklisted
< Server: nginx/1.2.6 (Ubuntu)
< Date: Tue, 09 Jun 2015 18:13:43 GMT
< Content-Type: application/json
< Connection: keep-alive
< X-Powered-By: PHP/5.4.9-4ubuntu2
< Set-Cookie: PHPSESSID=10pk7966c671sm6tmg0f6i2212; path=/; domain=example.com
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< Pragma: no-cache
<
* Connection #0 to host example.com left intact
* Found bundle for host example.com: 0x7f89bb045070
* Re-using existing connection! (#0) with host example.com
* Connected to example.com (1.2.3.4) port 443 (#0)
> DELETE /v2/droplets/948 HTTP/1.1
User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
Host: example.com
Accept: */*
Authorization: Bearer ...
Content-Type: application/json
< HTTP/1.1 400 Bad Request
* Server nginx/1.2.6 (Ubuntu) is not blacklisted
< Server: nginx/1.2.6 (Ubuntu)
< Date: Tue, 09 Jun 2015 18:13:43 GMT
< Content-Type: application/json
< Transfer-Encoding: chunked
< Connection: keep-alive
< X-Powered-By: PHP/5.4.9-4ubuntu2
< Set-Cookie: PHPSESSID=53t03kum02qob3mujjlt0n7vv6; path=/; domain=example.com
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< Pragma: no-cache
<
* Connection #0 to host example.com left intact
В первой части лога видно что запрос выполнился как нужно, но потом по каким то необъяснимым причинам:
Re-using existing connection!
Запрос выполняется снова... На что мы получаем совершенно легальный ответ 400 Bad Request, т.к. первый запрос выполнил удаление необходимого объекта, второй запрос попытался удалить его снова. Соответственно в PHP всегда возвращается статус 400 Bad Request - как при успешном, так и не успешном выполнении операции.
Такое ощущение что модуль php curl когда получает статусы типа 204, думает, а не сделать ли мне еще запрос т.к. контент не получен, и делает его.
Подскажите пожалуйста как это можно побороть? Я не нашел ни одного подходящего параметра для curl запрещающего делать повторный запрос.
Спасибо!