Что может заставить драйвер Goutte не следовать перенаправлению? - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть тест PHPUnit Mink, который проверяет наличие некоторых перенаправлений HTTP.

Это преуменьшено, но тест по существу выглядит так, где testRedirect() подается @dataProvider:

class Testbase extends BrowserTestCase {

  public static $browsers = [
    [
      'driver' => 'goutte',
    ],
  ];

  public function testRedirect($from, $to) {
    $session = $this->getSession();
    $session->visit($from);

    $this->assertEquals(200, $session->getDriver()->getStatusCode(), sprintf('Final destination from %s was a 200', $to));
    $this->assertEquals($to, $session->getCurrentUrl(), sprintf('Redirected from %s to %s', $from, $to));
  }

}

Это прекрасно работает для перенаправлений, которые обрабатываются на самом веб-сервере (например, mod_rewrite). Однако некоторые из перенаправлений, которые мне нужно проверить, обрабатываются поставщиком DNS (я не контролирую это, но думаю, что это NetNames).

Если я тестирую редирект с помощью wget, он выглядит нормально

$ wget --max-redirect=0 http://example1.com/
Resolving example1.com... A.B.C.D
Connecting to example1.com|A.B.C.D|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: https://example2.com/some/path?foo=bar [following]
0 redirections exceeded.

Однако, когда я выкидываю ответ из моего теста, заголовки

Date: Thu, 06 Sep 2018 15:37:47 GMT
Content-Length: 94
X-Powered-By: Servlet/2.4 JSP/2.0

и ответ

<head>
<title></title>
<meta name="revised" content="1.1.7">
</head>
<body></body>

с кодом состояния 200.

Нужно ли явно устанавливать заголовок запроса? Я пытался

$session->setRequestHeader('Host', 'example1.com');

но это не помогло.

Что может вызвать это?

1 Ответ

0 голосов
/ 17 сентября 2018

Это оказалось странной ситуацией с заголовком Host, я думаю, на принимающей стороне.

В моем тестовом провайдере было несколько имен хостов с заглавными буквами, например, "http://Example1.com/". Мне пришлось обновить функцию теста, чтобы она была

public function testRedirect($from, $to) {
  $parts = parse_url($from);
  $host = strtolower($parts['host']);

  $session = $this->getSession();
  $session->setRequestHeader('Host', $host);
  $session->visit($from);

  $this->assertEquals(200, $session->getDriver()->getStatusCode(), sprintf('Final destination from %s was a 200', $to));
  $this->assertEquals($to, $session->getCurrentUrl(), sprintf('Redirected from %s to %s', $from, $to));
}

чтобы заголовок хоста был в нижнем регистре.

...