httpClient, Разбор заголовков при редиректе

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
Heggi
Сообщения: 2
Зарегистрирован: 2017.05.11, 16:03

httpClient, Разбор заголовков при редиректе

Сообщение Heggi » 2017.10.30, 09:22

Вчера побеждал работу с API с oAuth2 аутентификацией, натолкнулся на багофичу php при работе с заголовками.
Суть в том, что когда грузим контент с указанного URI, а там (внезапно) редирект (HTTP Code 301) на другой URI, то в итоге в переменную $http_response_header попадают заголовки как оригинального запроса, так и того, куда нас редиректнуло.
При этом в httpClient не срабатывает автоопределение типа контента, т.к. для анализа берется первый заголовок Content-Type (который выдавался при редиректе, а он может отличаться)

Код для понимания сути:

Код: Выделить всё

$responseContent = file_get_contents('https://esi.tech.ccp.is/latest/universe/regions');
$responseHeaders = $http_response_header;
var_dump($responseHeaders);

Код: Выделить всё

array(27) {
  [0]=>
  string(30) "HTTP/1.0 301 Moved Permanently"
  [1]=>
  string(35) "Location: /latest/universe/regions/"
  [2]=>
  string(35) "Date: Sun, 29 Oct 2017 19:11:32 GMT"
  [3]=>
  string(18) "Content-Length: 60"
  [4]=>
  string(38) "Content-Type: text/html; charset=utf-8"
  [5]=>
  string(15) "Via: 1.1 google"
  [6]=>
  string(14) "Alt-Svc: clear"
  [7]=>
  string(15) "HTTP/1.0 200 OK"
  [8]=>
  string(38) "Access-Control-Allow-Credentials: true"
  [9]=>
  string(69) "Access-Control-Allow-Headers: Content-Type,Authorization,X-User-Agent"
  [10]=>
  string(41) "Access-Control-Allow-Methods: GET,OPTIONS"
  [11]=>
  string(30) "Access-Control-Allow-Origin: *"
  [12]=>
  string(51) "Access-Control-Expose-Headers: Content-Type,Warning"
  [13]=>
  string(27) "Access-Control-Max-Age: 600"
  [14]=>
  string(19) "Content-Length: 901"
  [15]=>
  string(30) "Content-Type: application/json"
  [16]=>
  string(35) "Date: Sun, 29 Oct 2017 12:20:10 GMT"
  [17]=>
  string(42) "ETag: W/"8c76d9724a0581bb6c256c807fd0649f""
  [18]=>
  string(38) "Expires: Mon, 30 Oct 2017 11:05:00 GMT"
  [19]=>
  string(44) "Last-Modified: Sun, 29 Oct 2017 11:14:24 GMT"
  [20]=>
  string(43) "Strict-Transport-Security: max-age=31536000"
  [21]=>
  string(29) "X-Esi-Error-Limit-Remain: 100"
  [22]=>
  string(27) "X-Esi-Error-Limit-Reset: 50"
  [23]=>
  string(15) "Via: 1.1 google"
  [24]=>
  string(21) "Cache-Control: public"
  [25]=>
  string(10) "Age: 24682"
  [26]=>
  string(14) "Alt-Svc: clear"
}
В первом заголовке (который возвращается при редиректе) - Content-Type: text/html; charset=utf-8
А во втором (когда уже пошли реальные данные) - Content-Type: application/json
Если этот URI запросить через httpClient, то функция getData() возвратит исключение "Unable to detect format for content parsing", т.к. для анализа берет первый заголовок.


zelenin
Сообщения: 10099
Зарегистрирован: 2013.04.20, 11:30

Re: httpClient, Разбор заголовков при редиректе

Сообщение zelenin » 2017.10.31, 10:52

это так работает streamовый api (транспорт по умолчанию в клиенте). Курл возвращает хэдеры только последнего запроса.
В guzzle кстати для streamhandler нельзя задать follow_location (вероятно из-за этого).

Ответить