2014-05-03 12 views
6

Szukam sposobu na uzyskanie, używając natywnego PHP, surowego żądania HTTP otrzymanego przez mój skrypt, w tym nagłówków i treści. Czytanie dokumentacji PHP Nie mogę znaleźć standardowego sposobu uzyskania surowego żądania, bez względu na zastosowaną metodę HTTP.Uzyskaj surową prośbę za pomocą PHP

Na przykład, gdy strona żąda test.php, chcę, aby uzyskać kompletny wniosek jak:

GET /test.php HTTP/1.1 
Host:.... 
.... 
.... 

To samo w przypadku testu POST, głowa, etc ...

Seems bardzo dziwne, że nie istnieje metoda dostępu do bufora żądania surowego!

Odpowiedz

10

Przeglądanie podręcznika nie wydaje się być niezabezpieczonym, surowym dostępem do żądania dopasowania do tego, co chcesz, więc podejrzewam, że będziesz musiał ponownie zbudować, co chcesz, ze zmiennych $_SERVER. Szybkie wyszukiwanie Znalazłem tę klasę, dokonałem niewielkiej zmiany, aby uzyskać GET/HTTP/1.1, może znajdziesz to, co odpowiada Twoim potrzebom.

<?php 
/** 
* Access the HTTP Request 
* 
* Found on http://www.daniweb.com/web-development/php/code/216846/get-http-request-headers-and-body 
*/ 
class http_request { 

    /** additional HTTP headers not prefixed with HTTP_ in $_SERVER superglobal */ 
    public $add_headers = array('CONTENT_TYPE', 'CONTENT_LENGTH'); 

    /** 
    * Construtor 
    * Retrieve HTTP Body 
    * @param Array Additional Headers to retrieve 
    */ 
    function http_request($add_headers = false) { 

     $this->retrieve_headers($add_headers); 
     $this->body = @file_get_contents('php://input'); 
    } 

    /** 
    * Retrieve the HTTP request headers from the $_SERVER superglobal 
    * @param Array Additional Headers to retrieve 
    */ 
    function retrieve_headers($add_headers = false) { 

     if ($add_headers) { 
      $this->add_headers = array_merge($this->add_headers, $add_headers); 
     } 

     if (isset($_SERVER['HTTP_METHOD'])) { 
      $this->method = $_SERVER['HTTP_METHOD']; 
      unset($_SERVER['HTTP_METHOD']); 
     } else { 
      $this->method = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : false; 
     } 
     $this->protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : false; 
     $this->request_method = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : false; 

     $this->headers = array(); 
     foreach($_SERVER as $i=>$val) { 
      if (strpos($i, 'HTTP_') === 0 || in_array($i, $this->add_headers)) { 
       $name = str_replace(array('HTTP_', '_'), array('', '-'), $i); 
       $this->headers[$name] = $val; 
      } 
     } 
    } 

    /** 
    * Retrieve HTTP Method 
    */ 
    function method() { 
     return $this->method; 
    } 

    /** 
    * Retrieve HTTP Body 
    */ 
    function body() { 
     return $this->body; 
    } 

    /** 
    * Retrieve an HTTP Header 
    * @param string Case-Insensitive HTTP Header Name (eg: "User-Agent") 
    */ 
    function header($name) { 
     $name = strtoupper($name); 
     return isset($this->headers[$name]) ? $this->headers[$name] : false; 
    } 

    /** 
    * Retrieve all HTTP Headers 
    * @return array HTTP Headers 
    */ 
    function headers() { 
     return $this->headers; 
    } 

    /** 
    * Return Raw HTTP Request (note: This is incomplete) 
    * @param bool ReBuild the Raw HTTP Request 
    */ 
    function raw($refresh = false) { 
     if (isset($this->raw) && !$refresh) { 
      return $this->raw; // return cached 
     } 
     $headers = $this->headers(); 
     $this->raw = "{$this->method} {$_SERVER['REQUEST_URI']} {$this->protocol}\r\n"; 

     foreach($headers as $i=>$header) { 
       $this->raw .= "$i: $header\r\n"; 
     } 
     $this->raw .= "\r\n{$this->body}"; 
     return $this->raw; 
    } 

} 

/** 
* Example Usage 
* Echos the HTTP Request back to the client/browser 
*/ 
$http_request = new http_request(); 

$resp = $http_request->raw(); 

echo nl2br($resp); 
/* Result (less <br> tags) 
    GET/HTTP/1.1 
    HOST: localhost:8080 
    USER-AGENT: Mozilla/5.0 ... 
    ACCEPT: text/html,application/xhtml+xml,application/xml;... 
    ACCEPT-LANGUAGE: en-US,en;q=0.5 
    ACCEPT-ENCODING: gzip, deflate 
    DNT: 1 
    COOKIE: PHPSESSID=... 
    CONNECTION: keep-alive 
*/ 
?> 

P.S: Nie zapomnij htmlentities() ich wartości na wyjściu :)

+0

NP, ja też prana ręcznego nieugięty musi być coś z prośbą surowego zbyt ale nie oprócz PECL [HttpResponce ] (http://www.php.net/manual/en/class.httpresponse.php) lub [HttpMessage] (http://www.php.net/manual/en/class.httpmessage.php) klasy, ale potem Nadal nie sądzę, że spełnia on twoje wymagania, prawdopodobnie dlatego, że wszystkie wartości są przetwarzane i udostępniane dla '$ _SERVER', co jest generalnie sposobem na dostęp do nich. –

+3

To tak naprawdę nie działa idealnie. Jest to konwersja stratna, niektóre szczegóły, takie jak białe znaki i obudowa, nie są zachowywane. – Pacerier

+3

Wiele nagłówków o tej samej nazwie jest kolejnym obszarem, w którym traci informacje z pierwotnego żądania. –

3

Żądanie surowy nie jest dostępny dla PHP, ponieważ prośba została już skonsumowana przez czas startu PHP.

Gdy PHP działa jako moduł Apache (mod_php), na przykład, żądanie jest odbierane i analizowane przez Apache, a PHP jest wywoływane tylko wtedy, gdy Apache przeanalizuje to żądanie i określi, że odnosi się do pliku, który powinien być przetwarzane przez PHP. Jeśli PHP działa jako program obsługi CGI lub FastCGI, w ogóle nie otrzymuje żądania HTTP - widzi tylko formularz CGI żądania, który jest całkiem inny.

+0

W dalszym ciągu PHP musi prosić Apache o surowe żądanie. – Pacerier

+0

@Pacerier Nie, przepraszam; to nie jest możliwe. Apache nie przechowuje surowego żądania HTTP w dowolnym miejscu, ponieważ nie jest przyzwyczajony do niczego innego. (W rzeczywistości Apache może wewnętrznie obsłużyć subskrypcję, w takim przypadku nie ma żadnego surowego żądania). – duskwuff

0

Jeśli jesteś na maszynie Apache spróbuj tego:

function get_raw_http_request() { 

    $request = "{$_SERVER['REQUEST_METHOD']} {$_SERVER['REQUEST_URI']} {$_SERVER['SERVER_PROTOCOL']}\r\n"; 

    foreach (getallheaders() as $name => $value) { 
    $request .= "$name: $value\r\n"; 
    } 

    $request .= "\r\n" . file_get_contents('php://input'); 

    return $request; 
} 

http://php.net/manual/en/function.getallheaders.php

Powiązane problemy