web/lib/Zend/Http/Response/Stream.php
changeset 64 162c1de6545a
parent 19 1c2f13fd785c
child 68 ecaf28ffe26e
equal deleted inserted replaced
63:5b37998e522e 64:162c1de6545a
       
     1 <?php
       
     2 
       
     3 /**
       
     4  * Zend Framework
       
     5  *
       
     6  * LICENSE
       
     7  *
       
     8  * This source file is subject to the new BSD license that is bundled
       
     9  * with this package in the file LICENSE.txt.
       
    10  * It is also available through the world-wide-web at this URL:
       
    11  * http://framework.zend.com/license/new-bsd
       
    12  * If you did not receive a copy of the license and are unable to
       
    13  * obtain it through the world-wide-web, please send an email
       
    14  * to license@zend.com so we can send you a copy immediately.
       
    15  *
       
    16  * @category   Zend
       
    17  * @package    Zend_Http
       
    18  * @subpackage Response
       
    19  * @version    $Id: Stream.php 20785 2010-01-31 09:43:03Z mikaelkael $
       
    20  * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
       
    21  * @license    http://framework.zend.com/license/new-bsd     New BSD License
       
    22  */
       
    23 
       
    24 /**
       
    25  * Zend_Http_Response represents an HTTP 1.0 / 1.1 response message. It
       
    26  * includes easy access to all the response's different elemts, as well as some
       
    27  * convenience methods for parsing and validating HTTP responses.
       
    28  *
       
    29  * @package    Zend_Http
       
    30  * @subpackage Response
       
    31  * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
       
    32  * @license    http://framework.zend.com/license/new-bsd     New BSD License
       
    33  */
       
    34 class Zend_Http_Response_Stream extends Zend_Http_Response
       
    35 {
       
    36     /**
       
    37      * Response as stream
       
    38      *
       
    39      * @var resource
       
    40      */
       
    41     protected $stream;
       
    42 
       
    43     /**
       
    44      * The name of the file containing the stream
       
    45      *
       
    46      * Will be empty if stream is not file-based.
       
    47      *
       
    48      * @var string
       
    49      */
       
    50     protected $stream_name;
       
    51 
       
    52     /**
       
    53      * Should we clean up the stream file when this response is closed?
       
    54      *
       
    55      * @var boolean
       
    56      */
       
    57     protected $_cleanup;
       
    58 
       
    59     /**
       
    60      * Get the response as stream
       
    61      *
       
    62      * @return resourse
       
    63      */
       
    64     public function getStream()
       
    65     {
       
    66         return $this->stream;
       
    67     }
       
    68 
       
    69     /**
       
    70      * Set the response stream
       
    71      *
       
    72      * @param resourse $stream
       
    73      * @return Zend_Http_Response_Stream
       
    74      */
       
    75     public function setStream($stream)
       
    76     {
       
    77         $this->stream = $stream;
       
    78         return $this;
       
    79     }
       
    80 
       
    81     /**
       
    82      * Get the cleanup trigger
       
    83      *
       
    84      * @return boolean
       
    85      */
       
    86     public function getCleanup() {
       
    87         return $this->_cleanup;
       
    88     }
       
    89 
       
    90     /**
       
    91      * Set the cleanup trigger
       
    92      *
       
    93      * @param $cleanup Set cleanup trigger
       
    94      */
       
    95     public function setCleanup($cleanup = true) {
       
    96         $this->_cleanup = $cleanup;
       
    97     }
       
    98 
       
    99     /**
       
   100      * Get file name associated with the stream
       
   101      *
       
   102      * @return string
       
   103      */
       
   104     public function getStreamName() {
       
   105         return $this->stream_name;
       
   106     }
       
   107 
       
   108     /**
       
   109      * Set file name associated with the stream
       
   110      *
       
   111      * @param string $stream_name Name to set
       
   112      * @return Zend_Http_Response_Stream
       
   113      */
       
   114     public function setStreamName($stream_name) {
       
   115         $this->stream_name = $stream_name;
       
   116         return $this;
       
   117     }
       
   118 
       
   119 
       
   120     /**
       
   121      * HTTP response constructor
       
   122      *
       
   123      * In most cases, you would use Zend_Http_Response::fromString to parse an HTTP
       
   124      * response string and create a new Zend_Http_Response object.
       
   125      *
       
   126      * NOTE: The constructor no longer accepts nulls or empty values for the code and
       
   127      * headers and will throw an exception if the passed values do not form a valid HTTP
       
   128      * responses.
       
   129      *
       
   130      * If no message is passed, the message will be guessed according to the response code.
       
   131      *
       
   132      * @param int $code Response code (200, 404, ...)
       
   133      * @param array $headers Headers array
       
   134      * @param string $body Response body
       
   135      * @param string $version HTTP version
       
   136      * @param string $message Response code as text
       
   137      * @throws Zend_Http_Exception
       
   138      */
       
   139     public function __construct($code, $headers, $body = null, $version = '1.1', $message = null)
       
   140     {
       
   141 
       
   142         if(is_resource($body)) {
       
   143             $this->setStream($body);
       
   144             $body = '';
       
   145         }
       
   146         parent::__construct($code, $headers, $body, $version, $message);
       
   147     }
       
   148 
       
   149     /**
       
   150      * Create a new Zend_Http_Response_Stream object from a string
       
   151      *
       
   152      * @param string $response_str
       
   153      * @param resource $stream
       
   154      * @return Zend_Http_Response_Stream
       
   155      */
       
   156     public static function fromStream($response_str, $stream)
       
   157     {
       
   158         $code    = self::extractCode($response_str);
       
   159         $headers = self::extractHeaders($response_str);
       
   160         $version = self::extractVersion($response_str);
       
   161         $message = self::extractMessage($response_str);
       
   162 
       
   163         return new self($code, $headers, $stream, $version, $message);
       
   164     }
       
   165 
       
   166     /**
       
   167      * Get the response body as string
       
   168      *
       
   169      * This method returns the body of the HTTP response (the content), as it
       
   170      * should be in it's readable version - that is, after decoding it (if it
       
   171      * was decoded), deflating it (if it was gzip compressed), etc.
       
   172      *
       
   173      * If you want to get the raw body (as transfered on wire) use
       
   174      * $this->getRawBody() instead.
       
   175      *
       
   176      * @return string
       
   177      */
       
   178     public function getBody()
       
   179     {
       
   180         if($this->stream != null) {
       
   181             $this->readStream();
       
   182         }
       
   183         return parent::getBody();
       
   184     }
       
   185 
       
   186     /**
       
   187      * Get the raw response body (as transfered "on wire") as string
       
   188      *
       
   189      * If the body is encoded (with Transfer-Encoding, not content-encoding -
       
   190      * IE "chunked" body), gzip compressed, etc. it will not be decoded.
       
   191      *
       
   192      * @return string
       
   193      */
       
   194     public function getRawBody()
       
   195     {
       
   196         if($this->stream) {
       
   197             $this->readStream();
       
   198         }
       
   199         return $this->body;
       
   200     }
       
   201 
       
   202     /**
       
   203      * Read stream content and return it as string
       
   204      *
       
   205      * Function reads the remainder of the body from the stream and closes the stream.
       
   206      *
       
   207      * @return string
       
   208      */
       
   209     protected function readStream()
       
   210     {
       
   211         if(!is_resource($this->stream)) {
       
   212             return '';
       
   213         }
       
   214 
       
   215         if(isset($headers['content-length'])) {
       
   216             $this->body = stream_get_contents($this->stream, $headers['content-length']);
       
   217         } else {
       
   218             $this->body = stream_get_contents($this->stream);
       
   219         }
       
   220         fclose($this->stream);
       
   221         $this->stream = null;
       
   222     }
       
   223 
       
   224     public function __destruct()
       
   225     {
       
   226         if(is_resource($this->stream)) {
       
   227             fclose($this->stream);
       
   228             $this->stream = null;
       
   229         }
       
   230         if($this->_cleanup) {
       
   231             @unlink($this->stream_name);
       
   232         }
       
   233     }
       
   234 
       
   235 }