/** * create a request instance from the current user request * @return \vakata\http\Request the instance * @codeCoverageIgnore */ public static function fromRequest() { $req = new self(); $http = explode('/', isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1'); if (isset($http[1])) { $req->setProtocolVersion($http[1]); } $req->setMethod(strtoupper(isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET')); $req->setUrl(Url::fromRequest()); $headers = []; if (function_exists('apache_request_headers')) { $headers = apache_request_headers(); } foreach ($_SERVER as $key => $val) { if (strncmp($key, 'HTTP_', 5) === 0) { $headers[$key] = $val; } } if (isset($_SERVER['CONTENT_TYPE'])) { $headers['CONTENT_TYPE'] = $_SERVER['CONTENT_TYPE']; } if (isset($_SERVER['CONTENT_LENGTH'])) { $headers['CONTENT_LENGTH'] = $_SERVER['CONTENT_LENGTH']; } foreach ($headers as $key => $value) { $req->setHeader($key, $value); } if (strpos(strtolower($req->getHeader('Content-Type')), 'multipart/') === 0) { $req->setBody(http_build_query($_POST)); } else { $req->setBody(file_get_contents('php://input')); } if (isset($_FILES) && count($_FILES)) { foreach (array_keys($_FILES) as $k) { $req->addUpload($k, Upload::fromRequest($k)); } } // determine sender IP $ip = '0'; // TODO: check if remote_addr is a cloudflare one and only then read the connecting ip // https://www.cloudflare.com/ips-v4 // https://www.cloudflare.com/ips-v6 if (false && isset($_SERVER["HTTP_CF_CONNECTING_IP"])) { $ip = $_SERVER["HTTP_CF_CONNECTING_IP"]; } elseif (isset($_SERVER['REMOTE_ADDR']) && isset($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (isset($_SERVER['REMOTE_ADDR'])) { $ip = $_SERVER['REMOTE_ADDR']; } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; } if (strpos($ip, ',') !== false) { $ip = @end(explode(',', $ip)); } $ip = trim($ip); if (false === ($ip = filter_var($ip, FILTER_VALIDATE_IP))) { $ip = '0'; } $req->setSenderIP($ip); $req->setSenderPort((int) $_SERVER['REMOTE_PORT']); return $req; }