Example #1
0
 /**
  * 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;
 }