$_SERVER['PHP_AUTH_USER'], 'password' => $_SERVER['PHP_AUTH_PW'], )); exit; } elseif ($test == 'http_digest_auth') { $users = array( 'myusername' => 'mypassword', ); $realm = 'Restricted area'; $qop = 'auth'; $nonce = md5(uniqid()); $opaque = md5(uniqid()); if (empty($_SERVER['PHP_AUTH_DIGEST'])) { header('HTTP/1.1 401 Unauthorized'); header(sprintf( 'WWW-Authenticate: Digest realm="%s", qop="%s", nonce="%s", opaque="%s"', $realm, $qop, $nonce, $opaque)); echo 'canceled'; exit; } $data = array( 'nonce' => '', 'nc' => '', 'cnonce' => '', 'qop' => '', 'username' => '', 'uri' => '', 'response' => '', ); preg_match_all('@(' . implode('|', array_keys($data)) . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@', $_SERVER['PHP_AUTH_DIGEST'], $matches, PREG_SET_ORDER); foreach ($matches as $match) { $data[$match['1']] = $match['3'] ? $match['3'] : $match['4']; } $A1 = md5($data['username'] . ':' . $realm . ':' . $users[$data['username']]); $A2 = md5($_SERVER['REQUEST_METHOD'] . ':' . $data['uri']); $valid_response = md5( $A1 . ':' . $data['nonce'] . ':' . $data['nc'] . ':' . $data['cnonce'] . ':' . $data['qop'] . ':' . $A2); if (!($data['response'] === $valid_response)) { header('HTTP/1.1 401 Unauthorized'); echo 'invalid'; exit; } echo 'valid'; exit; } elseif ($test === 'get') { echo http_build_query($_GET); exit; } elseif ($test === 'post') { echo http_build_query($_POST); exit; } elseif ($test === 'post_json') { echo $http_raw_post_data; exit; } elseif ($test === 'put') { echo $http_raw_post_data; exit; } elseif ($test === 'post_multidimensional') { echo $http_raw_post_data; exit; } elseif ($test === 'post_file_path_upload') { echo Helper\mime_type($_FILES[$key]['tmp_name']); exit; } elseif ($test === 'put_file_handle') { $tmp_filename = tempnam('/tmp', 'php-curl-class.'); file_put_contents($tmp_filename, $http_raw_post_data); echo Helper\mime_type($tmp_filename); unlink($tmp_filename); exit; } elseif ($test === 'request_method') { header('X-REQUEST-METHOD: ' . $request_method); echo $request_method; exit; } elseif ($test === 'request_uri') { echo $_SERVER['REQUEST_URI']; exit; } elseif ($test === 'cookiejar') { setcookie('mycookie', 'yum'); exit; } elseif ($test === 'multiple_cookie') { setcookie('cookie1', 'scrumptious'); setcookie('cookie2', 'mouthwatering'); exit; } elseif ($test === 'response_header') { header('Content-Type: application/json'); header('ETag: ' . md5('worldpeace')); exit; } elseif ($test === 'response_body') { echo 'OK'; exit; } elseif ($test === 'json_response') { if ($request_method === 'POST') { $key = $_POST['key']; $value = $_POST['value']; header($key . ': ' . $value); } else { header('Content-Type: application/json'); } echo json_encode(array( 'null' => null, 'true' => true, 'false' => false, 'integer' => 1, 'float' => 3.14, 'empty' => '', 'string' => 'string', )); exit; } elseif ($test === 'xml_response') { $key = $_POST['key']; $value = $_POST['value']; header($key . ': ' . $value); $doc = new DOMDocument(); $doc->formatOutput = true; $rss = $doc->appendChild($doc->createElement('rss')); $rss->setAttribute('version', '2.0'); $channel = $doc->createElement('channel'); $title = $doc->createElement('title'); $title->appendChild($doc->createTextNode('Title')); $channel->appendChild($title); $link = $doc->createElement('link'); $link->appendChild($doc->createTextNode('Link')); $channel->appendChild($link); $description = $doc->createElement('description'); $description->appendChild($doc->createTextNode('Description')); $channel->appendChild($description); $rss->appendChild($channel); echo $doc->saveXML(); exit; } elseif ($test === 'upload_response') { $tmp_filename = tempnam('/tmp', 'php-curl-class.'); move_uploaded_file($_FILES['image']['tmp_name'], $tmp_filename); header('Content-Type: application/json'); header('ETag: ' . md5_file($tmp_filename)); echo json_encode(array( 'file_path' => $tmp_filename, )); exit; } elseif ($test === 'upload_cleanup') { $unsafe_file_path = $_POST['file_path']; echo var_export(unlink($unsafe_file_path), true); exit; } elseif ($test === 'download_response') { $unsafe_file_path = $_GET['file_path']; header('Content-Type: image/png'); header('Content-Disposition: attachment; filename="image.png"'); header('Content-Length: ' . filesize($unsafe_file_path)); header('ETag: ' . md5_file($unsafe_file_path)); readfile($unsafe_file_path); exit; } elseif ($test === 'timeout') { $unsafe_seconds = $_GET['seconds']; $start = time(); while (true) { echo '.'; ob_flush(); flush(); sleep(1); $elapsed = time() - $start; if ($elapsed >= $unsafe_seconds) { break; } } exit; } elseif ($test === 'error_message') { if (function_exists('http_response_code')) { http_response_code(401); } else { header('HTTP/1.1 401 Unauthorized'); } exit; } elseif ($test === 'redirect') { if (!isset($_GET['redirect'])) { header('Location: ?redirect'); exit; } echo 'OK'; exit; } elseif ($test === 'delete_with_body') { header('Content-Type: application/json'); echo json_encode(array( 'get' => $_GET, 'post' => $_POST, )); exit; } header('Content-Type: text/plain'); $data_mapping = array( 'cookie' => '_COOKIE', 'delete' => '_GET', 'get' => '_GET', 'patch' => '_PATCH', 'post' => '_POST', 'put' => '_PUT', 'server' => '_SERVER', ); if (!empty($test)) { $data = $$data_mapping[$test]; $value = isset($data[$key]) ? $data[$key] : ''; echo $value; }