|
|
- <?php
- namespace 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
- );
- }
-
- }
|