<?php
final class Request {
    public $get = array();
    public $post = array();
    public $cookie = array();
    public $files = array();
    public $server = array();
    public $method;

    public function __construct() {
        $_GET = $this->clean($_GET);
        $_POST = $this->clean($_POST);
        $_REQUEST = $this->clean($_REQUEST);
        $_COOKIE = $this->clean($_COOKIE);
        $_FILES = $this->clean($_FILES);
        $_SERVER = $this->clean($_SERVER);

        $this->get = $_GET;
        $this->post = $_POST;
        $this->request = $_REQUEST;
        $this->cookie = $_COOKIE;
        $this->files = $_FILES;
        $this->server = $_SERVER;
        $this->method = (isset($this->server['REQUEST_METHOD'])) ? $this->clean($this->server['REQUEST_METHOD']) : false;
    }

    public function clean($data) {
        if (is_array($data)) {
            foreach ($data as $key => $value) {
                unset($data[$key]);

                $data[$this->clean($key)] = $this->clean($value);
            }
        } else {
            $data = htmlspecialchars($data, ENT_COMPAT);
        }

        return $data;
    }

    public function isPOST() {
        return $this->is('POST');
    }
    public function isGET() {
        return $this->is('GET');
    }
    public function isHEAD() {
        return $this->is('HEAD');
    }
    public function isPUT() {
        return $this->is('PUT');
    }
    public function isDELETE() {
        return $this->is('DELETE');
    }
    public function isCONNECT() {
        return $this->is('CONNECT') ;
    }
    public function isOPTIONS() {
        return $this->is('OPTIONS') ;
    }
    public function isTRACE() {
        return $this->is('TRACE');
    }
    public function isPATCH() {
        return $this->is('PATCH');
    }
    public function is($method){
        return ($this->method == $method) ? true : false;
    }
}