236 Zeilen
6,2 KiB
PHP
236 Zeilen
6,2 KiB
PHP
|
<?php
|
||
|
|
||
|
/**
|
||
|
* Zend Framework
|
||
|
*
|
||
|
* LICENSE
|
||
|
*
|
||
|
* This source file is subject to the new BSD license that is bundled
|
||
|
* with this package in the file LICENSE.txt.
|
||
|
* It is also available through the world-wide-web at this URL:
|
||
|
* http://framework.zend.com/license/new-bsd
|
||
|
* If you did not receive a copy of the license and are unable to
|
||
|
* obtain it through the world-wide-web, please send an email
|
||
|
* to license@zend.com so we can send you a copy immediately.
|
||
|
*
|
||
|
* @category Zend
|
||
|
* @package Zend_Http
|
||
|
* @subpackage Response
|
||
|
* @version $Id$
|
||
|
* @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
|
||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Zend_Http_Response represents an HTTP 1.0 / 1.1 response message. It
|
||
|
* includes easy access to all the response's different elemts, as well as some
|
||
|
* convenience methods for parsing and validating HTTP responses.
|
||
|
*
|
||
|
* @package Zend_Http
|
||
|
* @subpackage Response
|
||
|
* @copyright Copyright (c) 2005-2011 Zend Technologies USA Inc. (http://www.zend.com)
|
||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||
|
*/
|
||
|
class Zend_Http_Response_Stream extends Zend_Http_Response
|
||
|
{
|
||
|
/**
|
||
|
* Response as stream
|
||
|
*
|
||
|
* @var resource
|
||
|
*/
|
||
|
protected $stream;
|
||
|
|
||
|
/**
|
||
|
* The name of the file containing the stream
|
||
|
*
|
||
|
* Will be empty if stream is not file-based.
|
||
|
*
|
||
|
* @var string
|
||
|
*/
|
||
|
protected $stream_name;
|
||
|
|
||
|
/**
|
||
|
* Should we clean up the stream file when this response is closed?
|
||
|
*
|
||
|
* @var boolean
|
||
|
*/
|
||
|
protected $_cleanup;
|
||
|
|
||
|
/**
|
||
|
* Get the response as stream
|
||
|
*
|
||
|
* @return resourse
|
||
|
*/
|
||
|
public function getStream()
|
||
|
{
|
||
|
return $this->stream;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the response stream
|
||
|
*
|
||
|
* @param resourse $stream
|
||
|
* @return Zend_Http_Response_Stream
|
||
|
*/
|
||
|
public function setStream($stream)
|
||
|
{
|
||
|
$this->stream = $stream;
|
||
|
return $this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the cleanup trigger
|
||
|
*
|
||
|
* @return boolean
|
||
|
*/
|
||
|
public function getCleanup() {
|
||
|
return $this->_cleanup;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the cleanup trigger
|
||
|
*
|
||
|
* @param bool $cleanup Set cleanup trigger
|
||
|
*/
|
||
|
public function setCleanup($cleanup = true) {
|
||
|
$this->_cleanup = $cleanup;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get file name associated with the stream
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function getStreamName() {
|
||
|
return $this->stream_name;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set file name associated with the stream
|
||
|
*
|
||
|
* @param string $stream_name Name to set
|
||
|
* @return Zend_Http_Response_Stream
|
||
|
*/
|
||
|
public function setStreamName($stream_name) {
|
||
|
$this->stream_name = $stream_name;
|
||
|
return $this;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* HTTP response constructor
|
||
|
*
|
||
|
* In most cases, you would use Zend_Http_Response::fromString to parse an HTTP
|
||
|
* response string and create a new Zend_Http_Response object.
|
||
|
*
|
||
|
* NOTE: The constructor no longer accepts nulls or empty values for the code and
|
||
|
* headers and will throw an exception if the passed values do not form a valid HTTP
|
||
|
* responses.
|
||
|
*
|
||
|
* If no message is passed, the message will be guessed according to the response code.
|
||
|
*
|
||
|
* @param int $code Response code (200, 404, ...)
|
||
|
* @param array $headers Headers array
|
||
|
* @param string $body Response body
|
||
|
* @param string $version HTTP version
|
||
|
* @param string $message Response code as text
|
||
|
* @throws Zend_Http_Exception
|
||
|
*/
|
||
|
public function __construct($code, $headers, $body = null, $version = '1.1', $message = null)
|
||
|
{
|
||
|
|
||
|
if(is_resource($body)) {
|
||
|
$this->setStream($body);
|
||
|
$body = '';
|
||
|
}
|
||
|
parent::__construct($code, $headers, $body, $version, $message);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Create a new Zend_Http_Response_Stream object from a string
|
||
|
*
|
||
|
* @param string $response_str
|
||
|
* @param resource $stream
|
||
|
* @return Zend_Http_Response_Stream
|
||
|
*/
|
||
|
public static function fromStream($response_str, $stream)
|
||
|
{
|
||
|
$code = self::extractCode($response_str);
|
||
|
$headers = self::extractHeaders($response_str);
|
||
|
$version = self::extractVersion($response_str);
|
||
|
$message = self::extractMessage($response_str);
|
||
|
|
||
|
return new self($code, $headers, $stream, $version, $message);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the response body as string
|
||
|
*
|
||
|
* This method returns the body of the HTTP response (the content), as it
|
||
|
* should be in it's readable version - that is, after decoding it (if it
|
||
|
* was decoded), deflating it (if it was gzip compressed), etc.
|
||
|
*
|
||
|
* If you want to get the raw body (as transfered on wire) use
|
||
|
* $this->getRawBody() instead.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function getBody()
|
||
|
{
|
||
|
if($this->stream != null) {
|
||
|
$this->readStream();
|
||
|
}
|
||
|
return parent::getBody();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the raw response body (as transfered "on wire") as string
|
||
|
*
|
||
|
* If the body is encoded (with Transfer-Encoding, not content-encoding -
|
||
|
* IE "chunked" body), gzip compressed, etc. it will not be decoded.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public function getRawBody()
|
||
|
{
|
||
|
if($this->stream) {
|
||
|
$this->readStream();
|
||
|
}
|
||
|
return $this->body;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Read stream content and return it as string
|
||
|
*
|
||
|
* Function reads the remainder of the body from the stream and closes the stream.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
protected function readStream()
|
||
|
{
|
||
|
if(!is_resource($this->stream)) {
|
||
|
return '';
|
||
|
}
|
||
|
|
||
|
if(isset($headers['content-length'])) {
|
||
|
$this->body = stream_get_contents($this->stream, $headers['content-length']);
|
||
|
} else {
|
||
|
$this->body = stream_get_contents($this->stream);
|
||
|
}
|
||
|
fclose($this->stream);
|
||
|
$this->stream = null;
|
||
|
}
|
||
|
|
||
|
public function __destruct()
|
||
|
{
|
||
|
if(is_resource($this->stream)) {
|
||
|
fclose($this->stream);
|
||
|
$this->stream = null;
|
||
|
}
|
||
|
if($this->_cleanup) {
|
||
|
@unlink($this->stream_name);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|