request.class.php 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <?php
  2. namespace Juju\Http;
  3. require_once('uri.class.php');
  4. class Request {
  5. private $verb;
  6. private $url;
  7. private $headers;
  8. private $body;
  9. public function __construct($verb, $url, array $headers = [], string $body = ''){
  10. if(is_string($url) || is_array($url)){
  11. $this->url = new Uri($url);
  12. }elseif($url instanceof Uri){
  13. $this->url = $url;
  14. }else{
  15. throw new \Exception("Invalid url {$url}");
  16. }
  17. if(is_array($headers)){
  18. $this->headers = $headers;
  19. }else{
  20. $this->headers = [];
  21. }
  22. $this->verb = $verb;
  23. $this->body = $body;
  24. }
  25. public function __get($name){
  26. switch($name){
  27. case 'headers':case 'url':case 'body':case 'verb':
  28. return $this->$name;
  29. break;
  30. case 'locale':
  31. return \Locale::acceptFromHttp($this->header('Accept-Language'));
  32. break;
  33. }
  34. }
  35. public function header($name){
  36. return $this->headers[$name] ?? null;
  37. }
  38. public function text(){
  39. return $this->body;
  40. }
  41. public function json(bool $assoc = true){
  42. return json_decode($this->body, $assoc);
  43. }
  44. public function xml(string $classname = 'SimpleXMLElement', int $options, string $ns = '', bool $is_prefix = false){
  45. return simplexml_load_string($this->body, $classname, $options, $ns, $is_prefix);
  46. }
  47. public function msgpack(){
  48. if(!extension_loaded("msgpack")){
  49. throw new \Exception("Unable to load msgpack extension");
  50. }
  51. return msgpack_unpack($this->body);
  52. }
  53. public static function get_url(){
  54. if(isset($_SERVER['REDIRECT_URL'])){
  55. $url = 'REDIRECT_URL';
  56. }else{
  57. $url = 'REQUEST_URI';
  58. }
  59. if(!empty($_SERVER['HTTP_X_FORWARDED_PROTO'])){
  60. $root = $_SERVER['HTTP_X_FORWARDED_PROTO'].'://';
  61. }else{
  62. $root = !empty($_SERVER['HTTPS']) ? "https://" : "http://";
  63. }
  64. // @todo - determine if http or http and also check cloudflare
  65. return parse_url($root.$_SERVER['HTTP_HOST'].$_SERVER[$url]);
  66. }
  67. public static function get_headers(){
  68. return getallheaders();
  69. }
  70. public static function get_body(){
  71. return file_get_contents( 'php://input','r');
  72. }
  73. public static function get_verb(){
  74. return $_SERVER['REQUEST_METHOD'];
  75. }
  76. public static function get_locale(){
  77. Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
  78. }
  79. }
  80. ?>