|                                                                 |  | <?phpnamespace p3k;
class HTTPTest extends HTTPCurl {
  private $_testDataPath;  private $_redirects_remaining;
  public function __construct($testDataPath) {    $this->_testDataPath = $testDataPath;  }
  public function get($url, $headers=[]) {    $this->_redirects_remaining = $this->max_redirects;    $parts = parse_url($url);    unset($parts['fragment']);    $url = \build_url($parts);    return $this->_read_file($url);  }
  public function post($url, $body, $headers=[]) {    return $this->_read_file($url);  }
  public function head($url) {    $response = $this->_read_file($url);    return array(      'code' => $response['code'],      'headers' => $response['headers'],      'error' => '',      'error_description' => '',      'url' => $response['url']    );  }
  private function _read_file($url) {    $parts = parse_url($url);    if($parts['path']) {      $parts['path'] = '/'.str_replace('/','_',substr($parts['path'],1));      $url = \build_url($parts);    }
    $filename = $this->_testDataPath.preg_replace('/https?:\/\//', '', $url);    if(!file_exists($filename)) {      $filename = $this->_testDataPath.'404.response.txt';    }    $response = file_get_contents($filename);
    $split = explode("\r\n\r\n", $response);    if(count($split) < 2) {      throw new \Exception("Invalid file contents in test data, check that newlines are CRLF: $url");    }    $headers = array_shift($split);    $body = implode("\r\n", $split);
    if(preg_match('/HTTP\/1\.1 (\d+)/', $headers, $match)) {      $code = $match[1];    }
    $headers = preg_replace('/HTTP\/1\.1 \d+ .+/', '', $headers);    $parsedHeaders = self::parse_headers($headers);
    if(array_key_exists('Location', $parsedHeaders)) {      $effectiveUrl = \mf2\resolveUrl($url, $parsedHeaders['Location']);      if($this->_redirects_remaining > 0) {        $this->_redirects_remaining--;        return $this->_read_file($effectiveUrl);      } else {        return [          'code' => 0,          'headers' => $parsedHeaders,          'body' => $body,          'error' => 'too_many_redirects',          'error_description' => '',          'url' => $effectiveUrl        ];      }    } else {      $effectiveUrl = $url;    }
    return array(      'code' => $code,      'headers' => $parsedHeaders,      'body' => $body,      'error' => (isset($parsedHeaders['X-Test-Error']) ? $parsedHeaders['X-Test-Error'] : ''),      'error_description' => '',      'url' => $effectiveUrl    );  }
}
 |