Почему PHP cURL в Linux изменяет заголовок запроса Content-Type?
Кажется, встроенный в PHP модуль cURL изменяет поля заголовка перед их отправкой.
Я разработал небольшой класс для связи с устройством кодировщика через HTTP-запросы, используя для этого задачу cURL. Код прекрасно работает под Windows, однако, когда я запускаю его под Debian, устройство отвечает ошибкой HTTP 406.
Код ошибки указывает, что сервер не может ответить в запрошенном формате. ( Подробнее)
Это странно, поскольку тип ответа определяется расширением URL (и возможными режимами являются xml и json), и я не устанавливал явно Accept
параметр в шапке.
С использованием CURLOPT_VERBOSE
параметр, он сбрасывает следующие данные:
* Hostname was NOT found in DNS cache
* Trying 172.19.0.9...
* Connected to 172.19.0.9 (172.19.0.9) port 1080 (#0)
* successfully set certificate verify locations:
* CAfile: none
CApath: /etc/ssl/certs
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* Server certificate:
* subject: C=US; ST=Illinois; L=Lake Forest; O=Haivision Network Video, Inc.; OU=PRODUCT DEVELOPMENT; CN=localhost.localdomai n; emailAddress=support@haivision.com
* start date: 2016-01-22 14:40:48 GMT
* expire date: 2026-01-19 14:40:48 GMT
* issuer: C=US; ST=Illinois; L=Lake Forest; O=Haivision Network Video, Inc.; OU=PRODUCT DEVELOPMENT; CN=localhost.localdomain ; emailAddress=support@haivision.com
* SSL certificate verify result: self signed certificate (18), continuing anyway.
> POST /ecs/auth.xml HTTP/1.1
Host: 172.19.0.9:1080
Accept: */*
Content-Length: 86
Content-Type: application/x-www-form-urlencoded
* upload completely sent off: 86 out of 86 bytes
< HTTP/1.1 406 Not Acceptable
* Server nginx is not blacklisted
< Server: nginx
< Date: Fri, 01 Apr 2016 08:45:30 GMT
< Content-Type: application/xml
< Content-Length: 135
< Connection: keep-alive
<
* Connection #0 to host 172.19.0.9 left intact
Похоже, Content-Type: application/xml
изменился на application/x-www-form-urlencoded
, и я думаю, что это главная причина, почему запрос так неудачно.
Массив, передаваемый в curl_setopts()
функция выглядит так:
array(11) {
[19913]=>
bool(true)
[64]=>
bool(false)
[52]=>
bool(false)
[68]=>
int(10)
[10023]=>
array(5) {
["Authorization"]=>
string(10) "Basic ==Og"
["Cache-Control"]=>
string(8) "no-cache"
["Content-Type"]=>
string(15) "application/xml"
["Connection"]=>
string(10) "keep-alive"
["Content-Length"]=>
int(86)
}
[20079]=>
array(2) {
[0]=>
object(Pest)#43 (6) {
["curl_opts"]=>
array(9) {
[19913]=>
bool(true)
[64]=>
bool(false)
[52]=>
bool(false)
[68]=>
int(10)
[10023]=>
array(0) {
}
[20079]=>
*RECURSION*
[81]=>
int(0)
[84]=>
int(2)
[41]=>
bool(true)
}
["base_url"]=>
string(23) "https://172.19.0.9:1080"
["last_response"]=>
NULL
["last_request"]=>
NULL
["last_headers"]=>
NULL
["throw_exceptions"]=>
bool(true)
}
[1]=>
string(13) "handle_header"
}
[81]=>
int(0)
[84]=>
int(2)
[41]=>
bool(true)
[10036]=>
string(4) "POST"
[10015]=>
string(86) "<?xml version="1.0" encoding="UTF-8"?>
<user username="#########" password="########"/>
"
Как видите, нет Accept
тег, и тип содержимого установлен на application/xml
,
Итак, вот мой вопрос: почему curl меняет заголовок запроса? Если корни проблемы в чем-то другом, то по какой причине это работает на Win10, а не на Debian Jessie?
Обновление (16. 04. 04.):
Забавно, что та же версия библиотеки cURL не работает в PHP, но работает в cli:
curl -X POST -H "Authorization: Basic aGFpYWRtaW46bWFuYWdlcg==" -H "Content-Type: application/xml" -H "Cache-Control: no-cache" -H "Postman-Token: 760f1aac-619f-4b64-ec06-0146554fcecf" -d '<?xml version="1.0"?><user username="########" password="#######" />' "https://172.19.0.9:1080/ecs/auth.xml"
<?xml version="1.0"?>
<sessionid value="fd7b8fd0-ac5e-4f72-a01c-142082de24f1"/>
Версия CURL для linux: 7.26.0 (x86_64-pc-linux-gnu) libcurl / 7.26.0.
Заранее спасибо, и извините за стену текста.